Unity3D:网格数据
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
网格数据
此页面包含有关网格包含的数据以及 Unity 如何在网格类中存储该数据的信息。
概述
网格由以下属性定义:
- 顶点:3D 空间中的位置集合,具有可选的附加属性。
- 拓扑:定义曲面每个面的结构类型。
- 索引:描述顶点如何组合以基于拓扑创建表面的整数集合。
除此之外,可变形网格还包含:
- 混合形状:描述网格的不同变形版本的数据,用于动画。
- 绑定姿势:描述蒙皮网格中骨架的“基本”姿势的数据。
顶点数据
顶点数据的元素称为顶点属性。
每个顶点都可以具有以下属性:
- 位置
- 正常
- 切线
- 颜色
- 多达 8 个纹理坐标
- 骨骼重量和混合指数(仅限蒙皮网格)
在内部,所有顶点数据存储在相同大小的单独数组中。如果您的网格包含具有 10 个顶点位置的数组,则它还具有具有 10 个元素的数组,用于它使用的每个其他顶点属性。
在 C# 中,Unity 使用 VertexAttribute 枚举描述可用的顶点属性。您可以使用 Mesh.HasVertexAttribute 函数检查类的实例是否具有给定的顶点属性。Mesh
位置
顶点位置表示顶点在对象空间中的位置。
Unity 使用此值来确定网格的表面。
所有网格都需要此顶点属性。
在类中,访问此数据的最简单方法是使用 Mesh.GetVertices 和 Mesh.SetVertices。Unity 还将此数据存储在 Mesh.vertices 中,但此旧属性效率较低且用户友好。Mesh
正常
顶点法线表示从曲面直接“向外”指向顶点位置的方向。
Unity 使用此值来计算光线从网格表面反射的方式。
此顶点属性是可选的。
在类中,访问此数据的最简单方法是使用 Mesh.GetNormals 和 Mesh.SetNormals。Unity 还将此数据存储在 Mesh.normals 中,但此旧属性效率较低且用户友好。Mesh
切线
顶点切线表示在顶点位置沿曲面的“u”(水平纹理)轴指向的方向。
Unity 将顶点切线与附加数据段存储在四分量向量中。矢量的 x,y,z 分量描述切线,矢量的 w 分量描述其方向。Unity 使用 w 值来计算双法线,双法线是切线和法线的叉积。
Unity 在法线贴图中使用切线值和双法线值。
此顶点属性是可选的。
在类中,访问此数据的最简单方法是使用 Mesh.GetTangents 和 Mesh.SetTangents。Unity 还将此数据存储在 Mesh.tangents 中,但此旧属性效率较低且用户友好。Mesh
纹理坐标 (UV)
一个网格最多可以包含八组纹理坐标。纹理坐标通常称为 UV,而纹理集称为通道。
Unity 在将纹理“包裹”在网格周围时使用纹理坐标。UV 指示纹理的哪一部分与顶点位置的网格表面对齐。
UV通道通常称为第一个通道的“UV0”,第二个通道的“UV1”,依此类推,直到“UV7”。通道分别映射到着色器语义 、 ,依此类推,直至 。TEXCOORD0TEXCOORD1TEXCOORD7
默认情况下,Unity 使用第一个通道 (UV0) 来存储常规纹理(如漫反射贴图和高光贴图)的 UV。Unity 可以使用第二个通道 (UV1) 来存储烘焙光照贴图 UV,使用第三个通道 (UV2) 来存储实时光照贴图 UV 的输入数据。有关光照贴图 UV 以及 Unity 如何使用这些通道的更多信息,请参阅光照贴图 UV。
所有八个纹理坐标属性都是可选的。
在类中,访问此数据的最简单方法是使用 Mesh.GetUV 和 Mesh.SetUV。Unity 还将此数据存储在以下属性中:Mesh.uv、Mesh.uv2、Mesh.uv3 等,直至 Mesh.uv8。 请注意,这些较旧的属性效率较低且用户友好。Mesh
颜色
顶点颜色表示顶点的基色(如果有)。
此颜色独立于网格可能使用的任何纹理而存在。
此顶点属性是可选的。
在类中,访问此数据的最简单方法是使用 Mesh.GetColors 和 Mesh.SetColors。Unity 还将此数据存储在 Mesh.colors 中,但此旧属性效率较低且用户友好。Mesh
混合指数和骨重
在蒙皮网格中,混合索引指示哪些骨骼影响顶点,骨骼权重描述这些骨骼对顶点的影响程度。
在 Unity 中,这些顶点属性存储在一起。
Unity 使用混合索引和骨骼权重根据骨架的移动使蒙皮网格变形。有关更多信息,请参见蒙皮网格渲染器。
蒙皮网格需要这些顶点属性。
过去,Unity 最多只允许 4 个骨骼影响一个顶点。它将此数据存储在 Mesh.boneWeights 数组中的 BoneWeight 结构中。现在,Unity 允许多达 256 个骨骼影响顶点。它将此数据存储在 BoneWeight1 结构中,您可以使用 Mesh.GetAllBoneWeights 和 Mesh.SetBoneWeights 访问它。 有关更多信息,请阅读链接的 API 文档。
拓扑学
拓扑描述网格具有的面类型。
网格的拓扑定义了索引缓冲区的结构,而索引缓冲区又描述了顶点位置如何组合成面。每种类型的拓扑在索引数组中使用不同数量的元素来定义单个面。
Unity 支持以下网格拓扑:
- 三角形
- 四
- 线条
- 线条
- 点
注意:点拓扑不会创建面;相反,Unity 在每个位置渲染一个点。所有其他网格拓扑使用多个索引来创建面或边。
在类中,您可以使用 Mesh.GetTopology 获取拓扑,并将其设置为 Mesh.SetIndex 的参数。Mesh
有关支持的网格拓扑的更多信息,请参阅 MeshTopology 枚举的文档。
注意:必须先将使用其他建模技术(例如 NURBS 或 NURMS/细分曲面建模)的任何网格转换为建模软件中支持的格式,然后才能在 Unity 中使用它们。
索引数据
索引数组包含引用顶点位置数组中的元素的整数。这些整数称为索引。
Unity 使用索引将顶点位置连接到面中。构成每个面的索引数取决于网格的拓扑。
在类中,您可以使用 Mesh.GetIndex 获取此数据,并使用 Mesh.SetIndices 对其进行设置。Unity 还将此数据存储在 Mesh.triangles 中,但此旧属性效率较低且用户友好。Mesh
注意:点拓扑不会创建面;相反,Unity 在每个位置渲染一个点。所有其他网格拓扑使用多个索引来创建面或边。
例如,对于具有包含以下值的索引数组的网格:
0,1,2,3,4,5
如果网格具有三角形拓扑,则前三个元素 (0,1,2) 标识一个三角形,接下来的三个元素 (3, 4, 5) 标识另一个三角形。 顶点可以贡献的面数没有限制。这意味着同一顶点可以多次出现在索引数组中。例如,索引数组可以包含以下值:
0,1,2,1,2,3
如果网格具有三角形拓扑,则前三个元素 (0,1,2) 标识一个三角形,接下来的三个元素 (1,2,3) 标识与第一个元素共享顶点的另一个三角形。
上链顺序
索引数组中每个组中顶点的顺序称为绕组顺序。Unity 使用缠绕顺序来确定人脸是正面还是背面,进而确定是应该渲染人脸还是剔除面部(将其从渲染中排除)。默认情况下,Unity 渲染正面多边形并剔除背面多边形。 Unity 使用顺时针缠绕顺序,这意味着 Unity 认为索引沿顺时针方向连接的任何面都朝前。

上图演示了 Unity 如何使用绕线顺序。每个面中顶点的顺序决定了该面的法线方向,Unity 会将其与当前摄像机透视的向前方向进行比较。如果法线指向远离当前摄像机的前进方向,则为后向。 较近的三角形是有序的 (1, 2, 3),这是相对于当前透视的顺时针方向,因此三角形是面向前方的。进一步的三角形是有序的(4,5,6),从这个角度来看,这是一个逆时针方向,因此三角形是面向背面的。
混合形状
混合形状描述变形为不同形状的网格版本。统一在这些形状之间插值。将混合形状用于变形目标动画,这是面部动画的常用技术。
有关混合形状的详细信息,请参阅使用混合形状。
此数据是可选的。
绑定姿势
在蒙皮网格中,骨骼的绑定姿势描述骨架处于默认位置时的位置(也称为其绑定姿势或休息姿势)。
在类中,您可以使用 Mesh.bindposes 获取和设置此数据。每个元素都包含具有相同索引的骨骼的数据。Mesh
蒙皮网格需要此数据。
由3D建模学习工作室整理翻译,转载请注明出处!