如何克隆Three.js中的object3d?

Car*_*Lee 13 webgl three.js

我想克隆一个加载了加载器的模型,我在github上发现了这个问题,但解决方案不起作用.似乎Object3D发生了结构性变化.

如何在当前稳定版本的Three.js中克隆Object3D?

Ali*_*can 27

In this new version of three.js you have a method clone.

For example, I use a queen from chess and I had to duplicate multiple times:

// queen is a mesh
var newQueen = queen.clone();

// make sure to re position to be able to see the new queen!
newQueen.position.set(100,100,100); // or any other coordinates
Run Code Online (Sandbox Code Playgroud)

It will work with any mesh.

I used three.js r61.

  • 为了避免在所有克隆的object3d中共享材料,只需遍历如下:if(child instanceof THREE.Mesh){child.material = child.material.clone(); } (5认同)
  • 这是可行的,但是每当更改其中一个克隆的 object3d 的材质属性时,所有其余的都会受到影响! (2认同)

Eli*_*rer 9

实际上mrdoob的答案是你的回答......

加载程序输出用于创建网格的几何体.您需要使用加载器创建的网格的几何和材质创建新网格.

for ( var i = 0; i < 10; i ++ ) {
    var mesh = new THREE.Mesh( loadedMesh.geometry, loadedMesh.material );
    mesh.position.set( i * 100, 0, 0 );
    scene.add( mesh );
}
Run Code Online (Sandbox Code Playgroud)

您想要克隆Mesh而不是Object3D,因为加载器的输出是Mesh.


小智 5

我找到了一种快速解决方案(不是最有效的)

GLTFLoader在内部使用THREE.FileLoader ()方法,该方法允许您缓存文件。
为此,您需要在创建 GLTFLoader 实例之前添加此

THREE.Cache.enabled = true;
Run Code Online (Sandbox Code Playgroud)

然后你可以多次加载同一个模型,但只有第一次会花费更长的时间,例如:

THREE.Cache.enabled = true;

var loader = new GLTFLoader();

var deeplyClonedModels = [];

for( var i = 0; i < 10; i++ ){

   loader.load('foo.gltf', function ( gltf ) {

     deeplyClonedModels.push(gltf.scene);

  });

}
Run Code Online (Sandbox Code Playgroud)