Houdini学习笔记038_Menger Sponge(门格海绵)

今天分享的VEX教程是一个简单的分形结构——门格海绵(Menger Sponge)的制作。

制作思路很简单,但有一个地方困扰了我半天,希望知道的朋友能解释一下。
给定一个初始点和边长,当迭代次数为0时,直接在初始点位置生成一个立方体,边长即给定的边长。每增加一次迭代,将原来的立方体分为3×3×3(=27)份,并去除体心和每个面的面心处的小立方体(共7个),剩下20个小立方体。小立方体的边长为之前的1/3。
所以只需要得到每次迭代后的中心点坐标,以及立方体边长,就可以拷贝出所有的小立方体。假设初始边长为1,迭代n次后的立方体边长则为:(1/3)^n。

box节点的Uniform Scale参数可设置如下:
这里的iteration和size都是自定义的参数,分别为迭代次数和初始的立方体边长。
接下来的关键是每次迭代的点坐标求取。对于每一个点,可以将其看作坐标原点,然后从(-1,-1,-1)到(1,1,1)的空间内分布27个点坐标。除去(0,0,0)、(1,0,0)、(-1,0,0)、(0,0,1)、(0,0,-1)、(0,1,0)、(0,-1,0)这7个坐标,剩下的位置都生成新的点。
迭代使用的是For-Loop with Feedback节点,然后用point wrangle节点来创建点(对应函数为addpoint)。point wrangle节点中使用的是三层嵌套for循环,得到27个点坐标,使用判断条件 abs(x)+abs(y)+abs(z) > 1 即可筛选出需要保留的坐标。然后在原来的点坐标基础上加上新的坐标值(需要乘以相应的边长),就得到了新的点坐标。
原本我写的代码是:
pos = @P + pos*size;
可总是得不到正确的结果,后来将 @P 改成了 3*@P 才成功了,总感觉有些奇怪,感兴趣的朋友可以帮忙分析下。

如果将上面的判断条件改为 sum <= 1 则可以得到互补的结果,如下图所示——

今天的分享就到这里,感谢大家的阅读,下回见~