Solución:
Tienes que hacer lo contrario:
for( var i = scene.children.length - 1; i >= 0; i--) {
obj = scene.children[i];
scene.remove(obj);
}
porque en cada iteración el .children
la matriz cambia una vez que haces un .remove()
desde el principio y la indexación de esa matriz cambia.
Si desea comprenderlo mejor, desenrolle el ciclo for y siga cuál es el índice en la matriz.
Puedes lograr eso con tiempo :
while (object.children.length)
{
object.remove(object.children[0]);
}
Explicaciones:
object.children.length return cierto si object.children.length no es 0, si es igual a 0 vuelve falso.
Por lo tanto, solo tiene que eliminar el primer elemento secundario siempre que el objeto tenga elementos secundarios.
Un método preferido es utilizar la escena traverse
función. Todos los objetos tienen esta función y realizarán una búsqueda en profundidad a través de los hijos de los padres.
Aquí hay un fragmento del propio Sr. Doob.
scene.traverse( function ( object ) {
if ( object instanceof THREE.Mesh ) {
var geometry = object.geometry;
var matrixWorld = object.matrixWorld;
...
}
});
Y aquí hay un poco de la fuente de r82:
traverse: function ( callback ) {
callback( this );
var children = this.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
children[ i ].traverse( callback );
}
}
También puedes usar traverseVisible
en tu caso:
scene.traverseVisible(function(child) {
if (child.type !== 'Scene') {
scene.remove(child);
}
});