用Unity做游戏经常会用到3D角色,也就会用到骨骼动画。骨骼动画对性能的影响其实非常大的,在说这个问题之前,先来说说骨骼动画的原理。
我之前做过多种骨骼动画,包括写过2D的骨骼动画系统(类似于现在比较流行的龙骨系统),也在flash的stage3D里面写过3D的骨骼模型动画。骨骼动画的原理实际上都是一样的:
首先你需要有一个模型,2D或者3D的,这些模型是由顶点组成的,2d模型的顶点就是一个个四边形的四个顶点,3D模型的顶点就是每个Mesh网格的三角面顶点。
然后,你需要搭建一套骨骼,这些骨骼是树形结构的,也就是有父子连接关系的,父级骨骼在做运动的时候,子级骨骼是跟随父级骨骼运动,在这个基础上然后子级也可以自己运动而不影响父级骨骼。
接下来,你需要把模型的顶点和骨骼做一个对应关系,这就是所谓的蒙皮权重。蒙皮要做的事情,是指定某个顶点受到多少根骨骼的影响,然后在骨骼运动的时候,顶点根据权重的百分比来跟随骨骼运动。比如一个顶点是受到了2跟骨骼的影响,第一根骨骼的权重是30%,第二根骨骼的权重是70%。在两根骨骼同时移动的时候,第一根骨骼向左移动了10米,第二根骨骼向右移动了10米,假若向右是正方向,那么这个顶点实际移动的位置应该就是-10*0.3+10*0.7 = 4,也就是向右移动了4米。在实际的计算中,我们不会这么简单的乘以百分比,是会用矩阵来运算,分别算出正常受到每一根骨骼矩阵影响之后该顶点的最终坐标,然后再乘以百分比相加。
最后再来说说骨骼父子关系。每一个子级的骨骼,需要先获取到它的父级,通过矩阵来转换局部坐标系