开源于:
五行精灵:开源1000+HDA;FeELib for Houdini使用指北zhuanlan.zhihu.com首先是原理
案例在后面
众所周知houdini的polygon内有三个calss:prim,point,vertex,没有edge class
但我们很常用的一个SOP
convent line SOP
理想上应该是用run over edge的思路去制作
当然官方不是,而是run over points,那就会造成效率浪费,有没有办法呢?
用FeE Convert Line SOP()
——如果你装了fee lib,输入ew就能看到,下面会介绍用法和原理
首先我们来看half edge(以下简称hedge)
此处需要有houdini官方帮助文档搜索half edge的基础,再看后面的
http://127.0.0.1:48626/vex/halfedges
以下是官方文档没有的:
我们得出了性质:
每一个hedge,都和一个vertex一一对应
hedge == vertex
当然,不是每一个edge都和1个,或2个vertex(hedge)一一对应
如上图所示,egf三条he,分别属于三个prim,共同属于一个edge
因此,我们写edge wrangle(run over edge)
只需要先run over vertex (注:等同于run over hedge)
加上两行代码即可
int hedge_nextequiv = hedge_nextequiv(0, @elemnum);
if ( @elemnum < hedge_nextequiv ) return;
hedge_nextequiv()的意思就是
上图中egf三个hedge分别是上一位hedge的hedge_nextequiv,如下
hedge_nextequiv(e) == g
hedge_nextequiv(g) == f
hedge_nextequiv(f) == e
@elemnum < hedge_nextequiv表示:
拿到egf三条hedge中编号最小的,这样就防止了重复计算
但这时候又出了新问题:
对于unshared edge
hedge没有hedge_nextequiv(),或者说,hedge_nextequiv(e) == e(他自己)
因此我们要区别对待
int hedge_nextequiv = hedge_nextequiv(0, @elemnum);
if ( @elemnum < hedge_nextequiv ) return;//includeunshared
if ( @elemnum <= hedge_nextequiv(0, @elemnum) ) return;//excludeunshared
但这时候又出了新问题:
对于一条线,他是有两个vetex,一个edge
精灵的个人约定:最后一个vertex也算是有hedge,虽然,它不存在
同时,对于0号hedge,如上文所述,其hedge_nextequiv()是自己
对于1号hedge,hedge_nextequiv() == -1
所以我们的edge wrangle最终版本:
int hedge_nextequiv = hedge_nextequiv(0, @elemnum);
if ( @elemnum < hedge_nextequiv || hedge_nextequiv == -1 ) return;//includeunshared
if ( @elemnum <= hedge_nextequiv(0, @elemnum) || hedge_nextequiv == -1 ) return;//excludeunshared
案例:FeE Convert Line(开源,具体可以看fee lib)
核心代码非常简单,剩下的都是属性传递
FeE Flat Edge
根据边的角度,给边打组,有阈值的设定
这个SOP就需要run over edge进行处理效率最高,算法很简单,只要理解了上面说的
FeE Group Edge by Direction
顾名思义,对每一个面判断其朝向,为其打组
FeE Group Edge by Length
更多案例精灵一下想不到,先写到这了