Home 3d蒙皮骨骼动画
Post
Cancel

3d蒙皮骨骼动画

所有蒙皮网格的变化都是由CPU计算得到的。会使CPU负担较重,蒙皮网格十分消耗CPU。

骨骼动画

  1. 骨骼点是父子关系的层级结构(Transform)。
  2. 蒙皮网格主要为渲染蒙皮网格动画服务,所以蒙皮网格除了3D模型数据外,还有骨骼数据及顶点权重数据
  3. 如果蒙皮网格上没有存储任何骨骼数据,那么它与普通网格 MeshRender 的作用没有任何区别,渲染的都是没有动画的3D模型。
  4. 蒙皮网格动画本质是用骨骼的方式去影响网格顶点,通过在每一帧里偏移模型网格上的各个顶点,让模型变形,从而形成动画的效果的。

骨骼动画的工作流程

  1. 使用Maya,3DMax等制作几何模型。
  2. 使用Maya,3DMax等在几何模型上构建骨骼点(bones),并计算出每个顶点受骨骼点影响的权重值(BoneWeight)。
  3. 动画师通过骨骼点的偏移,旋转,缩放等制作动画。
  4. 导入到Unity中作为关键帧动画(AnimationClip)。
  5. 播放动画时,AnimationClip 会在某个时间点上对需要改变的骨骼做关键帧,关键帧之间做平滑插值计算。
  6. 蒙皮网格在骨骼点关键帧基础上计算新的顶点位置。

骨骼点和及其权重

  1. 骨骼点本身存储在 SkinnedMeshRenderer 中。
  2. 每个顶点受影响的骨骼点序号及其权重存储在 Mesh 中。
  3. 骨骼点可以影响周围一定范围内的顶点,单一顶点也可以受到多个骨骼的影响。除了骨骼数据,模型中的每个顶点都有对其顶点本身影响最多的4个骨骼的权重值,Unity3D对这4个骨骼的权重值进行了存储,将它们存放在 BoneWeight 类型的 Struct 结构中,每个 Mesh 类都有一个 boneWeights 数组变量,用于记录所有顶点的骨骼权重值,那些没有骨骼动画的网格,就没有这些数据。
  4. 1 Bone、2Bones、4 Bones 等参数,表达的意思分别是一个顶点能被1个骨骼影响,或者被2个骨骼影响,或者被4个骨骼影响。每个顶点最多可以被4个骨骼点影响。被影响的骨骼数越多,CPU消耗在骨骼计算蒙皮上的时间就越长,消耗量越大。

武器挂点

  1. 从骨骼根节点出发,依次找到角色的躯干、胸部、右肩、右臂和右手,然后在右手下面创建空物体WeaponSlot,将空物体位置旋转归0。
  2. 之后匕首、手枪等道具模型都放在武器挂点下面(作为子物体),并根据具体模型的角度调整初始朝向。

SkinnedMeshRenderer

  1. SkinnedMeshRenderer.bones 中存储了所有骨骼点,骨骼点在蒙皮网格中是以 Transform 数组的形式存储的。
  2. Mesh.boneWeights 中存储了每个顶点被哪些骨骼点影响。(在网格中,而不是Renderer中) - boneIndex0~3 代表被影响的骨骼点的索引值。 - weight0~3 代表被 boneIndex0~3 索引的骨骼点所影响的权重值,权重在 0~1之间,且所有权重分量和为1.
  3. SkinnedMeshRenderer 用到的着色器不能使用 GPU Instancing。
This post is licensed under CC BY 4.0 by the author.
Contents