https://www.cnblogs.com/zblade/p/6986173.html 浅谈Unity3D 骨骼动画
https://www.cnblogs.com/tekkaman/p/7702363.html Avatar
三种 Rig
fbx importer 的Rig有三种Animation Type:
1)legacy:老动画系统,没有avatar,没有animator controller。
2)generic:MecAnim,通用的avatar,有animator controller,无法 retargeting animation。
3)humanoid:MecAnim,人型avatar,有animator controler,可以 retargeting animation。
从动画数据的角度来说,三者一般都采用关键帧技术,即只给出关键帧的数据,其他帧的数据使用插值得到。但由于这三种技术的不同,关键帧的数据是不一样的。
每个顶点可以被多个骨骼所控制,这样在关节处的顶点由于同时受到父子骨骼的拉扯而改变位置就消除了裂缝。
http://www.cnblogs.com/zhanglitong/p/3196752.html OpenGL10-骨骼动画原理篇(1)
当前有两种模型动画的方式:顶点动画和骨骼动画。顶点动画中,每帧动画其实就是模型特定姿态的一个“快照”。通过在帧之间插值的方法,引擎可以得到平滑的动画效果。在骨骼动画中,模型具有互相连接的“骨骼”组成的骨架结构,通过改变骨骼的朝向和位置来为模型生成动画。
骨骼动画的原理:
正如其名,这种动画中包含骨骼(Bone)和蒙皮(Skinned Mesh)两个部分一部分是Bone(骨头),一部分是Skin(皮).就像人体的组成一样。人要想做动作,骨头要动起来,然后皮就被骨头带动起来,按照这样的理论,就产生了蒙皮动画。在三维模型当中。bone就是骨头,皮就是skin mesh,mesh的其实就是模型来,加上skin,说明这个模型的意义,做表皮的。
当我们动一个关节的时候,会带动一部分肌肉动起来,而不是只要动一个关节全身都在动。那么我们就可以这样来说,一个骨头动,会影响到一部分的肉和皮动。
我们定义个如下结构体(伪代码)
class Point
{
float x,y,z; //! 肌肉的位置
int arBone[n]; //! 影响肌肉的骨头
float arWeight[n] //! 每一个骨头对肌肉的影响度,例如 肘关节的影响度对肱二头肌很多,而肩关节要少一点。
};
如果美术做了一个动画有5秒钟,每一秒播放60帧来计算,我们要记录非常多的骨头的信息,小下面这样:假设人有100个骨头Bone person[100]一秒钟60帧 × 5秒 × 100,这个就是我们要记录的数据量.
假设我们记录了10个关键点其他的数据根据时间按照一定的插值算法进行插值,那么数据量就骤然降低非常多呢。出于这样的想法,我们增加了一个新的概念,关键帧。
下面我们使用程序的角度来描述下该问题:
1. 获取到所有的骨骼数据(可使用矩阵存储)
Bone bones[n];
2. 获取到关键帧数据
Bone arKeyFrame[n][KeyNumber];
3 获取到皮肤(顶点数据)
Vertex verts[vNumber];
4 通过插值计算出来新的骨骼位置
Bone timeBone[n];
5 根据计算出来骨骼来计算顶点数据
Vert temp[vNumber];
一个定点的声明如下:
struct Vertex
{
//! 颜色
float r, g, b, a;
//! 位置
float x, y, z;
//! 影响度
float weights[2];
//! 矩阵的索引
short matrixIndices[2];
//! 影响整个定点的骨头个数
short numBones;
};