我们正在尝试在服务器端合并多个 GLTF,并将合并后的 gltf 作为最终结果导出到服务器上。
我们已经证实有效和无效的事情:
我们使用了三个 js GLTFLoader 解析方法来加载多个 gltf 文件,合并加载对象的父级和子级,并使用 GLTFExporter 导出最终模型。
我们使用jsdom来解决与窗口、文档等相关的问题。
上述几点适用于没有纹理的 gltfs
当使用纹理加载 GLTF 时,响应会卡住。
a) 我们尝试将文件托管在服务器上,并使用 GLTFLoader 加载方法,并将“localhost:******”作为加载器路径。
b)TextureLoader 内部调用了 ImageLoader,其中 onLoad 事件根本没有被触发。可能 jsdom 没有调用这个。
c) 为了解决这个问题,我们将 ImageLoader 更改为具有画布图像:
const { Image } = require("canvas");
const image = new Image();
image.onload = onImageLoad;
image.onerror = onImageError;
Run Code Online (Sandbox Code Playgroud)
d) 经过上述更改后,加载方法得到了解决。
e) 下一步 - 导出 GLTF - 由于未找到 ImageData 错误,我们陷入了困境。我们从画布添加了 ImageData,并导出了 GLTF。
f) 导出的 GLTF 由于图像中的数据损坏而无法查看
"images": [
{
"mimeType": "image/png",
"uri": "data:,"
}
],
Run Code Online (Sandbox Code Playgroud)
如果有人纯粹在服务器端加载并合并 GLTfs 与纹理图像,请帮忙!
我正在尝试合并也具有一些公共节点的多个 GLTF 文件。答案帮助我合并文件,我通过以下代码组合了场景,它完美地呈现
const scenes = root.listScenes()
const scene0 = scenes[0]
root.setDefaultScene(scene0);
if (scenes.length > 1) {
for (let i = 1; i < scenes.length; i++) {
let scene = scenes[i];
let nodes = scene.listChildren()
for (let j = 0; j < nodes.length; j++) {
scene0.addChild(nodes[j]);
}
}
}
root.listScenes().forEach((b, index) => index > 0 ? b.dispose() : null);
Run Code Online (Sandbox Code Playgroud)
我的问题是 GLTF 中常见的所有数据都是重复的,当需要更改根骨骼时,这将在动画中产生问题。有没有办法合并以使公共节点不重复?我也在尝试一些自定义合并。
const gltfLoader = () => {
const document = new Document();
const root = document.getRoot();
document.merge(io.read(filePaths[0])); …Run Code Online (Sandbox Code Playgroud)