顶点表中的每一顶点除了带有位置,法向量,材质,纹理等基本信息外,还会指出有哪些骨骼影响了该顶点,影响权重又是多少。影响一个顶点的最大骨骼数一般取决于模型的设计和目标硬件平台的限制。比如,对于一个典型的人体骨架,一般只有在关节附近的顶点才会受到相邻几块骨骼的影响,而同时影响某一顶点的骨骼数,也不会超过四块。骨骼信息包括全部骨骼的数量和每一骨骼的具体信息。所有的骨骼按照父子关系组织成一棵树。树根代表整个骨架,其余每一节点包括叶子节点代表一根骨骼。每一根骨骼包括该骨骼在父骨骼坐标系中的变换矩阵,通过该变化矩阵确定了该骨骼在父骨骼坐标系中的位置。在动画信息中则保存了若干关键帧。每一关键帧指出了每一骨骼在该时刻相对于父骨骼坐标系的变换矩阵,当然也可以是该骨骼相对于父骨骼的位置,朝向等变动。在播放动画序列中的任一时刻:
f1)首先确定该时刻之前和之后的两个关键帧,然后按照该时刻与前后两个关键帧时刻的时间值插值计算出该时刻该骨骼相对于父骨骼的新变换矩阵,这个变换矩阵往往代表旋转变换,放缩变换也能接受,如果是平移变换矩阵,很容易将Mesh四分五裂。
2)对于皮肤网格中的每一个顶点,计算它在世界坐标中新的位置和朝向。首先找到影响该顶点的所有骨骼。然后计算每一骨骼对该顶点的影响。也就时说,计算在该骨骼独立作用下顶点的新位置。计算按照如下公式:
顶点的新位置最初状态顶点的位置最初状态骨骼世界变换矩阵的逆矩阵骨骼的新变换矩阵(I)
然后将所有这些新位置按照每一骨骼的影响权重加权求和。注意所有权重的和应该恰好为1。在公式(I)中,最初状态顶点的位置为什么首先要与最初状态骨骼世界变矩阵的逆矩阵相乘呢?前面说过,骨骼的新变换矩阵是相对于父骨骼变换的,另一方面这个新变换矩阵是世界变换矩阵,它的任何变换是相对于世界坐标系原点的。因此需要把最初状态顶点移动到相当于父骨骼节点是原点的位置上,再进行矩阵变换。
3)根据网格模型顶点的新位置和朝向绘制角色网格。
下面我们结合具体的图形API环境(Direct3D)来进一步介绍骨骼动画。
第一,了解骨骼结构(SkeletalStructures)和骨层级(Bo
eHierarchies):
骨骼结构就是连续很多的骨头(Bo
e)相结合,形成的骨层级。第一个骨头叫做根骨(rootbo
e)是形成骨骼结构的关键点。其它所有的骨骼作为孩子骨(childbo
e)或者兄弟骨(sibli
gbo
e)附加在根骨之上。所谓的“骨”用一个帧(frame)对象表示。在Directx中r