我有一个由mathematica中的ListPlot3D创建的3D表面。表面本身是相对平面的并且在任意平面xy中。我想将这个表面放在分子的顶部,该分子是从ChemicalData函数生成的,或者是从.pdb或其他分子输入输入的。该分子也是平面的并且再次放置在xy平面中。我希望这两个3D对象分开一些z距离。
最终的希望是,我将在这个平面分子上面放置一个潜在的能量表面,它仍然可以在3D中旋转。我一直在使用Show和Graphics 3D选项没有成功。表面上的x,y点对应于3D分子上的x,y点,但是它们可以根据需要容易地缩放和移位。作为最后的选择,我想我可以输入原子的x,y,z坐标,并使用PointListPlot3D命令和各种选项来模仿分子的外观,但这似乎要复杂得多。
另一种可能的方法是将两个3D对象转换为3D框并简单地堆叠在一起。但是我还没有在mathematica中找到这个功能。有没有人对如何做到这一点有任何想法?
PES = ListPlot3D[{{0., 0., -2.04900365`},..., {0., 0.3, -2.05743098`}}]
Show[Graphics3D[ChemicalData["Benzene","MoleculePlot"]],PES]
问题在于分子的规模与能量表面的比例。
我能说的最好的单位是皮米。然而,它们的原子距离似乎偏差了3%。
作为对此的更新,采用分子的xyz坐标并手工生成对象变得更加简单。已经有一段时间但我相信如果你只说:
ChemicalData["Benzene","MoleculePlot"]
Mathematica将向您展示格式。如果你做了很多这样的事情,可以制作一个相当简单的python脚本。
答案 0 :(得分:9)
Szabolcs说了什么,我也没有从你的问题中得到为什么不会有这样的工作呢?
Show[Graphics3D[
Rotate[ChemicalData["Caffeine", "MoleculePlot"][[1]],
45 Degree, {1, .5, 0}]],
Plot3D[-200 + 50 Sin[x*y/10000], {x, -100 Sqrt[3*Pi],
100 Sqrt[3*Pi]}, {y, -100 Sqrt[3*Pi], 100 Sqrt[3*Pi]},
ColorFunction -> "TemperatureMap"], Axes -> True]
答案 1 :(得分:4)
ListPlot3D
会返回Graphics3D
个对象,因此您应该能够将其与其他Graphics3D
个对象合并...
lp = ListPlot3D[ RandomReal[{}, {50, 3}], Mesh -> None];
sp = Graphics3D[Sphere[]];
Show[sp, lp, Boxed -> False]
尽管获得相同大小的所有内容将是挑战......