2015-05-20 24 views
5

Ich versuche Wege zu finden, alle Objekte in einer Szene zu löschen, ohne die Szene selbst zu zerstören. Ich weiß, dass das Benennen des Objekts eine Möglichkeit ist und wenn wir dann das Objekt löschen wollen, "bekommen" wir es einfach mit seinem Namen. Ich möchte jedoch eine schnelle Möglichkeit finden, eine Szene aller Objekte unabhängig von ihren Namen zu löschen. Gibt es einen einfachen Weg, es zu tun? Vielen Dank!Wie lösche ich THREE.JS Szene

Antwort

5

Sie können die Child-Objekte der Szene durchlaufen und sie einzeln entfernen.

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

Edit:

Wie in den Kommentaren vorgeschlagen, ist die obige Antwort falsch. Die korrekte Methode zum Entfernen aller Objekte aus der Szene besteht in der Verwendung einer For/While-Schleife.

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

Hinweis: Dies ist nur ein schnelles und dreckiges Löschen der Objekthierarchie. Wenn Sie dies viel vorhaben, laufen Sie Gefahr, mit dem obigen Code in Speicherlecks einzudringen, weil der Renderer Referenzen auf die Objekte Materialien, Texturen und Geometrien hat. Eine komplette Rein der Szene ist komplizierter und es gibt viele andere Fragen, die in mehr Detail geht:

+3

diese Lösung ist falsch, weil Sie über Array sind laufen, die in der Schleife modifiziert, so dass einige Elemente übersprungen werden kann (zB wenn Sie zwei Elemente in Kinder haben), ersetzen Sie bitte mit: '' 'while (Szene .children.length> 0) { scene.remove (scene.children [0]); } '' ' – Alleo

0

Ich habe eine prägnante Art und Weise dies zu tun. Ich habe festgestellt, dass die Methode remove von Object3D mehr als einen Parameter zur Objektentfernung akzeptiert. Dies ermöglicht es uns, das gesamte children Array zu verwenden, indem der Aufruf modifiziert wird, um jedes Element als einzelne Parameter zu verwenden, indem die integrierte apply Methode für Funktionen genutzt wird. Dies funktioniert wie folgt:

0

Verfahre alle Kinder und rufen Sie über ihre Geometrie, Material und Textur verfügen. Der folgende Code ist meine Lösung.

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) 
Verwandte Themen