本文转自公众号:十二只熊

概述

几何体的边一般是无方向并且是可多面共享的。

但是对于一些需求来说,有时需要使每一个面都具有
仅属于自己的边

这就需要引入半边概念,也就是相当于针对每一条共享边,分离出两条具有方向的半边。

边的方向”由面的顶点号决定——半边具有起始顶点(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

int
vertexint

为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!