.xyz是什么文件_在blender用脚本实现XYZ结构

aef238aaa1ca0571984796d74e954b8f.png

在Blender中可视化.xyz结构

无论是在纸上,在海报上还是在演讲中,我们研究的结构的视觉表示都是至关重要的。必须在影响和清晰度之间达成良好的平衡。视情况而定,必须在以清晰简洁的方式传达原子构型的表示形式之间做出选择。还有一个更吸引人,更醒目的视觉效果 但是在这两种情况下,最终的数字都应该尽可能令人赏心悦目。

有许多工具可以操纵,检查和渲染分子和原子结构。但是,与大多数工具一样,最好的工具是高度专业化的,可能无法单枪匹马地以理想的质量实现上述所有目标。今天,我们将使用Python在Blender中渲染原子的配置。


出于一个让我逃避的原因,许多科学家无视与科学传播有关的任何事情。有些人甚至对完全避免在视觉上或其他方面交流其科学的任何尝试感到有点反感。好像花费太多的精力使他们的图表易于理解,他们的人物有吸引力,他们的写作引人入胜以及他们的文章易于阅读,可能会以某种方式削弱或稀释基础科学。为什么是这样,这超出了我。但是,如果您参加了几次会议或阅读了几篇论文,您将会看到类似以下的数字:

b6e4084ffbb0a47d4cfea7ee1d6ea457.png凹凸不平的球体,低劣的塑料外观,默认的背景和照明,无用的轴周围漂浮,甚至最前沿的还有一些剪裁文物。一言以蔽之:丑陋。

以上试图表示的是在顶部具有羟基氧化铁纳米颗粒的氧化镍层。并准许使用适当的标题提供该信息。但是,渲染效果不佳-很难看。

我使用了VMD(可视分子动力学)来绘制图形。虽然我非常喜欢使用此应用程序,但在这里我使用了默认设置并直接呈现了用户的视图,这说明了最终结果的质量很低。但是,在实践中,我会尝试设置,灯光,颜色和材料,以使结构清晰,希望也能使旁观者满意:

cb3defee981c98f09e812d49ac0a3579.png在正交投影中查看的结构相同。明亮的背景,鲜艳的色彩和原子的轮廓使系统清晰易懂。

就个人而言,我更喜欢上述正交投影,因为我发现它比周期性透视图更好地传达周期性结构。但是,假设我们需要一个简短的会议演示图,或者将其作为出版物中的TOC图形来使用。这将在清晰度和视觉效果之间取得平衡,从而有利于后者。然后的任务是创建我们在有限的时间内允许的最具吸引力的表示形式。

如前所述,我们只能使用单个应用程序或程序。尽管VMD在检查结构和轨迹方面非常出色,但使用专用的渲染程序来渲染图形比我们要好得多。Cue Blender,一个免费且开放的3D渲染软件。

将Blender和Python连接

我们必须打开Blender并在其中使用Python脚本,而不是将某些Blender包导入Python并使用它在Python中渲染东西。有点相反,但这就是事实。

通过控制台/命令提示符启动Blender。这很重要,因为任何Python错误都只会在控制台中显示。打开一个新的Blender项目。通过单击主窗口的右上角并将其拖动到左侧来拆分视图。然后,单击新面板左下方的小立方体图标,然后选择“文本编辑器”。您应该看到一个空白的灰色文档:

483691e5f95508d2900468705a5167ed.png

您可以通过按新创建的面板底部同一水平条上的三个图标的最右边来打开语法突出显示。

接下来是import bpy,该软件包使您可以与Blender进行交互。如果您尚未注意到,将光标悬停在几乎所有内容上方,将会在中显示适当的Python函数,方法或模块bpy。现在,用alt + p!运行(空)脚本!

绘制.xyz结构

正如我们在径向分布函数中讨论的那样,.xyz文件格式是原子配置的人类可读表示。第一行包含原子数。第二个保留给评论,将被忽略;其余各行分别包含元素的符号和原子的笛卡尔坐标(以埃为单位)。我们将编写一个脚本,该脚本读取坐标并绘制一个以每个原子的位置为中心的球体。我们还将找到并绘制附近原子之间的键。

import bpy
import numpy as np
sizes = { 'Ni' : 0.7 , 'Fe' : 0.7 , 'O' : 0.5 , 'H' : 0.2 }
colors = { 'Ni' : ( 0.0 , 0.0 , 0.7 ), 'Fe' : ( 0.4 , 0.4 , 0.7 ),
'O' : ( 1.0 , 0.0 , 0.0 ), 'H' : ( 1.0 , 1.0 , 1.0 ),
'bond' : ( 0.05 , 0.05 , 0.05 ) }
for key in colors.keys():
bpy.data.materials.new(name = key)
bpy.data.materials[key].diffuse_color = colors[key]
bpy.data.materials[key].specular_intensity = 0.0
def distance(a, b):
return np.sqrt(np.dot(a - b, a - b))
def normalize(a):
return np.array(a) / np.sqrt(np.dot(a, a))

我们首先创建两个字典colors和sizes,分别定义代表每个元素的球的颜色(以RGB为单位)和大小(以埃为单位)。按照惯例,我选择红色代表氧气,白色代表氢气。镍将是深蓝色,铁将是一种钢灰色。接下来,我们为每个元素创建具有适当颜色的材料。我将镜面反射系数设为零,因为我的目标是使外观更具卡通色彩,沉闷,非光泽。在此过程中,我们定义了两个小函数:一个用于计算numpy数组表示的两个点的距离;另一个用于计算由数组表示的两个点的距离。另一个以相同的格式归一化向量。

接下来,我们将创建一个类来表示我们的结构。唯一的初始化参数将是我们要可视化的.xyz文件的路径:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值