构建 Assimp 骨骼层次结构,从根开始

Construct Assimp bone hierarchy, beginning at the root

我正在使用 Assimp.net 将动画 .dae 文件导入我的 OpenTK 引擎并努力建立可用的分层骨骼结构。

在我关注的 tutorial 中,根骨骼或 "joint" 包含它的子关节列表,以及它们的子关节列表等等。

Assimp returns 每个导入的 Mesh 对象和 Bone 对象的列表,封装骨骼的 NameOffsetMatrixVertexWeights , 但与它的子骨骼或父骨骼无关。

包含 MeshScene 确实有一个总计 nodes 的列表(其中一些是骨头)并且这些确实有一个 parentName 值但是通过递归比较检查来构建层次结构很快就会变得混乱,而且还远未发挥作用。

我怎样才能隔离根骨骼,然后是子骨骼,然后是他们的子骨骼等等?

原来每个节点都包含一个 集合 的 children 称为 children 类型 NodeCollection,从那里我开发了以下内容解决方案。

要找到根骨骼,遍历 scene 中的每个 node 并检查它的名称是否在 bones 中找到mesh 中包含的列表,那么如果 node 的 parent 名称不在 bones 列表中,那么它一定是根骨骼。

要构建骨骼层次结构,从上面找到的 "root bone" 节点获取 children,然后在网格中找到匹配的名称bones 列表,并从那里提取所需的顶点权重和偏移矩阵。接下来,使用与上述相同的方法递归搜索那些 children 中的 children:遍历场景中的每个 node,直到找到匹配的 bone 名称,然后拉取bones 列表中 bone 的数据,然后反向执行,直到没有 children 剩余。

如果有更好的方法,我很想听听。