2012-07-26 85 views
7

Estoy usando Three.JS para hacer un plano y poner algunas cajas sobre él Necesito quitar todos los cuadros a veces. Así que estoy tratando de hacerlo con el siguiente código:No puedo eliminar objetos usando Three.JS

for (i = 0; i < scene.children.length; i ++) { 
    var object = scene.children[ i ]; 
    if (object != plane && object != camera) { 
     scene.remove(object); 
    } 
} 

/Este matar a cada objeto que no es el plano o la cámara ;-)/

Se elimina algunas cajas, pero no todos ellos = ( ¿Cómo puedo eliminar todas las cajas? saludos, José

+0

no debe llamar a su objeto var. esa es una palabra clave reservada para la definición real de objeto. – FlavorScape

+0

objeto debería estar bien, Object está reservado (con mayúscula o) – ama2

+0

ese no es el problema ... = (. @ Ama2 es correcto –

Respuesta

21

Tiene que volver al frente, no de adelante hacia atrás, al eliminar objetos de la matriz como este.

var obj, i; 
for (i = scene.children.length - 1; i >= 0 ; i --) { 
    obj = scene.children[ i ]; 
    if (obj !== plane && obj !== camera) { 
     scene.remove(obj); 
    } 
} 

Lo que está pasando es cuando se quita un nodo, todos los que después de turno. Supongamos que quita scene.children [0]: children [1] se convertirá en el nuevo 0, 2 se convertirá en 1, etc. Al pasar de 0 a array.length, el bucle for ya se ha movido y omite 1 nodo por cada uno que elimines

Como una ventaja adicional, esto debería ir un poco más rápido, especialmente si tiene muchos objetos, ya que scene.children.length solo se obtiene una vez, en lugar de cada ciclo.

+0

¡Lo tienes! Gracias @Crazycatz !!! = D = D = D = D = D = D = D –

+0

¡Gracias! :) <3 –

1

debe utilizar! == en lugar de! = (es un poco más rápido). ¿te ha intentado a paso a través de su bucle y comprobar los niños de la escena Después de eso, tal vez agregaste algunas cajas al avión como niños que no serán eliminadas por este lazo.

+0

Buena idea. Ese no era el problema, pero gracias de todos modos por la idea Mr @ Sebastian Sachtleben. Saludos –

2

@Crazycatz respuesta es correcta, por supuesto, pero ahora estamos en 2016 y en lugar de repetición manual, puede simplemente llamar .slice() y iterar sobre matriz de copia:

scene.children.slice().forEach(obj => scene.remove(obj)) 

o sin ES6 extras:

scene.children.slice().forEach(function(obj) { scene.remove(obj); }) 
Cuestiones relacionadas