如何在使用Aframe的entity gltf-model加载GLB时访问其骨骼?

huangapple go评论53阅读模式
英文:

How to access a GLB's Skeleton when using Aframe's entity gltf-model to load it?

问题

我正在遵循此规范来加载GLB文件,https://aframe.io/docs/1.4.0/components/gltf-model.html,

我已经使用以下格式加载了一个GLB文件。

<a-scene>
  <a-entity gltf-model="./assets/models/Streetbud_1.7.glb"
  move position=".5 1.5 -15" scale="5 5 5"></a-entity>
</a-scene>

如果我然后访问该模型,在控制台中会看到以下内容。

没有骨骼的模型

如果我使用three.js的gltfloader加载相同的模型,如下所示。

gltfLoader.load('./assets/models/Streetbud_1.7.glb', (gltf) => {
....
}

我会得到以下结果。

有骨骼的模型

请注意,在gltfLoader的情况下,模型中有骨骼。在使用时,我没有这个选项。

我希望将一些BVH动画重新定位到我的骨骼上。有没有办法让骨架在使用时被填充?出于兼容性原因,我更喜欢使用较新的方法,以便与其他一些库兼容。

英文:

I'm following this spec for loading GLB's, https://aframe.io/docs/1.4.0/components/gltf-model.html,

i've loaded a GLB file using

this format.

&lt;a-scene&gt;
  &lt;a-entity gltf-model=&quot;./assets/models/Streetbud_1.7.glb&quot;
  move position=&quot;.5 1.5 -15&quot; scale=&quot;5 5 5&quot;&gt;&lt;/a-entity&gt;
&lt;/a-scene&gt;

If i then access the model, i see the following in the console.

Model without skeleton

If i load the same model using the gltfloader from three.js with..

     gltfLoader.load(&#39;./assets/models/Streetbud_1.7.glb&#39;, (gltf) =&gt; {
....
    }

i get the following.

Model with Skeleton

Notice, in the case of the gltfLoader, the Skeleton is available in the model. I don't have this option when using the Aframe entity.

I'm looking to retarget some BVH animations to my skeleton. Any ideas on how i can get the skelton populated using <a-entity>? I prefer to use the newer approach for compatibility reasons with some other libraries..

答案1

得分: 0

应该像这样工作:

  1. 等待模型加载完成
  2. 使用getObject3D('mesh')查找根网格对象
  3. 遍历查找带有isSkinnedMesh标志的节点
  4. 访问skeleton属性。
<hr>

AFRAME.registerComponent("skinnedMesh-logger", {
   init: function() {
     this.el.addEventListener("model-loaded", e => {
       const mesh = this.el.getObject3D("mesh");
       mesh.traverse(node => {
         if (!node.isSkinnedMesh) return;
         console.log(node); // 或者 node.skeleton
       })
     })
   }
})
英文:

Should work like this:

  1. wait until the model is loaded
  2. find the root mesh object with getObject3D(&#39;mesh&#39;)
  3. traverse it looking for the isSkinnedMesh flag.
  4. access the skeleteon property.

<hr>

AFRAME.registerComponent(&quot;skinnedMesh-logger&quot;, {
   init: function() {
     this.el.addEventListener(&quot;model-loaded&quot;, e =&gt; {
       const mesh = this.el.getObject3D(&quot;mesh&quot;);
       mesh.traverse(node =&gt; {
         if (!node.isSkinnedMesh) return;
         console.log(node); // or node.skeleton
       })
     })
   }
})

huangapple
  • 本文由 发表于 2023年8月10日 10:05:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/76872223.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定