Houdini学习笔记042_树枝状polymer

今天的学习内容如下,这是一个树枝状高分子的平面化表达示意图。整体形状呈现为圆形,由内到外逐级分叉。

动手之前我们先思考:需要设置哪些可调节参数?比较直观的有图形的层数(也称为分子的代数generation),每一层的宽度d,最内层的分叉数n。

然后每次分叉可以设定一个角度θ(theta),随着代数的增加,这个θ角会越来越小,所以还需要设置一个角度的衰减系数α(alpha)。

这里我先创建了一个null节点,自定义如下参数(主要是前面5个)——

最内层(g=0)可以用一个Attribute Wrangle节点搞定,Run Over设为Detail (only once)。

VEX代码如下:
所用函数之前的笔记中都讲过,不再赘述。这里最内层分叉数n默认设置为3。
接下来逐层分叉使用一个For-Loop with Feedback节点来循环绘制。对于“active”组内的点,获取其坐标,并据此得到下一步分叉后新的点坐标,并与之连线。然后重新设置“active”组。

绘制分叉可以用Point Wrangle实现,由于需要用到循环迭代次数(iteration),选择Block Begin节点,点击Create Meta Import Node,为其创建Detail属性。然后连接到Point Wrangle节点的1号端口。

先用如下代码获取各参数值,theta定义的是角度,需要转为弧度值。迭代次数用detail函数获取。注意各个参数的数据类型。
求分叉点坐标我采用的是旋转法,因为rotate函数是绕着原点旋转,所以先将旋转轴心(P)平移到原点(O),旋转θ角度后再平移回去,得到点P1(或P2)。

这次Run Over是对“active”内的点进行的,所以选择Point。Group选择active。A点的坐标可以按如下方式计算得到:
ident函数可以设置初始化矩阵,角度theta跟迭代次数有关,每迭代一次,就乘以系数alpha。rotate函数对矩阵进行旋转,获得旋转矩阵。4表示绕Z轴旋转,也可以用{0,0,1}。
接下来就是创建新的点,然后连线。
将新建的分叉点添加到“active”组内,原来的点移出。连线的primitive属性可以设置为代数generation,具体数值为iter+1。
根据primitive属性可以计算一个从0到1的浮点属性,命名为@ratio。根据该属性进行着色。


后面怎么设置粗细变化这里就不讲了,感兴趣自己研究。值得一提的是,如果要根据generation数进行分段着色,直接用polywire节点显示不出来,需要先将primitive属性转为point属性,之后再将point属性转回primitive属性。属性的转移用的是Attribute Promote节点。





今日分享到此为止,感谢各位阅读,下回再见~