网格剖析

网格由排列在三维空间中的三角形组成,产生一种固体对象的感觉。三角形由三个角点或顶点构成。在网格 (Mesh) 类中,顶点都存储在单一数组中,每个三角形使用对应于顶点数组索引的三个整数来指定。三角形也集合在一起,形成一个单一的整数数组;数组从一开始以三个整数为一组,因此元素 0、1 和 2 定义第一个三角形,3、4 和 5 定义第二个三角形,并以此类推。任何给定的顶点可以根据需要在尽可能多的三角形中予以重复使用,但也有多个原因表明您不希望这么做,解释如下。

照明和法线

三角形足以确定对象的基本形状,但在大多数情况下,需要额外的信息来显示网格。要为对象正确着色以便照明,必须提供 每个顶点的法线向量。法线是向外指的向量,在与之相交的顶点位置垂直于网格表面。在着色计算中,将每个顶点法线与入射光方向进行对比,后者也是一个向量。如果两个向量方向一致,那么表面上的那一点正面接受光照,光的全亮度将用于着色处理。完全从法线向量侧面入射的光没有到达表面上的该位置。通常情况下,光与法线形成一个角度,所以着色处理会在完全明亮和完全黑暗之间,具体依角度而定。

由于网格是由三角形组成,所以似乎拐角处的法线仅仅垂直于三角形的平面。然而,法线实际上内插在三角形当中,提供 拐角之间中间位置的面方向。如果全部三根法线指向同一方向,那么三角形将被均匀完全照亮。将单独的三角形均匀着色的效果是边缘变得非常清晰而独特。这就是立方体模型或其他边缘锐利的固体模型所需的效果,但是法线插值可用来创建平滑着色,以近似曲面。

为获得清晰的边缘,需要翻倍每个边缘的顶点数,因为两个相邻的三角形需要各自独立的法线。 对于曲面,顶点通常沿着边缘予以共享,但往往需要通过一点直觉来确定共享法线的最佳方向。法线可能只是周围三角形平面的法线平均值。然而,对于球体这样的对象,法线应该直接由球体的中心向外指。

通过调用 Mesh.RecalculateNormals,您可以假设网格几何体的“意义”,让 Unity 算出法线方向;假设三角形之间共享的顶点表示光滑表面,而翻倍的顶点表示一个清晰的边缘。虽然在大多数情况下这不是一个太坏的近似,但 RecalculateNormals 会受到一些纹理状况影响,其中顶点必须增加一倍,即使在表面光滑的情况下。

纹理

除照明之外,模型也常常使用纹理来在表面上创建精致细节。纹理有点像是印在可拉伸橡胶板上的图像。对于每个网格三角形,纹理图像的三角形区域已定义,纹理三角形已拉伸和“固定”来配合网格三角形。要实现该效果,每个顶点需要存储将固定到其身上的图像位置的坐标。这些坐标为二维坐标,缩放范围为 0..1(0 表示图像的底部/左边,1 表示右边/顶部)。为避免将这些坐标与三维世界的直角坐标混淆,我们将其称为 U 和 V,而不是熟悉的 X 和 Y,所以它们通常被称为 UV 坐标。

像法线一样,每个顶点的纹理坐标都是唯一的,所以在有些情况下,纯粹为了获得整个边缘的不同 UV 值,您需要翻倍顶点数。一个明显的示例是两个相邻三角形使用纹理图像的不连续部分(比如说,面部纹理上的眼睛)。此外,大多数是完全封闭卷的对象需要一条“缝”,以便将一个区域的纹理环绕卷起并连接在一起。缝一边的 UV 值与另一边的不同。

Page last updated: 2013-06-25