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

时间:2018-07-07 16:41:13

标签: c# opengl opentk assimp

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

在我跟踪的tutorial中,根骨骼或“关节”包含其子关节的列表,以及其子关节的列表,依此类推。

Assimp返回每个导入的Mesh对象,其中包含Bone对象的列表,并具有骨骼的NameOffsetMatrixVertexWeights的含义,但是关于它的子元素什么都没有或父骨头。

包含Scene的{​​{1}}确实有一个总计Mesh的列表(其中一些是骨骼),并且确实具有nodes的值,但是通过递归比较检查的层次结构很快变得混乱不堪,而且远不能发挥作用。

如何隔离根骨,然后是孩子,然后是孩子,等等?

1 个答案:

答案 0 :(得分:1)

找出每个节点包含其子集的{em>集合,它们的子集类型为this.payment = new PayPalPayment('1', 'INR', 'sale', 'TV'); this.payPal.init({ PayPalEnvironmentProduction: '', PayPalEnvironmentSandbox: 'token' }).then(() => { this.payPal.prepareToRender(this.payPalEnvironment, new PayPalConfiguration({})).then(() => { this.payPal.renderSinglePaymentUI(this.payment).then((response) => { // alert(`Successfully paid. Status = ${response.response.state}`); }, (err) => { console.error('Error or render dialog closed without being successful', err); }); }, () => { console.error('Error in configuration'); }); }, () => { console.error('Error in initialization, maybe PayPal isn\'t supported or something else'); }); 的{​​{1}},然后我开发了以下解决方案。

要找到根骨骼,请对children中的每个NodeCollection进行遍历,并检查是否在{中包含的node列表中找到了它的名称{1}},然后如果该scene的父名称不在bones列表中,则它必须是根骨骼。

要构建骨骼层次结构,请从上面找到的“根骨骼”节点获取mesh,然后在网格物体node列表中找到匹配的名称,并从在那里提取所需的顶点权重和偏移矩阵。接下来,使用与上述相同的方法递归搜索这些子级的子级:遍历场景中的每个bones直到找到匹配的children名称,然后从{{1}中提取数据} bones列表中,然后相反地进行操作,直到没有子项为止。

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