首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用GLTF变换合并多个具有公共节点的gltf

用GLTF变换合并多个具有公共节点的gltf
EN

Stack Overflow用户
提问于 2021-06-23 11:01:03
回答 1查看 842关注 0票数 1

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

我试图合并多个GLTF文件,其中也有一些共同的节点。这个答案帮助我合并了文件,并通过下面的代码组合了场景,并完美地呈现了这些场景。

代码语言:javascript
复制
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); 

我的问题是,GLTFs中常见的所有数据都是复制的,这将在需要改变根骨的情况下在动画中产生问题。是否有一种合并方法,使公共节点不被复制?我也在尝试一些定制的合并。

代码语言:javascript
复制
const gltfLoader = () => {
    const document = new Document();
    const root = document.getRoot();
    document.merge(io.read(filePaths[0]));
    let model;
    for (let i = 1; i < filePaths.length; i++) {
        const inDoc = new Document();
        inDoc.merge(io.read(filePaths[i]));
        model = inDoc.getRoot().listScenes()[0];
        model.listChildren().forEach((child) => {
            mergeStructure(root.listScenes()[0], child);
        });
    }

    io.write('output.gltf', document);
}

const mergeStructure = (parent, childToMerge) => {
    let contains = false;
    parent.listChildren().forEach((child) => {
        if (child.t === childToMerge.t && !contains && child.getName() === childToMerge.getName()) {

            childToMerge.listChildren().forEach((subChild) => {
                mergeStructure(child, subChild);
            });
            contains = true;
        }
    });
    if (!contains) {
        console.log("Adding " + childToMerge.getName() + " to  " + parent.getName() + "  as child")
        parent.addChild(childToMerge);
    }
}

但是,由于Error: Cannot link disconnected graphs/documents,此合并无法工作。我是3D造型的新手。一些方向会很好。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-23 18:50:35

上面看到的错误发生是因为代码试图将单个资源(例如节点 )从一个glTF 文档移动到另一个文档。这是不可能的,每个文档都在内部管理其资源图,但是一个等价的工作流是:

  1. 加载N个文件并合并到一个文档中(包含N个场景)。
代码语言:javascript
复制
import { Document, NodeIO } from '@gltf-transform/core';

const io = new NodeIO();
const document = new Document();

for (const path of paths) {
  document.merge(io.read(path));
}
  1. 遍历所有场景,将他们的孩子转移到一些常见的场景:
代码语言:javascript
复制
const root = document.getRoot();
const mainScene = root.listScenes()[0];

for (const scene of root.listScenes()) {
  if (scene === mainScene) continue;

  for (const child of scene.listChildren()) {
    // If conditions are met, append child to `mainScene`. 
    // Doing so will automatically detach it from the
    // previous scene.
  }

  scene.dispose();
}
  1. 清理剩余的未合并资源。
代码语言:javascript
复制
import { prune } from '@gltf-transform/functions';

await document.transform(prune());
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68098555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档