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

Houdini学习笔记022_Sierpinski三角

2022-09-01 17:52 作者:独孤嘌呤  | 我要投稿

上一篇笔记的内容对初学VEX的人来说可能略显复杂了些,干脆我再补写一篇吧。这个案例是一种经典的分形图案——谢尔宾斯基三角(Sierpinski triangle),它长下面这样——

Sierpinski Triangle

关于谢尔宾斯基三角的图案生成有多种方法,这里我选择的是撒点法。具体来说,就是从等边三角形的三个点开始,任选两个点求其中点。然后连接中点和原等边三角形的任一顶点,再求得新的中点。如此不断循环往复,所有点的分布就会呈现上图中的图案。

我们可以从一个Circle节点开始,类型选择Polygon,边数设为3。在视图窗口按【W】键切换为线框显示。

然后创建Point Wrangle节点,将三角形连接到其第一个输入端口。我们先选择0号点和1号点,求出其中点作为起始点。获取点坐标的函数在笔记018中讲过:

point(0,"P",@ptnum);

@ptnum这里分别为0和1,得到的两个矢量坐标分别赋值给变量pos0和pos1,两者相加后乘以0.5就是中点的坐标值。

下面就是不断求得新的中点的循环过程,显然需要用到for循环语句。开头的写法为

for(int i=0; i<chi('count'); i++)

别忘了中间加的是分号。

循环执行的内容就是添加点,使用的是addpoint函数。直接写

addpoint(0,pos);

就可以了。然后我们再计算新的中点坐标。

这里需要从初始三角形的三个点当中随机选一个点出来,使用的是rand函数。但是rand函数返回的值是0~1之间的浮点数,可将其乘以3扩大到0~3的范围。再用向下取整函数floor取值,即可得到0、1、2之中的随机一个值。写法为:

floor(3*rand(seed))

rand函数的括号中需要有一个随着循环迭代不断变化的种子,这样每次生成的随机数都不同。刚好迭代次数i就是不断增加的,可以直接作为随机数的seed。所以最后的VEX代码如下所示——

Count是我们定义的可调节参数,用来控制总的循环次数。在参数设置窗口中将其取值范围设为0~200000,方法在笔记020中也讲过。

随着Count值的增加,Sierpinski三角的图案很快就显现了出来。

我们也可以把初始的等边三角形换成正四面体,得到如下所示的结果。之所以只有一个面上有Sierpinski三角的图案,是因为我们求中点时只在0、1、2三个点中进行选择。如果是正四面体则需要把3号点也要加进来。

只需要把floor函数中的3改为4即可。为了不用改来改去,可以定义一个num变量,定义:

int num = @numpt;

floor函数改为floor(num*rand(i))即可。

增加Count的数值,得到的就是Sierpinski金字塔。

Sierpinski Pyramid

就写到这里吧,下回再见~

Houdini学习笔记022_Sierpinski三角的评论 (共 条)

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