第三部分 姿势
把关节任意旋转、平移、甚至缩放,就能让骨骼摆出各种姿势。一个关节的姿势定义为关节相对某参考系的位置、定向、缩放。
关节的姿势通常以4x4或4x3矩阵表示或者表示为SQT(scale-quaternion-translation)数据结构。
骨骼的姿势仅仅是其所有关节的姿势的集合,并简单地以SQT数组表示。
1.绑定姿势
绑定姿势(bind pose)是三维网格绑定至骨骼之前的姿势。换句话说就是把网格当成完全不涉及骨骼的普通网格来渲染的姿势。
绑定姿势又称参考姿势或放松姿势。绑定姿势有时也称为T-pose,因为通常会把角色摆成T字形使得四肢远离身体更容易绑定顶点。
2.局部姿势
我们用局部姿势(local pose)描述相对父关节的姿势,局部姿势能让关节自然地移动。局部姿势几乎都存储为SQT格式。
数学上关节姿势就是一个仿射变换,每个关节都可以表示为一个4x4仿射变换矩阵,整个骨骼姿势可以写成所有矩阵的集合。
- ◆关于关节缩放:
有些引擎不支持关节缩放,有些引起支持统一缩放,有些引擎支持非统一缩放,但是游戏引擎几乎都不容许切变。
在姿势和动画中忽略或者限制缩放有很多好处。例如可以节省内存、可以防止包围球变成椭球增加剔除计算量。
- ◆关节姿势通常表示为SQT格式:
struct JointPose
{
Quaternion rot;//旋转
Vector3 trans;//位移
float scale;//统一缩放
}
3.全局姿势
把关节姿势表示为模型空间会很方便,称为全局姿势(global pose)。有些引擎用矩阵表示全局姿势,有些引擎则用SQT格式表示。
数学上,某关节的模型空间姿势,可以通过从该关节遍历至根关节时,在每个关节乘以其局部姿势算出。
4.骨骼全局姿势和局部姿势的存储
伪代码:
struct SkeletonPose
{
Skeleton * skeleton;//骨骼对象
JointPose * ajointpose;//多个局部关节姿势
Matrix4x4 * aGlobalPose;//多个全局关节姿势
}
(END)