У меня есть 3D-поверхность, созданная ListPlot3D в Mathematica. Сама поверхность относительно плоская и в произвольной плоскости xy. Я хотел бы поместить эту поверхность поверх молекулы, либо сгенерированной из функции ChemicalData, либо введенной из .pdb или другого входа молекулы. Эта молекула также плоская и помещена снова в плоскость xy. Я хотел бы, чтобы эти два 3D-объекта были разделены некоторым расстоянием по z.
Конечная надежда состоит в том, что у меня будет поверхность потенциальной энергии, расположенная над этой плоской молекулой, которая все еще будет вращаться в 3D. Я использовал параметры Show и Graphics 3D безуспешно. Точки x, y на поверхности соответствуют точкам 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.