Three.js:FBX 骨骼正确旋转,而 GLTF 骨骼奇怪地旋转

Posted

技术标签:

【中文标题】Three.js:FBX 骨骼正确旋转,而 GLTF 骨骼奇怪地旋转【英文标题】:Three.js: FBX bones rotate correctly, while GLTF bones rotate bizarrely 【发布时间】:2021-01-20 20:14:38 【问题描述】:

我有一个使用Three.jsFBXLoader 处理FBX 文件的动态模型,但为了方便,我想使用GLTF/GLB 文件,因为它在同一个文件中包含纹理。我在 Blender 2.9 中加载了 FBX 文件并将其导出为 GLB 文件。 GLB 文件使用 GLTFLoader 正确呈现,但需要不同的旋转偏移量才能在设置时以正确的方向放置。

FBXGLB 文件都包含一个具有相似骨骼数组的 SkinnedMesh。我注意到matrixWorldNeedsUpdate 对于GLB 模型骨骼是错误的,但对于FBX,默认情况下它是正确的。可能还有其他差异,但我没有更多地探索层次结构的其他方面,例如矩阵字段。

无论如何,当从GLB 文件中动态旋转骨骼时,似乎枢轴点在其他地方。我正在更新本地旋转参数,所以我不知道它为什么以这种方式操纵Bone。它围绕正确的轴旋转,所以它看起来不像使用正确的局部旋转。

for (let i = 0; i < 20; i++)

    section1Bones[i].setRotationFromEuler(new THREE.Euler(0, 0, updatedSection1Vals[i], 'XYZ' ))
    section2Bones[i].setRotationFromEuler(new THREE.Euler(0, 0, updatedSection2Vals[i], 'XYZ' ))
    section3Bones[i].setRotationFromEuler(new THREE.Euler(0, 0, updatedSection3Vals[i], 'XYZ' ))

【问题讨论】:

也许尝试使用 Blender 2.90?自 2.80 以来已经有很多 glTF 修复。 我错了,我用的是 Blender 2.9 【参考方案1】:

有时这真的是最简单的事情。因此,与FBX 不同的是,GLB 包含单独的组件,例如保存 3D 模型的 scene 组件。由于我只有一个模型,我将整个 scene 对象添加到 Three.js 场景中,并与骨骼一起旋转。这导致了这个问题,所以我只是在加载的GLB 文件的场景组件children 中包含了3DObject,并且修复了骨骼旋转。

【讨论】:

以上是关于Three.js:FBX 骨骼正确旋转,而 GLTF 骨骼奇怪地旋转的主要内容,如果未能解决你的问题,请参考以下文章

Three.js fbx 未正确加载

将 FBX 转换为 three.js

在THREE.js中围绕自己的中心旋转每个网格项目

Three.js如何让对象相对于另一个旋转?

Three.js FBX 二进制格式不支持

如何在three.js中为.fbx模型应用纹理?