本文转自公众号:十二只熊
概述
几何体的边一般是无方向并且是可多面共享的。
但是对于一些需求来说,有时需要使每一个面都具有
仅属于自己的边
这就需要引入半边概念,也就是相当于针对每一条共享边,分离出两条具有方向的半边。
“边的方向”由面的顶点号决定——半边具有起始顶点(start vertex)以及结束顶点(end vertex),其起始和结束表示也被称为"source"和"destination"。
所谓的“共享边”,类似于共享点,比如下图——
序号5、6、9、10四个面,共用着一个序号为12的点,这个点就是共享点。
“共享边”的概念则与此类似,实际上就是相邻多边形的交界边(对于多边形边界处的边,由于没有多于一个的共享面,所以只有一条半边)。
如下图:
半边的作用和本质
和Houdini中常规的point、vertex、edge、prim等几何元素类型不同,"Half-Edges"并不是具体的可编辑几何数据,而是依赖于上述常规几何元素存在的一种几何关系。通过半边,可以对其它具体几何元素进行非常规的访问和管理,这可以使用半边相关的VEX函数来实现。
半边可以根据任意指定的vertex或point构建,可实现对其它几何元素的管理如下:
1. 直接访问到半边的起始和结束vertex、point;
2. 直接访问到共享边的另一个半边,从而间接访问相邻面的vertex、point;
3. 直接访问半边方向所指的下一个半边,对于多边形面来说,重复性地访问next half-edge,就是在当前面上沿顶点顺序进行循环;
4. 直接访问共享了同一个给定point的所有半边,从而间接访问由给顶点向外辐射的任意相邻元素。
5. 以及其它各种操作。
半边的“等价”
对于共享了同一条原始边的两条或多条半边,则这些半边即被视为等价,无论其方向是否一致,如下图所描述的立体几何(一个三角面垂直于两个五边形),共享了同一条边的三条半边e 、f 和g ,相互之间等价:
Source & Destination
半边的构建主要基于已有的实际几何元素,即vertex和point,所以半边的Source和Destination也主要对应于具体的vertex或point。
每一条半边仅对应1个Source Vertex,也就是说,仅根据一个顶点即可构建一个半边,其Destination是按顶点顺序的下一个顶点。
每个vertex仅对应1条半边,而一个point则允许对应着多条半边。两个半边的顶点不同,但是共享着相同的两个point时,则这两条半边视为等价(Equivalence)。
Primary Half-Edge——
在每一组等价半边中,都有一条主半边,作为这些共享半边的代理,便于统一管理。
主半边的生成标准不明,根据官网所述:
In particular, a half-edge which is equivalent to no other half-edges is always primary。(特别地,不等同于任何其他半边的半边始终是主边。)
半边构建函数
生成半边的相关函数如下:
vertexhedge(int geohandle
intvertexint
为vertex顶点构建一个半边表示,返回相应的半边序号。
该函数描述的半边方向,是以当前顶点为Source(见前文所述),顶点所在Primitive的下一个顶点作为Destination而决定的。
如果引入的顶点号不存在,则返回-1。
便于直观理解,可以参考下图——
(其中
绿色数字
表示半边号,
红色数字
表示当前半边所有等价半边的主半边号
primhedge(int geohandle,intprim)-->int
针对primitive构建一个半边表示,返回相应的半边序号。注意,由于一个Primitive可能具有多个半边,该函数返回的是其中任意一个。
半边方向则以半边两端顶点的顺序,决定Source以及Destination的所在点。
如果引入的基元号不存在,则返回-1。
pointhedge(int geohandle,intpoint)-->int
针对point构建一个半边表示,返回相应的半边序号。
该函数还有另一个形态:
pointhedgeint geohandleintsrcpointintdstpointint
该形态下,可以直接引入点索引,手动确定半边的起点和终点。
参考链接:https://www.sidefx.com/docs/houdini/vex/halfedges.html
THE END
学UE5,居然能把小米SU7开回家?
15秒造人,动捕、直播都能hold住?
What?我的离谱作业居然可以做成全球爆款?!
推荐几款Blender插件,工作效率Up!Up!
热门跟贴