查看原文
其他

【HSN_018】科赫(雪花)曲线

独孤嘌呤 3D科研绘图 2022-10-26

今天我们来学习Koch_curve(科赫曲线)的制作,帮助大家系统梳理“foreach”节点的用法。该曲线是1904年由瑞典数学家Helge von Koch提出,是最早被描述的分形曲线之一。Koch_curve的生成思路并不复杂,就是分形迭代。如下图所示,从一个正三角形开始,每边三等分后,以中间段为新的边,往外凸起形成新的正三角形。经过多次循环迭代就得到了雪花状的图形。


我的制作思路是先找到每条边的中点,然后拷贝下方箭头上的图形,再不断重复这一过程。


下面是我在Houdini中的制作步骤:


可以看到主要步骤是foreach循环,在讲循环之前,我们先把单次循环内的操作完成。每次拷贝的曲线形状用“add”节点来绘制,这里一共需要5个点,相邻点之间的距离假设为1。


然后在Polygons选项中选择“By Group”,依次连接所有点得到曲线。


初始的正三角形用“circle”节点创建,“Primitive Type”选择Polygon,“Divisions”设为3。为了确保三角形边长与拷贝的曲线宽度一致,“Uniform Scale”设为“sqrt(3)”。


给每边添加中点使用的是“resample”节点,勾选“Resample by Polygon Edge”选项,重新采样的方式选择“Maximum Segments”,即每边最大分段数。“Segments”的数值设为2。


此时显示点序号可知,中点均为奇数点。可以用“Group Expression”节点将其选出作为一个选集。节点的名字可以设为“middle”,属性中“Group”一栏填写“$OS”,即用节点名作为选集名称。“VEXpression”一栏填写“@ptnum%2==1”。


这个表达式什么意思呢?“@ptnum”前面提过多次了,是调用点序号。后面的“%”是求余的意。也就是用点序号除以2余数为1,那不就是奇数点么!这里别忘了将“Group Type”改为Points,然后每边的中点就被选中了。


然后那就拷贝吧,用“copy to points”节点,“Target Points”选择设置好的middle选集。确实在每边的中点拷贝了我们绘制的图案,但方向不对啊~应该是法线的问题。

添加个“normal”节点看看点法线,发现都是垂直于平面的。而我需要的发现方向是位于图形所在的平面内,且垂直于每条边朝外的。如下图中红色箭头所示——


想了半天没什么好的思路,可能是我对Houdini的节点还不够熟悉。于是我决定尝试用万能的VEX来解决。电光火石之间,我就创建好了“Attribute Wrangle”节点。“wrangle”这个词字面意思是争吵、争辩,我不知道用在这里是何意。大概是程序员在创建这个节点的时候跟老婆吵架了吧。


言归正传,“attribute wrangle”节点创建好之后,接下来就要开始写VEXpression了。老铁们!这是我们第一次用VEX代码,激不激动?可是问题来了,写些什么好呢?总不能写1+1=2吧。


这里我们是要解决点法线的朝向问题,先敲个“@N=”再说~~

通常设置一个矢量可以用set函数,比如set(1,0,0)就是X轴正方向。一个语句写完后,后面要加分号“千万不能忘),然后你就会看到所有点法线都朝向了X轴正向。是不是非常easy?


但这里我需要每个中点的法线方向都是不一样的,我想的办法是用每个点的坐标减去上一个点的坐标,不就得到了沿着每条边方向的矢量了么,再转个90度不垂直了嘛!现在我只需要用一个函数获取点坐标就可以了,尝试输入“@N = point”后,果不其然,弹出了一堆point开头的函数——


按【F1】打开帮助窗口,搜索“point”找到point VEX function,可以看到这个函数能根据点序号获取点的属性。point函数中有三个变量,第一个是geometry,也就是“Attribute Wrangle”节点输入端口的编号,第一个输入端口为0。第二个变量是attribute_name(属性名称),这里我们要获取点坐标P,注意这个变量类型为字符串,所以要加引号。第三个变量是pointnumber(点序号),用@ptnum调用即可。


于是,我在VEXpression中输入“@N = point(0,"P",@ptnum);”,神奇的事情就发生了。注意这里三个中点的法线方向已经垂直每条边朝外了,因为刚好是从原点指向该点的方向,只有正多边形才会这样。迭代一次后就不对了,所以我们还是按照之前的思路,减去上一个点的坐标。


将表达式补充完整“@N = point(0,"P",@ptnum) - point(0,"P",@ptnum-1);”,再来看看结果——


要不要再旋转90度呢?其实不用,旋转拷贝的图形角度也是一样。只需要知道图形的Z方向最终会对齐到法线方向就行了。所以这里给拷贝的图形加一个“transform”节点,设置“Rotate”的值即可。比如我这里设置的是Rotate.y和Rotate.z均为90度。


