如何在加载到场景之前将 OBJ/FBX 转换为 GLTF(使用 Threejs)

Posted

技术标签:

【中文标题】如何在加载到场景之前将 OBJ/FBX 转换为 GLTF(使用 Threejs)【英文标题】:How to convert OBJ/FBX to GLTF before loading to scene (using Threejs) 【发布时间】:2020-03-16 23:41:35 【问题描述】:

我正在尝试创建一个 webapp,用户可以在其中上传 obj/fbx 文件并在浏览器中查看它们。我使用了 Threejs 提供的 OBJLoader 和 FBXLoader,一切正常。但是,我想在将这两个模型加载到场景中之前将它们转换为 GTLF(为了保持一致性)。

如何在threejs中实现这一点?我知道 threejs 有一个 GTLF 导出器,但我不知道如何将它用于我的目的。

【问题讨论】:

three.js 中没有这个功能。仅当您编写自己的转换器时,它才是工作的地狱。如果 FBX 和 OBJ 加载器一切正常,你为什么要这样做? 感谢您的回复。最终的目标是将所有格式的模型转换为统一的 gltf 格式,然后可以轻松地将其转换为适用于 androidios 手机的 sfb/usdz 格式。试图减少我必须编写的转换器数量。 您是否要让用户在此之后下载 glTF 文件?还是只是为了展示它?如果只是为了展示,我认为加载、导出和重新加载没有任何好处。 @DonMcCurdy 只是想显示它。使用统一格式(在这种情况下为 gltf)是否有用?哪种格式最易解析? 问题是你将在这里转换 A->B->C->B,其中“B”是一个 three.js 对象。如果 B 第一次出现任何问题,将其转换为 glTF 并返回并不能解决该问题。不过,如果您可以选择,我认为 glTF 是最可靠的起点。 【参考方案1】:

有两种方法可以做到这一点:

方法一:

使用服务器上的本地库(如 obj2gltf 和 fbx2gltf)将 using 从 OBJ 或 FBX 转换为 glTF。 在网络应用中加载 glTF 文件。

方法二:

使用 OBJLoader 或 FBXLoader 加载 OBJ 或 FBX,为您提供 THREE.Mesh 或其他对象。 使用 GLTFExporter 将 THREE.Mesh 转换为 glTF 文件。 使用 GLTFLoader 加载 glTF 文件,再次为您提供 THREE.Mesh 或其他对象。

方法 1 更难,但可能会为您提供更好的转换结果,因为本机库可以访问 FBX SDK。方法 2 相当简单,但我想不出这样做有什么好处……加载 OBJ 或 FBX 后的 Mesh 将(充其量)与最终得到的 Mesh 相同。在最坏的情况下,通过 GLTFExporter->GLTFLoader 的往返可能会引入性能或正确性问题。

【讨论】:

以上是关于如何在加载到场景之前将 OBJ/FBX 转换为 GLTF(使用 Threejs)的主要内容,如果未能解决你的问题,请参考以下文章

Actionscript,将随机电影剪辑加载到场景中

在运行时将网格转换为 stl/obj/fbx [关闭]

在运行时将网格转换为 stl/obj/fbx [关闭]

在three.js中将网格添加到场景之前如何设置网格的位置

.obj 到 fbx 导出器,反之亦然

记录应仅加载到场景中的目标