所有蒙皮网格的变化都是由CPU计算得到的。会使CPU负担较重,蒙皮网格十分消耗CPU。
骨骼动画
- 骨骼点是父子关系的层级结构(
Transform
)。 - 蒙皮网格主要为渲染蒙皮网格动画服务,所以蒙皮网格除了3D模型数据外,还有骨骼数据及顶点权重数据。
- 如果蒙皮网格上没有存储任何骨骼数据,那么它与普通网格 MeshRender 的作用没有任何区别,渲染的都是没有动画的3D模型。
- 蒙皮网格动画本质是用骨骼的方式去影响网格顶点,通过在每一帧里偏移模型网格上的各个顶点,让模型变形,从而形成动画的效果的。
骨骼动画的工作流程
- 使用Maya,3DMax等制作几何模型。
- 使用Maya,3DMax等在几何模型上构建骨骼点(bones),并计算出每个顶点受骨骼点影响的权重值(BoneWeight)。
- 动画师通过骨骼点的偏移,旋转,缩放等制作动画。
- 导入到Unity中作为关键帧动画(AnimationClip)。
- 播放动画时,AnimationClip 会在某个时间点上对需要改变的骨骼做关键帧,关键帧之间做平滑插值计算。
- 蒙皮网格在骨骼点关键帧基础上计算新的顶点位置。
骨骼点和及其权重
- 骨骼点本身存储在
SkinnedMeshRenderer
中。 - 每个顶点受影响的骨骼点序号及其权重存储在
Mesh
中。 - 骨骼点可以影响周围一定范围内的顶点,单一顶点也可以受到多个骨骼的影响。除了骨骼数据,模型中的每个顶点都有对其顶点本身影响最多的4个骨骼的权重值,Unity3D对这4个骨骼的权重值进行了存储,将它们存放在
BoneWeight
类型的 Struct 结构中,每个 Mesh 类都有一个boneWeights
数组变量,用于记录所有顶点的骨骼权重值,那些没有骨骼动画的网格,就没有这些数据。 1 Bone、2Bones、4 Bones
等参数,表达的意思分别是一个顶点能被1个骨骼影响,或者被2个骨骼影响,或者被4个骨骼影响。每个顶点最多可以被4个骨骼点影响。被影响的骨骼数越多,CPU消耗在骨骼计算蒙皮上的时间就越长,消耗量越大。
武器挂点
- 从骨骼根节点出发,依次找到角色的躯干、胸部、右肩、右臂和右手,然后在右手下面创建空物体WeaponSlot,将空物体位置旋转归0。
- 之后匕首、手枪等道具模型都放在武器挂点下面(作为子物体),并根据具体模型的角度调整初始朝向。
SkinnedMeshRenderer
- 在
SkinnedMeshRenderer.bones
中存储了所有骨骼点,骨骼点在蒙皮网格中是以Transform
数组的形式存储的。 - 在
Mesh.boneWeights
中存储了每个顶点被哪些骨骼点影响。(在网格中,而不是Renderer中) -boneIndex0~3
代表被影响的骨骼点的索引值。 -weight0~3
代表被 boneIndex0~3 索引的骨骼点所影响的权重值,权重在 0~1之间,且所有权重分量和为1. - SkinnedMeshRenderer 用到的着色器不能使用 GPU Instancing。