three.js - 在 THREE.Js 的场景中添加同一导入模型的多个副本

标签 three.js duplicates gltf

我已将 3D 模型导入到我一直在处理的 THREE.Js 项目中,并且我想将它们的多个副本添加到场景中。这是我用来复制它的代码:

let ball = new THREE.Mesh();
loader.load( './ball.gltf', function ( gltf ) {
    gltf.scene.traverse(function(model) { //for gltf shadows!
        if (model.isMesh) {
          model.castShadow = true;
          model.material = sphereMaterial;
        }
    });
    ball = gltf.scene;
    scene.add( ball );
}, undefined, function ( error ) {
    console.error( error );
} );

const ball2 = ball.clone()
ball2.position.set(0.5, 0.5, 0.5)
scene.add(ball2)

但是,在 loader.load() 调用中,场景中只显示了一个“球”。有谁知道我应该采取什么不同的措施才能成功复制模型?

最佳答案

您的 onLoad() 处理程序 (function ( gltf ) {...}) 是异步的,克隆 ball 的代码 ( const ball2 = ball.clone()) 在使用 GLTF 数据初始化 ball 之前执行。因此,在 ball.clone() 执行时,ball 只是您在加载 GLTF 之前创建的空 Mesh,并且该空 >Mesh 是被克隆的内容。

我怀疑您在某些时候遇到了与在未定义上读取 clone 相关的控制台错误,这就是为什么您添加了将 ball 初始化为空的行网格,这是不必要的。

有几种方法可以处理这个问题,但最简单的是将克隆 ball 的代码移动到 onLoad 处理程序中( ,在 scene.add( ball ) 之后)。

概念证明 here .

关于three.js - 在 THREE.Js 的场景中添加同一导入模型的多个副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71846348/

相关文章:

c++ - 从 vector 中删除重复元素

android - 如何使用 ARCore Android SDK 在 SceneViewer 上加载我的 glTF 文件

javascript - 在 Three.js 中将 glTF 对象设置为不同的层时遇到问题

三.js ".getWorldPosition() target is now required"错误消息

sql - 忽略并发插入中的错误

javascript - 将 DIV 悬停在 ThreeJS 对象上,使其位置与 3D 世界同步

java - 从未排序的数组中删除重复项

aframe - glTF 文件中的多个动画剪辑从 blender 到 a 帧

javascript - 如何使用 Three.js 制作球形多面体(足球或橄榄球)

javascript - 使用 Three.js 在对象上绘画