一种有趣的三角形细分网格方法
近日,有群友询问如何实现这张图片上的效果:
我研究了一下,发现这种用三角形细分三角形网格的方法确实优雅又有趣,而且方法巧妙,过程简单,就拿出来和大家分享一下。
观察图片我们能得到几个特征:
1.整个模型的所有单元都是三角形
2.每个大三角形都被小三角形细分了
说到全部由三角形构成的网格,熟悉gh的网友可能会想到delaunay mesh这个电池
它可以将一些平面上的点自动连接成一个由三角形构成的网格
如果我们能用上这个电池,那么问题“如何用小三角形细分网格”就转化成“如何确定小三角形的端点”了
再看一下图片,我们能发现另一个特征:
3.距离大三角形边缘的小三角形特别整齐
其实到这里,细分逻辑就已经展现出来了,如果把这些 非常整齐的三角形 的共线边 高亮显示,一切都将一目了然:
这些小三角形整齐的原因就是他们的顶点全部位于 大三角形边框线 偏移后的线 上!
由于图片最右侧的三角形更大一点,这种偏移进行了两次。我们推测,如果大三角形的尺寸再大一点,它会偏移更多次;而如果大三角形太小,可能一次也偏移不了。
对于某个大三角形,如何判断边框线偏移的次数呢?根据直线偏移的定义我们知道,偏移后的线与原线平行,易证偏移后的三角形与原三角形相似。当偏移的距离增加,新生成的三角形就越来越小,直到缩小成一个点。这个点到 原三角形边框线 的距离就是偏移距离的上限了。由于这个点是由 原三角形边框线 偏移得来,易证它就是三角形的内心。求出内切圆的半径,就能方便地控制偏移的次数和距离了。
偏移之后,在线上取点。观察易得,对偏移后的线进行长度相关的等分就能得到这些点了。
最后使用delauney mesh生成网格,再blabla一通操作做成和图中相像的就行了。
以下是详细步骤:
首先你要有一个女朋。。。呃,模型
我随便画了一个完全由三角形构成的多重曲面
拾取进gh,并作出如图操作:
因为在曲面转曲线时,曲线的方向有时并不和曲面法线方向相关,(bug?)而曲线的方向和偏移方向相关,所以若要统一偏移方向,就必须让曲线方向一致。所以,在rh里拾取的几何物件必须是多重曲面,这样所有面的法线方向就是统一的。之后,提取曲面的法线方向并得到曲面所在平面,然后在该平面上画一个圆,用这个圆的方向来调整所有三角形边框线的方向。最后就能得到调整过方向的边框线了。
下一步就是偏移了,但是在这之前我们先要求出每个大三角形的内接圆的半径。我们手动输入每次偏移的距离,用半径控制偏移的次数。
使用circle tantantan求出三角形内接圆,deconstruct circle求出半径。过程如下:
如何实现“用半径控制偏移的次数”?
首先设单次偏移距离为x,用半径除以x,用round求出大于该商的最小整数y,这个整数y就是偏移的次数。由于每次偏移的距离都是互相独立的,所以用一个首项为0,公差为x,项数为y的等差数列得到每一次偏移的距离。然后偏移,注意把 偏移的平面 更改为之前确定的 三角形所在的平面。
之后,用同样的方法得到这些曲线上的等分点
调整这些点的数据结构,使得每个大三角形内的点都在一个枝干内,使用cull duplicates删除所有重复的点,然后使用delauney mesh生成三角形网格,也要注意把 网格的平面 更改为之前确定的 三角形所在的平面。
然后偏移缩放加管炸来炸去什么的一通操作,就做完了!
配合我之前的一篇回答,能方便地达到想要的效果:
gh文件下载:
链接: https://pan.baidu.com/s/1A0xdCr0QgSSpbJF2CQkB6w 密码: tud1
需要gh1.0及以上版本
需要插件mesh edit