1

glTF 文件为每个皮肤定义了一个反向绑定矩阵数组和一个关节列表。

假设关节列表是:

{2,5,7,4,3,6}

如果我们移动它以使索引从 0 开始,我们得到

{0,3,5,2,1,4}

在这种情况下inverse_matrix[2]可以参考两件事之一。它可以引用数组中的第二个关节,即关节 5,也可以引用关节 2。

这个完全相同的问题适用于权重数组。

换一种方式。如果从 gltf 文件中获取数据并将缓冲区加载到着色器中。我需要弄清楚如何将着色器中的顶点索引映射到其相应的 4 个皮肤矩阵。

因此,如果joints[2] maps to (3,1,0,0)

我需要知道我是否应该在ibm[3]andibm[1]ibm[2]and处获取逆绑定矩阵ibm[3](因为 at 的joints[3]值为 2)。

我希望这不会令人困惑。

4

1 回答 1

1

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,
            ]
        }
    ]

对于这个.glTFinverseBindMatrix[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。

于 2021-05-04T07:00:48.483 回答