骨骼动画原理

3D动画

提供一种机制,描述各定点位置随时间的变化

骨骼动画简介

  • 顶点动画
    早期的3D模型动画,就是把每帧的顶点数据输出到文件中,所以3D模型的一个动作就是一系列的模型,这样做的目的主要是硬件资源有限,没有多余的时间去计算顶点。


    骨骼动画原理_第1张图片
  • 骨骼动画
    随着动画越来越精细,将每帧的顶点数据输出到文件数据量太大。人们想出一种办法,将3D模型抽象为一些关键点的集合,整个模型的运动可以当做是这些关键点的运动,而模型的顶点只是受这些关键点的影响而已。这些关键点就称为骨骼
骨骼动画原理_第2张图片
骨骼动画原理_第3张图片

skinned mesh

利用vertex blend(顶点混合),对于关节附近的点,由多段骨骼影响,对不同骨骼赋予不同的权值。目前我们所使用的最大受骨骼影响数为4.

  • 更加真实,灵活

  • 制作效率高

  • 运行时交互

  • 共享动画

  • 要求一定的性能

  • 骨架父子关系,父骨骼带动子骨骼运动

  • 骨骼带动顶点运动

程序层面

  • 肘关节动->手臂动
  • 肩关节动->手臂动
  • 身体的肉动是由一系列关节的运动所影响,但影响的程度不同
class Point
{

  float x,y,z;     //顶点的位置

      int  Bone[n];  //影响肌肉的骨头

      float Weight[n]  //每一个骨头对顶点的影响度,例如 肘关节的影响度对手臂很多,而肩关节要少。

}

那么一个顶点的位置就是:

for( int i = 0 ;i < n ; ++ i)
{

   (x,y,z) += 骨头[i] * 骨头的影响度[i];

}

骨头在程序上的意义是什么,其可以旋转,有位移,有缩放,其实就是矩阵

制作过程

rigging:创建骨骼的过程
skinning : 把点映射到骨骼的过程

static 3D model -> rigging - skinning -> animation

数据格式

骨骼动画原理_第4张图片

解析过程

  • 顶点数据中要有骨头信息和骨头权重
  • c3t文件中要有完整的骨架信息
  • nodes数据中要有网格对应的骨头信息,骨头的坐标空间转换的逆矩阵

关键帧

  • Sprite3D draw

  • skeleton->updateBoneMatrix

  • meshSkin getMatrixPalette world matrix * invPos

  • 将palette矩阵传到shader

  • animation信息改变Bone‘s local Matrix

你可能感兴趣的:(骨骼动画原理)