构建 Assimp 骨骼层次结构,从根开始
Construct Assimp bone hierarchy, beginning at the root
我正在使用 Assimp.net 将动画 .dae 文件导入我的 OpenTK 引擎并努力建立可用的分层骨骼结构。
在我关注的 tutorial 中,根骨骼或 "joint" 包含它的子关节列表,以及它们的子关节列表等等。
Assimp returns 每个导入的 Mesh
对象和 Bone
对象的列表,封装骨骼的 Name
、OffsetMatrix
和 VertexWeights
, 但与它的子骨骼或父骨骼无关。
包含 Mesh
的 Scene
确实有一个总计 nodes
的列表(其中一些是骨头)并且这些确实有一个 parentName
值但是通过递归比较检查来构建层次结构很快就会变得混乱,而且还远未发挥作用。
我怎样才能隔离根骨骼,然后是子骨骼,然后是他们的子骨骼等等?
原来每个节点都包含一个 集合 的 children 称为 children
类型 NodeCollection
,从那里我开发了以下内容解决方案。
要找到根骨骼,遍历 scene
中的每个 node
并检查它的名称是否在 bones
中找到mesh
中包含的列表,那么如果 node
的 parent 名称不在 bones
列表中,那么它一定是根骨骼。
要构建骨骼层次结构,从上面找到的 "root bone" 节点获取 children
,然后在网格中找到匹配的名称bones
列表,并从那里提取所需的顶点权重和偏移矩阵。接下来,使用与上述相同的方法递归搜索那些 children 中的 children:遍历场景中的每个 node
,直到找到匹配的 bone
名称,然后拉取bones
列表中 bone
的数据,然后反向执行,直到没有 children 剩余。
如果有更好的方法,我很想听听。
我正在使用 Assimp.net 将动画 .dae 文件导入我的 OpenTK 引擎并努力建立可用的分层骨骼结构。
在我关注的 tutorial 中,根骨骼或 "joint" 包含它的子关节列表,以及它们的子关节列表等等。
Assimp returns 每个导入的 Mesh
对象和 Bone
对象的列表,封装骨骼的 Name
、OffsetMatrix
和 VertexWeights
, 但与它的子骨骼或父骨骼无关。
包含 Mesh
的 Scene
确实有一个总计 nodes
的列表(其中一些是骨头)并且这些确实有一个 parentName
值但是通过递归比较检查来构建层次结构很快就会变得混乱,而且还远未发挥作用。
我怎样才能隔离根骨骼,然后是子骨骼,然后是他们的子骨骼等等?
原来每个节点都包含一个 集合 的 children 称为 children
类型 NodeCollection
,从那里我开发了以下内容解决方案。
要找到根骨骼,遍历 scene
中的每个 node
并检查它的名称是否在 bones
中找到mesh
中包含的列表,那么如果 node
的 parent 名称不在 bones
列表中,那么它一定是根骨骼。
要构建骨骼层次结构,从上面找到的 "root bone" 节点获取 children
,然后在网格中找到匹配的名称bones
列表,并从那里提取所需的顶点权重和偏移矩阵。接下来,使用与上述相同的方法递归搜索那些 children 中的 children:遍历场景中的每个 node
,直到找到匹配的 bone
名称,然后拉取bones
列表中 bone
的数据,然后反向执行,直到没有 children 剩余。
如果有更好的方法,我很想听听。