【Unity】网格数据结构

【Unity】网格数据结构

https://docs.unity.cn/cn/2022.3/Manual/AnatomyofaMesh.html

基本构成

网格由以下几部分数据组成:

  • 顶点:3D 空间中的位置集合以及可选的附加数据。
  • 拓扑:网格每个面的结构类型,默认情况下都是三角型。
  • 索引:描述如何将顶点组合成拓扑表面。

对于可变性网格,还包含些额外数据:

  • 混合形状:混合形状数据。
  • 绑定姿势:蒙皮网格中骨架基本姿势数据。

顶点数据

顶点数据由多个数组构成,每个数组负责存储一组顶点数据的元素(又称为顶点属性),数组的长度与顶点数量一致,以保证每个顶点对于一组顶点数据。

Unity 支持以下顶点属性:

  • 位置
  • 法线
  • 切线
  • 颜色
  • 纹理坐标
  • 混合指数和骨骼权重

位置(float3[])

表示顶点在对象空间中的位置,用于确定网格的表面。

法线(float3)

从顶点位置的曲面直接“向外”指向的方向,用于计算光照反射效果。

切线(float4)

在顶点位置沿曲面的“u”(水平纹理)轴指向的方向,其中 w 分量额外用于表示副切线方向(用于解决图形 API 手系差异),用于实现法线贴图映射。

法线、切线、副切线共同构成法线空间,借此才可以实现法线贴图映射。 副切线由计算得出,Unity 的默认计算方式是叉乘(法线,切线),正好构成左手坐标系,所以通常切线的 w 分量值为 1。

颜色(float4)

表示顶点的基色,可借此存储一些自定义顶点数据以实现特效。

纹理坐标(float2)

指示纹理的哪个位置与顶点位置的网格表面对齐,以实现纹理到网格表面的映射。

纹理坐标通常称为 UV, 而这些集合称为通道,最多 8 个通道(UV0~UV7)。默认情况下 Unity 使用 UV0 存储常规纹理 UV;UV1 存储光照贴图 UV;UV2 存储实时光照贴图 UV。

混合指数和骨骼权重(int,float)

混合指数是骨骼的索引,用于表示顶点受哪些骨骼的控制;骨骼权重则描述这些控制骨对顶点的影响程度。Unity 将两者放在一起存储。

过去 Unity 最多允许一个顶点受 4 根骨骼的影响(使用 BoneWeight 存储),现在则支持最多 256 个骨骼(使用 BoneWeight1 存储)。

拓扑学(enum)

拓扑描述网格所具有的面类型,其确定了索引缓冲区的数据结构。

Unity 支持以下拓扑类型:

  • 线条
  • 三角形(默认)
  • 四边形

索引数据(int[])

索引数组表示了网格面所引用的顶点数据在顶点属性数组中的位置,其布局受拓扑类型影响。

索引顶点的顺序将决定面的正反,能观察面的顶点索引顺序为顺时针的一面为正面。正反面将影响剔除功能的执行结果。

混合形状

混合形状存储了网格的不同形状的版本,Unity 通过对这些形状进行插值以实现变形效果,常用于实现人物表情动画。

混合形状的数据是“稀疏的”,只会存储受影响的顶点数据。数据包括位置、法线、切线的增量,以及用于表示对应顶点的索引值。索引值的具体映射与向 Unity 请求数据的方式有关。

绑定姿势(Matrix4x4[])

绑定姿势用于描述骨架处于初始状态时的变换信息,从而使顶点在后续可以按初始状态时与骨骼的相对位置进行运动。

这是一个与骨骼数量一致的矩阵数组,每个矩阵都是从网格的物体空间到对应骨骼空间的变换矩阵。


【Unity】网格数据结构
https://bdffzi-blog.pages.dev/posts/3454640855.html
作者
BDFFZI
发布于
2024年5月10日
许可协议