3D动画
提供一种机制,描述各定点位置随时间的变化
骨骼动画简介
-
顶点动画
早期的3D模型动画,就是把每帧的顶点数据输出到文件中,所以3D模型的一个动作就是一系列的模型,这样做的目的主要是硬件资源有限,没有多余的时间去计算顶点。
- 骨骼动画
随着动画越来越精细,将每帧的顶点数据输出到文件数据量太大。人们想出一种办法,将3D模型抽象为一些关键点的集合,整个模型的运动可以当做是这些关键点的运动,而模型的顶点只是受这些关键点的影响而已。这些关键点就称为骨骼
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
数据格式
解析过程
- 顶点数据中要有骨头信息和骨头权重
- c3t文件中要有完整的骨架信息
- nodes数据中要有网格对应的骨头信息,骨头的坐标空间转换的逆矩阵
关键帧
Sprite3D draw
skeleton->updateBoneMatrix
meshSkin getMatrixPalette world matrix * invPos
将palette矩阵传到shader
animation信息改变Bone‘s local Matrix