2015-05-20 17 views
5

Sto cercando di trovare modi per cancellare tutti gli oggetti in una scena senza distruggere la scena stessa. So che nominare l'oggetto è un modo e poi quando vogliamo eliminare l'oggetto, lo "prendiamo" semplicemente con il suo nome. Tuttavia, voglio trovare un modo rapido per cancellare una scena di tutti gli oggetti in essa contenuti, indipendentemente dal loro nome. C'è un modo semplice per farlo? Grazie!Come eliminare la scena THREE.JS

risposta

5

È possibile attraversare gli oggetti figlio della scena e rimuoverli uno ad uno.

 scene.children.forEach(function(object){ scene.remove(object); }); 

Edit:

Come suggerito nei commenti, la risposta di cui sopra è sbagliato. Il modo corretto per rimuovere tutti gli oggetti dalla scena utilizza un ciclo for/while.

while(scene.children.length > 0){ 
    scene.remove(scene.children[0]); 
} 

Nota: questa è solo una rapida e sporca cancellazione della gerarchia degli oggetti. Se hai intenzione di farlo molto, rischi di correre alle fughe di memoria con il codice sopra perché il renderer ha riferimenti agli oggetti materiali, trame e geometrie. Una pulizia della scena è più complicato e ci sono molte altre domande che va in modo più dettagliato:

+3

questa soluzione non è corretto, perché si sta iterazione di serie che ha modificato in loop, in modo da alcuni elementi possono essere saltati (per esempio quando si hanno due elementi nei bambini), si prega di sostituire con: '' 'while (scena .children.length> 0) { scene.remove (scene.children [0]); } '' ' – Alleo

0

Ho un più conciso modo di farlo. Ho notato che il metodo remove di Object3D accetta più di un parametro per la rimozione degli oggetti. Ciò ci consente di utilizzare l'intero array children modificando la chiamata per utilizzare ciascun elemento come singoli parametri sfruttando il metodo integrato apply per le funzioni. Questo funziona in questo modo:

scene.remove.apply(scene, scene.children); 
0

Attraversando tutti i bambini e chiamare smaltire il loro geometria, materiali e texture. Il codice qui sotto è la mia soluzione.

function clearThree(obj){ 
    while(obj.children.length > 0){ 
    clearThree(obj.children[0]) 
    obj.remove(obj.children[0]); 
    } 
    if(obj.geometry) obj.geometry.dispose() 
    if(obj.material) obj.material.dispose() 
    if(obj.texture) obj.texture.dispose() 
} 

clearThree(scene) 
Problemi correlati