【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[])
绑定姿势用于描述骨架处于初始状态时的变换信息,从而使顶点在后续可以按初始状态时与骨骼的相对位置进行运动。
这是一个与骨骼数量一致的矩阵数组,每个矩阵都是从网格的物体空间到对应骨骼空间的变换矩阵。