原视频:https://www.youtube.com/playlist?list=PLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI
Bili:Houdini最强VEX算法教程 - VEX for Algorithmic Design_哔哩哔哩_bilibili
Houdini版本:19.5
直接看这篇吧,非常详细易懂:
知乎@刘云鹏houdini half edge 01
下面仅是对视频案例的一些代码的解释及补充
根据输入的点序号,按顺序遍历这个点所在的所有面。获取这些面的中心点,最后中心点与中心相连,形成一个多边形。
原理大概是这样子啦:图片来自知乎@刘鹏云,
eg.①先上结果:
③类型为Points的dual_mesh代码为,
int hedge = pointhedge(0, @ptnum); //返回以该点为起点的边序号,有多条边则返回最小边的序号
int ncount = neighbourcount(0, @ptnum); //当前点的相邻点数量
int poly = addprim(0, 'poly'); //创建一个空的几何体
for(int i=0; i
④拓展:
根据dual_mesh原理,还可以做些穿插的东西,比如下面图片这种东西,
传送连接在这:Houdini学习笔记026_互穿插网格(Dual Mesh),
大概是与上面相反,这次大概是面中心点位置与面的顶点位置相连(最终结果看上去是这回事,但是连接方式略微不同)。
②类型为Primitives的subdivide节点代码为,
//面中心点与面的顶点相连,使用半边等函数去遍历取顶点,然后连接中心点
int hedge = primhedge(0, @primnum); //返回该面包含的(最小)边序号
int start = hedge; //用作后面循环结束的条件,边是否已经遍历了一遍
//可结合下面的图去理解代码
while(hedge != -1){
vector pos = @P;
int cpt1 = addpoint(0, pos); //该面的中心点位置
int nhedge = hedge_nextequiv(0, hedge); //返回共线的另一个半边序号(如果不共线,那就返回原值)
int nprim = hedge_prim(0, nhedge); //该半边所在的面序号
vector pos2 = prim(0, 'P', nprim); //面中心点
int cpt2 = addpoint(0, pos2);
int srcpt = hedge_srcpoint(0, hedge); //该半边所在的的起始点序号@ptnum/相当于上一条半边的末点序号
int tri = addprim(0, 'poly', cpt1, srcpt, cpt2);
hedge = hedge_next(0, hedge); //下一条半边序号
if(hedge == start){ //该面的半边都遍历完了,退出循环
break;
}
}
removeprim(0, @primnum, 1); //旧去新来
比如,对box进行倒角,
①分两次进行,对点进行倒角,对面进行倒角;
②然后merge在一起,(还可以再用fuse节点融并相同点);
③可以再使用Foreach-number循环,进行多次倒角;
④感兴趣的,还可以大概上个色;
操作:
① 以box为例,进行点倒角,(就一个Polygon的box节点+PointWrangle节点),
int hedge = pointhedge(0, @ptnum); //当前点所在的半边
int ncount = neighbourcount(0, @ptnum); //当前点点相邻的点数量
int poly = addprim(0, 'poly'); //创建个空几何体
for(int i=0; i
②以box为例,进行点倒角,(就一个Polygon的box节点+PrimitiveWrangle节点),
int hedge = pointhedge(0, @ptnum); //当前点所在的半边
int ncount = neighbourcount(0, @ptnum); //当前点点相邻的点数量
int poly = addprim(0, 'poly'); //创建个空几何体
for(int i=0; i