本文章是下面视频教程的笔记。工程文件和原视频在本文最后。
一:简介
笼目,又称kagome Lattice,是下面这样由六边形和三角形交替组成的结构。
这样的结构经常可以在我国传统的背篓上看见。
目前已经有人在一篇《Beyond the basket case》的论文中研究了如何用计算机复现这种结构。这篇文章可以在Research上免费下载。我已经把它打包到工程文件夹里了。原理如下
先给物体划出三角形网格。
然后将三角形网格化为6边形网格,然后用6边形网格生成笼目结构。具体方法是,六边形网格的每一个顶点都连接着三条边,在这三条边上取中点连接成三角形即可。
然后给不同位置的线添加颜色即可。
二:建模
首先选好一个模型,视频作者用的是那只兔子,但简单起见弄个多边形球体也可以。然后下拉一个remesh,将其划分成三角形网格。
下拉一个divide,勾上Compute Dual,将其划分成六边形网格。其实这样还会出现一些五边形网格,但是没关系。
下拉一个Points Wrangle,代码如下,用于生成笼目结构。
int neighbours[] = neighbours(0,@ptnum);
int poly = addprim(0,"poly");
for(int i = 0;i < len(neighbours);i++)
{
vector pos = point(0,"P",neighbours);
vector dir = pos - @P;
vector npos = @P + dir * 0.5;
int npt = addpoint(0,npos);
addvertex(0,poly,npt);
}
removepoint(0,@ptnum);
再下拉一个fuse,合并重叠部分。
但现在各个面的法线都是乱的。于是新建一个ray,左上点连fuse,右上点连刚才创建的divide,mETHod选择最小距离,把Points Intersection Normal勾上。
ray下拉一个primitive Wrangle,代码如下,用于删面生成线。原视频作者在这里写得有些复杂,其实这里并不需要计算法向量叉积点积什么的。
int pts[] = primpoints(0,@primnum);
float dist = ch("dist");
for(int i = 0;i < len(pts);i++)
{
int pt1 = pts;
int pt2 = pts[(i+1)%len(pts)];
vector pos1 = point(0,"P",pt1);
vector pos2 = point(0,"P",pt2);
vector normal1 = point(0,"M",pt1);
vector normal2 = point(0,"N",pt2);
int npt1 = addpoint(0,pos1 - normal1 * dist);
int npt2 = addpoint(0,pos2 - normal2 * dist);
setpointattrib(0,"col",npt1,0.0);
setpointattrib(0,"col",npt2,1.0);
int line = addprim(0,"polyline",npt1,npt2);
}
removeprim(0,@primnum,1);
解释一下,对于每一个三角形的三个点
每个顶点将自己分裂成两个点,其中第一点个升高dist距离,下一个顶点的第二个点降低dist距离,然后将这两个点连接即可。比如下图,奇数号点是升高的点,偶数号点是降低的点。
然后上色,升高的点col值给1,降低的点col值给0。
这时候已经完成了,图片上的线看起来太乱。看看三维模型更好一些。
再下拉一个fuse将这些线连起来。下拉一个polypath优化面数。
优化前:
优化后
为了让线的交点不那么尖,下拉一个resample,Treat Polygon As选择Interpolating Curves。Length按需要调整即可。
下拉一个Color,Color Type选择Ramp From Attribute,Attribute填Col,调整颜色把它变成方便面(误)
下拉一个polywire将其变成立体的线,然后下拉一个normal调整法线。教程完毕。全节点截图
三:工程文件
链接: https://pan.baidu.com/s/1pwJXGF5J58T568x6DypPrg 提取码: s9m1
B站有视频搬运,但只到这个系列的39部https://www.bilibili.com/video/BV1j4411e7Sp?p=39,而这个教程是这个系列的第40部 |