Saltar al contenido

Threejs elimina todos los objetos juntos de la escena

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);
   }
});
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *