What & How & Why

Points and Vertices

Points 与 Vertices 的概念和区别。


Point

PointHoudini 中是由空间中的 4 个数字定义的,分别是 (X,Y,Z,W)X,Y,Z 代表了 Point 在空间中的坐标,而 W 则是一个标量(应该是 Homogeneous)。因此,Point 在该空间中是不重复的。

绝大部分情况下在 Houdini 中都是对 Point 的操作。

Vertex

Point 不同的是,Vertex 是以 Primitive (面)为单位的。一个 Primitive 是由 VertexEdges 组成的。因此,对于有多个 Primitive 的复杂几何体,很可能会出现多个 Vertex 共享 一个 Point 的现象。而从几何上来说,Vertex 才是构成几何体的单位,Point 则只是为了操作方便而设计的一个概念。

<html>

<img src=“/_media/vfx/houdini/concepts/geo/p_and_v.svg” width=“750”/>

</html>

How to form a primitive

在 Houdini 中,一个单独的 Primitive 由以下部分组成:

  • 组成 Primitive 的 Vertices
  • 在计算 Primitive 中,遍历 Vertices 的顺序

通过之前的介绍我们知道,Houdini 中的点(point)信息应该是以 1*4 的向量存储的:

//point number  + coordinate
Vertex[@ptnum,x,y,z];

因为Vertex 是构成 Primitive 的单位,其自身并没有在世界坐标系中的信息 。因此,我们需要引进一个概念,针对世界世界坐标系的绝对坐标值来描述 Primitive 的顶点位置。因此,如果我们打开 Houdini 的 spreed sheet,我们会发现,points 中存储的是 [x,y,z],而 vertex 中存储的是 @ptnum。那么实际上,Houdini 中的点的信息就是这么存储的:

Point[x,y,z];
//reference position from point
Vertex[@ptnum, ref(Point)]
我们可以将 vertex 想象为 point 的 容器;换句话说,也就是 vertex 是类, point 是实例。因此,理论上的单个 primitive 是由其对应的 vertex 与 遍历 vertex 的顺序建立的;而 point 提供的额外的坐标数据,确定了该 primitive 在整个世界坐标系中的唯一性。

顺序

Primitive 中遍历 vertex 的顺序非常重要;该顺序直接决定了 Normal 的方向。

Tips

  • 在一个几何体中,如果有多个独立Primitive(没有共享 Point)存在,那么比起使用 Point 属性,使用 Vertex 的属性能更方便的对每一个独立的 Primitive 进行操作。
  • 一些情况下,渲染器并不会独立计算被共享的 PointNormal ,这样的计算方式会使得表面看起来更加平滑。如果需要有棱有角的的面,需要对每个独立的 Vertex 进行 Normal 的重新计算。常用的节点有:facetfacet 节点可以通过将 Point 分离出来达到上述效果,也可以使用 cusp polygons 在不分离 Point 的前提下达到上述效果。

参考资料