欢迎光临散文网 会员登陆 & 注册

Houdini学习笔记033_金刚石与立方氮化硼

2022-09-21 11:18 作者:独孤嘌呤  | 我要投稿

学了快一个月的VEX,学到的函数基本都跟点线面相关,比如addpointaddprimnearpointsneighbours等等。会的函数越多,解决问题的思路也就越灵活。很多时候,两三句代码就能解决一个对你造成困扰的问题。

今天给大家分享的是金刚石和立方氮化硼的分子结构制作,两者的空间结构如下图所示。只不过金刚石结构中都是碳原子,而立方氮化硼中是氮和硼两种原子空间交错排列。

先来看简单一些的金刚石结构的创建方法。我的思路是先获取空间中的碳原子坐标,然后根据距离选择性连线。其实这个思路我很早以前就有了,但在3ds Max和C4D中一直都没找到合适的方法来实现,是Houdini给了我这种可能。

金刚石中的碳原子是按照四面体中心和顶点的方式排布的,这里可以从一个box出发,用isooffset节点生成体积。增加Uniform Sampling Divs的值让体积分布更加均匀一些。

然后用points from volume节点就可以得到立方体或四面体类型的点排布。Point Configuration设置为Tetrahedral,调节Point Separation的值改变相邻点之间的距离。现在得到的点可以看做是位于四面体的顶点。

为了便于控制,可以单独用一个null节点来设置参数(取名为CONTROLLER,方法笔记010中讲过)。定义一个参数如length,来控制Point Separation的值。

现在还需要四面体中心的点,可以再用一个points from volume节点,在Grid Offset的第二栏(y方向)设置偏移。根据四面体结构特征,计算出偏移值应为边长的sqrt(6)/4倍。即length*sqrt(6)*0.25。现在将两组点合并就得到了所有碳原子的点坐标。

现在相邻点之间的距离由原来的length变成了length*sqrt(6)*0.25,我们要根据这个距离来搜索点,使用的是nearpoints函数。创建一个point wrangle节点,设置最大距离后开始搜索邻近点。这里乘以0.26是保证能搜到邻近点。VEX代码如下:

由于是根据自身进行的搜索,每个点自己也会被作为自身的邻近点被搜索到,而且还要避免重复连线,一个巧妙的解决办法是用点编号来判断,只有当搜索到的邻近点编号大于自身时,才在两者之间连线,VEX代码为:

改变参数length的值,就可以得到如下图所示的结果。

然后就是用copy to points节点拷贝球体(作为碳原子),polywire节点将线转为圆柱。拷贝小球时可以将Pack and Instance勾选上,这样每个小球只会被看做一个点,可大大节省内存空间。

如果将A和B两组点分别看作是不同的原子,对于A组的点,在B组内搜索其邻近点。然后求两者的中点,创建一半连线。对于B组的点同样如此,就可以把原本邻近点之间的连线分为两半,添加不同的颜色。

分组搜索时,需要注意端口的连接,如下图所示——

VEX代码也要作出调整,如下所示:

另外一半把端口连接的位置对调一下,代码中的lineA改为lineB即可。

后面的步骤还是一样,分别创建球和圆柱得到分子的球棍模型,并分别添加颜色或材质。

改变初始几何体的尺寸和形状,就可以得到不同的造型。

本次分享到此结束,感谢大家的阅读,下回见~

Houdini学习笔记033_金刚石与立方氮化硼的评论 (共 条)

分享到微博请遵守国家法律