zhouqijie

第三部分 姿势

把关节任意旋转、平移、甚至缩放,就能让骨骼摆出各种姿势。一个关节的姿势定义为关节相对某参考系的位置、定向、缩放。

关节的姿势通常以4x4或4x3矩阵表示或者表示为SQT(scale-quaternion-translation)数据结构。

骨骼的姿势仅仅是其所有关节的姿势的集合,并简单地以SQT数组表示。

1.绑定姿势

绑定姿势(bind pose)是三维网格绑定至骨骼之前的姿势。换句话说就是把网格当成完全不涉及骨骼的普通网格来渲染的姿势。

绑定姿势又称参考姿势或放松姿势。绑定姿势有时也称为T-pose,因为通常会把角色摆成T字形使得四肢远离身体更容易绑定顶点。

2.局部姿势

我们用局部姿势(local pose)描述相对父关节的姿势,局部姿势能让关节自然地移动。局部姿势几乎都存储为SQT格式。

数学上关节姿势就是一个仿射变换,每个关节都可以表示为一个4x4仿射变换矩阵,整个骨骼姿势可以写成所有矩阵的集合。

有些引擎不支持关节缩放,有些引起支持统一缩放,有些引擎支持非统一缩放,但是游戏引擎几乎都不容许切变。

在姿势和动画中忽略或者限制缩放有很多好处。例如可以节省内存、可以防止包围球变成椭球增加剔除计算量。

struct JointPose
{
    Quaternion rot;//旋转
    Vector3 trans;//位移
    float scale;//统一缩放
}

3.全局姿势

把关节姿势表示为模型空间会很方便,称为全局姿势(global pose)。有些引擎用矩阵表示全局姿势,有些引擎则用SQT格式表示。

数学上,某关节的模型空间姿势,可以通过从该关节遍历至根关节时,在每个关节乘以其局部姿势算出。

4.骨骼全局姿势和局部姿势的存储

伪代码:

struct SkeletonPose
{
    Skeleton * skeleton;//骨骼对象
    JointPose * ajointpose;//多个局部关节姿势
    Matrix4x4 * aGlobalPose;//多个全局关节姿势
}

(END)