glTF 2.0 规范§ Skins说(强调我的)
每个皮肤都由inverseBindMatrices
属性定义(它指向一个带有 IBM 数据的访问器),用于将被皮肤的坐标带入与每个关节相同的空间;和一个joints
数组属性,它列出了节点索引,用作动画皮肤的关节。关节的顺序在skin.joints
数组中定义,它必须与inverseBindMatrices
数据的顺序相匹配。
这直接回答了你的问题。我将在这里给出更详细的解释:
- 有两个ID:节点ID和联合ID
- 节点 ID:
nodes
数组中节点的索引
- 关节 ID:
joints
数组
中关节的索引
- 数组中的关节
joints
由节点 ID 指定;联合ID虽然不同
"nodes" : [
{ // 0
"name" : "Cave"
},
{ // 1
"name" : "TailBone",
},
// snipped for brievity
{ // 29
"name" : "Root"
}
],
"skins" : [
{
"inverseBindMatrices" : 6,
"joints" : [
29,
1,
]
}
]
对于这个.glTF
,inverseBindMatrix[0]
对于joint[0]
,这个关节由节点 29 给出;inverseBindMatrix[1]
对于joint[1]
,这个连接由节点 1 给出。
如果我们移动它以使索引从 0 开始,我们得到
{0,3,5,2,1,4}
我不认为这是正确的。你为什么要转?您基本上只需要节点 ID 到骨骼 ID 之间的映射,直到您消化 glTF 数据并将其加载到您自己的结构中(之后节点 ID 与骨骼 ID 不同,没有用处)
Node Bone
29 0
1 1
计算skin
矩阵时,请确保遵循joints
数组的顺序。在上面的例子中,skin[0]
应该为joints[0]
ie 为节点 29。