小编Nil*_*ilu的帖子

服务器端多个 GLTF 加载和合并

我们正在尝试在服务器端合并多个 GLTF,并将合并后的 gltf 作为最终结果导出到服务器上。

我们已经证实有效和无效的事情:

  1. 我们使用了三个 js GLTFLoader 解析方法来加载多个 gltf 文件,合并加载对象的父级和子级,并使用 GLTFExporter 导出最终模型。

  2. 我们使用jsdom来解决与窗口、文档等相关的问题。

  3. 上述几点适用于没有纹理的 gltfs

  4. 当使用纹理加载 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 与纹理图像,请帮忙!

three.js gltf

4
推荐指数
1
解决办法
2206
查看次数

使用 gltf-transform 合并具有一些公共节点的多个 GLTF

这个问题是服务器端多个GLTF加载和合并的扩展。

我正在尝试合并也具有一些公共节点的多个 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)

webgl gltf

1
推荐指数
1
解决办法
1385
查看次数

标签 统计

gltf ×2

three.js ×1

webgl ×1