Threejs从场景中删除所有对象

Ste*_*one 13 javascript three.js

我尝试在一次拍摄中创建一个从场景中删除所有对象的函数,但它只删除了一个用于调用的对象.

GeometryModel.prototype.clearScene = function(scene) {
var i;
for(i=0; i < scene.children.length; i++){
     obj = scene.children[i];
     scene.remove(obj);
  }
}
Run Code Online (Sandbox Code Playgroud)

我试过的另一个解决方案是有效的:

scene.children={};
Run Code Online (Sandbox Code Playgroud)

但我不确定它是否正确.

gai*_*tat 21

你必须做相反的事情:

for( var i = scene.children.length - 1; i >= 0; i--) { }
Run Code Online (Sandbox Code Playgroud)

因为在每次迭代中,.children一旦.remove()从头开始执行a操作,数组就会更改,并且该数组的索引会发生更改.

如果您想更好地理解它,请展开for循环并按照索引进入数组.


csb*_*blo 9

你可以用while实现这个目标:

while (object.children.length)
{
    object.children.remove(object.children[0]);
}
Run Code Online (Sandbox Code Playgroud)

解释:

object.children.length返回如果object.children.length 不为0,如果它等于0,则返回错误.

所以只要对象有子元素,您就必须删除第一个子元素.


aus*_*nce 6

首选方法是使用场景的traverse函数。所有对象都具有此功能,并且将通过父对象的子对象进行深度优先搜索。

这是杜布先生本人的摘录

scene.traverse( function ( object ) {
    if ( object instanceof THREE.Mesh ) {
        var geometry = object.geometry;
        var matrixWorld = object.matrixWorld;

        ...

    }
});
Run Code Online (Sandbox Code Playgroud)

这是 r82 的一些来源:

traverse: function ( callback ) {
    callback( this );
    var children = this.children;
    for ( var i = 0, l = children.length; i < l; i ++ ) {
        children[ i ].traverse( callback );
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以在您的情况下使用traverseVisible

scene.traverseVisible(function(child) {
   if (child.type !== 'Scene') {
      scene.remove(child);
   }
});
Run Code Online (Sandbox Code Playgroud)