骨骼动画(Skeletal Animation)又叫Bone Animation,它与关键帧动画(Key-frame Animation)相比,占用空间小,因为它不需要象关键帧动画那样要存储每一帧的各个顶点的数据,而是只需要存储每一帧的骨骼,骨骼与顶点相比,当然要少得多。所以骨骼动画有很多优势,当然其技术难度也很高。我个人觉得动画在计算机图形学中是一个十分重要的内容,不管是在游戏、电影动画还是虚拟现实中,生动逼真的动画(人、动物等)会使之增色不少。所以我决定今后的研究方向就是计算机动画。目前在研究Skeletal Animation,这是目前动画技术中的主流。欢迎同好与我交流,共同提高!
骨骼动画的实现思路是从我们人的身体的运动方式而来的(所以VR就是对现实世界的虚拟嘛 :-))。动画人物的身体(肉、皮肤)是一个网格(Mesh)模型,网格的内部是一个骨架结构。当人物的骨架运动时,身体就会跟着骨架一起运动。骨架是由一定数目的骨骼组成的层次结构,每一个骨骼的排列和连接关系对整个骨架的运动有很重要的影响。每一个骨骼数据都包含其自身的动画数据。和每个骨架相关联的是一个“蒙皮”(Skin)模型,它提供动画绘制所需要的几何模型(Vertex,Normal,etc)和纹理材质信息。每个顶点都有相应的权值(Weight),这些权值定义了骨骼的运动对有关顶点的影响因子。当把动画人物的姿势和全局运动信息作用到骨架上时,这个“蒙皮”模型就会跟随骨架一起运动。
所以关键是对骨架进行动画生成,生成的方法也是用关键帧。关键帧动画是对人物的网格(Mesh)模型采用关键帧生成动画;而骨骼动画则是对人物的骨架采用关键帧生成动画,然后再让网格(Mesh)模型跟随骨架运动。关键帧动画实现的2个关键点是:关键帧的选取和中间帧的插补。
关键帧的指定有2种基本的方法:前向动力学(FK)和逆向动力学(IK)。前向动力学用一组节点的角度来找到末端受动器的位置;而逆向动力学则是找到将末端受动器置于所要位置所需的一组节点角度。前向动力学的优点是:计算简单,运算速度快,缺点是:需指定每个关节的角度和位置,而由于骨架的各个节点之间有内在的关联性,直接指定各关节的值很容易产生不自然协调的动作;逆向动力学的优点是:只需指定主要关节点的位置,负担轻,缺点是:计算模型比较复杂,开发者需要机械运动和动力学、几何学以及向量数学等方面的相关知识。
中间帧的插值分2步:(1) 根据当前时间,通过插值计算出每个骨骼的旋转、平移等值,形成中间帧的骨架。插值算法一般采用四元数(Quternion)的球面线性插值(Spherical linear interpolation)SLERP,SLERP特别适合在两个方位之间进行插值,不会出现像对欧拉角插值那样出现万象锁的现象,而且这种插值能产生更平滑和连续的旋转,表达方式也很简洁;(2) 根据骨架的变化情况,插值计算出骨架的“蒙皮”模型的各个顶点的位置变化。对于某个特定骨骼,“蒙皮”模型的顶点变换矩阵=初始姿势的变换矩阵的逆×姿势变换后的矩阵。另外还要考虑顶点可能受多个骨骼运动的影响。