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

Houdini学习笔记010

2022-08-10 11:58 作者:独孤嘌呤  | 我要投稿

前几天公众号(3D科研绘图)后台有人问我二硫化钼器件的画法,其实主要就是MoS2分子结构的建模。在之前的3dsMax和C4D教程中我都出过(见微信公众号),也有比较适合用来程序化建模的方法,参考C4D科研模型100例【例52】。刚好最近在学习Houdini,于是就建了个参数化的MoS2器件模型。


在设置参数之前我们先要思考,最终的模型需要怎样调节。比如这里我希望随着基底长和宽的变化,二硫化钼层的大小可以随之自动调节。另外,两侧的电极宽度也会影响到二硫化钼分子的分布。为了简便起见,二硫化钼单元尺寸是固定不变的,原子和化学键只给了固定的值,没有额外添加调节的参数。最终可调节的参数只有底座的长(Length)、宽(Width)、高(Height),电极占整个长度的比例(Ratio)以及模型的倒角值(Round)。


这些参数可以在一个空白(Null)节点中添加,名称可改为“CONTROLLER”。点击设置中的“Edit Parameter Interface”选项,打开自定义参数设置窗口。


设置分三步,先在左边选择参数的数据类型,本例中均为浮点数据(Float);点击向右的箭头添加到参数列表中;最右侧设置参数的名称(Name)、标签(Label)以及其他信息如取值范围(Range)等。注意标签只是用于显示,调用参数时用的是参数名称。点击【Apply】按钮应用,确认后点击【Accept】按钮完成设置。


在创建过程中,每一步都需要考虑设置的参数是怎样影响场景中的对象的。在笔记004中我已经介绍过怎么让参数进行关联,除了复制粘贴的方法,如果你对Houdini的表达式很熟悉的话,也可以直接输入ch("../CONTROLLER/length")。这里的第一个点是返回上一级(obj),第二点是进入现在的层级(geo),斜杠后面跟的是节点名称,再后面是参数名称。还有一点要注意的是,Size的y值对应的是高度,z值对应的才是宽度。


关联之后就可以用CONTROLLER节点中的长、宽、高参数来控制box的尺寸了。这里为了让box底面始终位于地平面上,我又加了个transorm节点,将translate的y值表示为bbox表达式。这里的bbox跟Hip hop半点关系没有,而是bounding box的缩写,意为边界框。bbox("../box1",D_YMIN)就是box1模型在y方向上的坐标最小值,这里也就是box1高度的一半(负值),往上移动的话前面别忘了加个负号。当然,这一步你不移动也没问题。


那我是怎样知道bbox表达式的写法呢?一是看教程,二是利用软件的文本提示。比如我在输入“bbox(”后就弹出了如下提示。开头的float bbox (string, float)表示数据的类型,该表达式最终返回的是一个浮点数(float),括号里面需要有一个字符串(string)和一个浮点数(float)。然后下面的USAGE是具体解释,bbox(<surface_node>, <type>)。第一个字符串是节点,也就是“../”开头的一串;第二个浮点数是D_XMIN、DYMIN,D_ZMIN……也就是边界框相关的数值。照着写的过程中多思考几遍,不难理解。如果你写错了,节点旁边会出现红色的警示符号,这是学习Houdini过程中很正常的现象。在不断解决错误的过程中,你的技术才能得到实质性的提高。


接下来是上面两个电极的创建,这里只需要创建一个,然后往一侧移动至边缘,用mirror节点镜像对称即可。至于transform应该移动多少,有中小学数学水平就可以解决,我就不再详细列出了。注意电极的宽度(x方向)是length*ratio。merge之后添加polybevel节点整体进行边倒角。


稍微复杂一些的是中间二硫化钼的创建,这里大致介绍下我的建模思路供大家参考。比较简单的地方我会一笔带过。首先从一个三角形开始,用的是circle节点,类型选择polygon,半径(radius)固定为0.5不变,边数(division)为3。然后用polyextrude节点做内部插入,inset值刚好为半径的一半0.25,最后添加fuse节点融合。


参照【例52】的思路,我要将三个角的点往下移动,然后参照XZ平面做镜像对称。所以先要用group节点将现有的点进行编组。这里总共只有四个点,编号为0-3,我分别设置了两组,直接用点的编号来设置。一组是@ptnum == 0-2,一组是@ptnum == 3(中心),前者对应硫(S)原子,后者对应钼(Mo)原子。ptnum表示点的编号,前面加@是调用的写法。==是数学中相等的意思。


后面transform的时候只需要标明group,就可以只影响组内的对象。


然后是镜像、移动、复制(参照笔记005中的石墨烯),得到类似蜂窝状的分布。


最后整体移至中心位置时又用到了bbox表达式,只是这里的字符串应该是copy3节点("../copy3")了。本例中我用的复制方法不是很快捷,最后移动位置时会有些偏差,这里translate的x值和z值我分别设的是-bbox("../copy3",D_XMAX)*0.5+0.125*sqrt(3)-bbox("../copy3",D_ZMAX)*0.5+0.25,后面加的数值是基于单元尺寸的微调。


再次用fuse节点将位置相同的点融合在一起,然后就可以用copy to points节点在对应的点位置拷贝原子小球了。虽然经过了多次复制和融合,但最初的点的编组仍然保留了下来,所以拷贝时仍可选择target points为group1或者group2。分别拷贝得到S原子和Mo原子。


至于化学键我原本是想用提取的方法来做,但没搞定。所以用了个比较笨的办法,先用add节点创建两点的连线(两点的坐标按照前面的参数来),然后旋转复制三个,之后镜像、多次复制得到阵列均用前面一样的节点。


最后,将各个部分merge合并,得到最终的模型。


调整CONTROLLER节点的参数,检查下模型的变化是否有问题,以及还有哪些地方可以优化。


本次分享到此结束,感谢各位的阅读,下见~

Houdini学习笔记010的评论 (共 条)

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