有时候只设置法线方向还不够,拷贝的结果可能还会偏离平面。这时候可以加一个up属性,即C4D中所谓的上行矢量。有了N和up这两个属性,拷贝的方向基本就定死了。设置up方向时就可以set函数,至于是x、y、z哪个方向才好使,根据你的模型方向去调试。


终于要开始循环了,创建一个“For-Loop with Feedback”节点。所有的for循环节点都有一个begin和一个end节点,表示循环的开始和结束。feedback指的是循环的方法,每次循环后得到的结果作为第二次循环开始的对象。也就是begin节点属性中的“Method”设为“Fetch Feedback”。其他的for循环节点也不过都是设定好参数的一些预设而已,本质都一样。


我们先把上述过程连接到循环内,连接方式如下。然后在end节点属性中调节迭代次数“Iterations”的值,看看有没有变化。如果有,说明循环发生了,然后我们再继续调整。


第一个问题:每次拷贝的图形应该是越来越小的,因为每次小三角形的边长都是大三角形边长的1/3,迭代n次,就是1/3的n次方。


需要用到迭代次数的话,需要在begin节点中点击“Create Meta Import Node”按钮,然后会看到“Method”自动调整为“Fetch Metadata”,下面显示多了一些Detail Attributes,包括iteration、numiterations、value、ivalue等。其中,iteration就是迭代次数。


此外,节点面板也会多出一个metadate的节点。如果你创建“For Each Number”节点,会发现这个metadata节点已经自动帮你创建好了。


现在我们需要在“transform”节点的“Uniform Scale”参数调用迭代次数的数值。因为它是属于metadata节点中的detail属性,调用时需要用到detail函数(笔记015中讲过)。


如果你不清楚detail函数的用法,同样可以在帮助窗口中搜索detail。并且有具体的写法参考。


detail函数的括号中分别是节点、属性名称和索引号。比如这里要调用metadata节点的iteration属性值,就可以写为"detail("/obj/geo1/repeat_begin1_metadata1/","iteration",0)"。


有时候写节点的名字太麻烦,可以点击属性面板右上角的齿轮图标,选择“Add Spare Input”选项。


面板最下方会多出一个“Spare Input”空白参数栏,将需要调用的节点拖进来,然后detail函数中的节点名称用“-1”代替即可。


根据1/3的n次方关系,最终的“Uniform Scale”应写作“1/pow(3,detail(-1,"iteration",0))”,pow是幂函数。现在我们增加迭代次数,还是有问题,但比之前要好不少。


经分析,原因可能是点序号造成的。因为每次拷贝后的线条是断开的,再次添加中点后不能保证刚好是所有的奇数点。


解决的办法是resample之后再加一个“fuse”节点,正常情况下问题应该就迎刃而解了。但我仔细检查后发现点的序号还是不对,并不是按照一圈的方式排列。


检查了半天才弄明白是“transform”节点中的Rotate.y应该是-90度才对。现在点的序号排列就没有问题了。你在操作的过程中也可能遇到其他问题,这很正常。不要害怕出问题,每次碰壁的过程就意味着新的成长。


到这里,Koch_curve就算是全部完成了。迭代次数最多到7或8速度就比较慢了,还有就是迭代次数较高时,“fuse”节点的“Snap Distance”也要相应减小,如0.00001。因为1/3的8次方约为0.00015,融合的点间距不能大于该值。


如果你要获得一个平面,最后也可以用“polyfill”节点填充面。“Fill Mode”选择“Single Polygon”,如下图所示——


今日份学习到此结束,for循环节点还是非常有用的,相信以后我们还会经常用到。感谢各位的阅读,下回见~



【往期绘图教程汇总】

 C4D科研绘图系列教程

 C4D科研模型100例

 Grasshopper科研绘图系列

 Diamond系列教程

 Houdini学习笔记系列

 3D科研绘图往期教程精选 

 PPT绘图系列

 AI绘图系列


思斐迩(Sphere)——沟通科学与艺术的桥梁。

杭州思斐迩科技有限公司长期专注于科学可视化领域,专业提供科研图像设计和科研动画制作等服务。公司拥有一支专业的硕博团队,涵盖生物、化学、材料、美术设计等,具有深厚的科学和艺术底蕴。自2016年以来已为全球上百家高校和科研机构提供设计服务,包括中科院、MIT、Stanford、ETH Zurich、EPFL、清华、北大、Cornell等,蜚声海内外。公司秉持以图像诠释思想,用技术创作艺术的宗旨,作品被Science、Nature、Cell、JACS、Angew等期刊选用,并受邀为其制作动画。为了更好地服务科研工作者,公司还长期开设科研绘图培训课。更有国内最大的科研作图教学公众号“3D科研绘图”和答疑社群,为大家提供详细的教程和答疑咨询。曾为浙江大学、复旦大学、武汉大学、同济大学、上海科技大学、中科院大连化物所等单位提供专业作图讲座和培训,线上线下总受众数超十万人。

▼学术期刊封面设计请点击下方图片

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存