2012-07-26 17 views
7

Sto usando Three.JS per creare un piano e mettere sopra delle scatole A volte ho bisogno di rimuovere tutte le caselle. Così sto cercando di farlo con il seguente codice:Non riesco a rimuovere gli oggetti utilizzando Three.JS

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

/Questa uccidere ogni oggetto che non è l'aereo o la macchina fotografica ;-)/

Cancella alcune scatole, ma non tutti loro = ( Come posso cancellare tutte le caselle? Saluti, José

+0

non dovresti chiamare il tuo oggetto var. questa è una parola chiave riservata per la definizione effettiva dell'oggetto. L'oggetto – FlavorScape

+0

dovrebbe andare bene, l'oggetto è riservato (con maiuscola) – ama2

+0

che non è il problema ... = (. @ Ama2 ha ragione –

risposta

21

È necessario tornare in primo piano, non in avanti o indietro, quando si rimuovono oggetti di questo tipo.

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

Quello che succede è quando si rimuove un nodo, tutti quelli che si spostano. Diciamo che rimuovi scene.children [0]: i bambini [1] diventeranno i nuovi 0, 2 diventeranno 1, ecc. Passando da 0 a array.length, il ciclo for è già stato spostato e sta saltando 1 nodo per tutti quelli che elimini.

Come ulteriore vantaggio, questo dovrebbe andare leggermente più veloce, soprattutto se si dispone di molti oggetti, dal momento che scene.children.length viene ottenuto solo una volta, invece di ogni ciclo.

+0

Hai capito! Grazie @Crazycatz !!! = D = D = D = D = D = D = D –

+0

Grazie! :) <3 –

1

si dovrebbe usare! == al posto di! = (è un po 'più veloce). Ha fatto si è tentato di passare in rassegna il ciclo e controllare i bambini di scena dopo di che? Forse hai aggiunto alcune scatole al piano come childs che non saranno cancellate da questo ciclo continuo.

+0

Buona idea, non era questo il problema, ma grazie comunque per l'idea Mr @Sebastian Sachtleben. Auguri –

2

@Crazycatz risposta è corretta, naturalmente, ma ora siamo nel 2016, invece di iterazione manuale si può chiamare .slice() e iterare copia matrice:

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

o senza ES6 extra:

scene.children.slice().forEach(function(obj) { scene.remove(obj); }) 
Problemi correlati