第二部分 骨骼
骨骼(skeleton)通常由刚性的关节(joint)层阶结构构成。
技术上来说,关节是直接控制的物体,而骨头只是关节之间的空位。游戏引擎并不在意骨头,只在意关节。游戏业界一般说的”骨头”99%的情况是指关节。
1.骨骼层阶结构
骨骼的关节形成层阶结构即树状结构。选择其中一个关节为根节点,其他关节则是子节点。
我们通常会把每个关节赋予0~(N-1)的索引。因为每个关节有且仅有一个父关节,只要在每个关节存储其父节点的索引,就能表示整个层阶结构。
2.内存中表示骨骼
骨骼通常由一个细小的数据结构表示,该结构含有关节数组。关节的存储次序通常会保证每个子节点都位于其父节点之后,这意味着数组第一个元素是根关节。因为数组查找很高效,所以无论动画还是蒙皮网格都会用关节索引(joint index)引用关节。
- 每个关节数据结构通常有以下信息:
- 关节名称。(字符串或者32位字符串散列标识符)
- 父节点的索引。
- 关节绑定姿势的逆变换。
- 关节和骨骼的数据结构伪代码:
struct Joint
{
Matrix4x3 invBindPose;
const char* name;
U8 parent;
}
struct Skeleton
{
U32 jointCount;
Joint* joints;
}
(END)