zhouqijie

第二部分 骨骼

骨骼(skeleton)通常由刚性的关节(joint)层阶结构构成。

技术上来说,关节是直接控制的物体,而骨头只是关节之间的空位。游戏引擎并不在意骨头,只在意关节。游戏业界一般说的”骨头”99%的情况是指关节。

1.骨骼层阶结构

骨骼的关节形成层阶结构即树状结构。选择其中一个关节为根节点,其他关节则是子节点。

我们通常会把每个关节赋予0~(N-1)的索引。因为每个关节有且仅有一个父关节,只要在每个关节存储其父节点的索引,就能表示整个层阶结构。

2.内存中表示骨骼

骨骼通常由一个细小的数据结构表示,该结构含有关节数组。关节的存储次序通常会保证每个子节点都位于其父节点之后,这意味着数组第一个元素是根关节。因为数组查找很高效,所以无论动画还是蒙皮网格都会用关节索引(joint index)引用关节。

  1. 关节名称。(字符串或者32位字符串散列标识符)
  2. 父节点的索引。
  3. 关节绑定姿势的逆变换。
struct Joint
{
    Matrix4x3 invBindPose;
    const char* name;
    U8 parent;
}
struct Skeleton
{
    U32 jointCount;
    Joint* joints;
}

(END)