2015-04-02 179 views
11

我試圖在一個拍攝中刪除場景中的所有對象,但只刪除一個對象進行調用。Threejs將場景中的所有對象從場景中刪除

GeometryModel.prototype.clearScene = function(scene) { 
var i; 
for(i=0; i < scene.children.length; i++){ 
    obj = scene.children[i]; 
    scene.remove(obj); 
    } 
} 

另一種解決辦法我試過和工作原理是這樣的:

scene.children={}; 

,但我不知道這是否是正確的。

+1

經常重新加載會導致一個HEAP mem泄漏看到我的問題http://stackoverflow.com/questions/37762961/three-js-proper-removing-object-from-scene-still-reserved-in-heap – Martin 2016-06-11 18:46:53

回答

16

你要做的恰恰相反:

for(var i = scene.children.length - 1; i >= 0; i--) { } 

,因爲在每次迭代中.children陣列的變化,一旦你從一開始的數組改變索引做.remove()

如果您想更好地理解它,請展開for循環並按照索引到數組中。

+0

它是不是一個解決方案,它會導致一個HEAP mem泄漏看到我的問題http://stackoverflow.com/questions/37762961/three-js-proper-removing-object-from-scene-still-reserved-in-heap – Martin 2016-06-11 18:46:05

+0

是' nt while循環更容易。 – mithun 2016-10-19 04:17:30

+0

@Martin作爲其他答案表示,這主要是垃圾收集的問題。 – gaitat 2016-10-19 12:30:37

2

現有的答案很好,我只是想爲那些遇到同樣問題的人提供更全面的回覆。當我使用Three.js重新加載熱模塊時,我經常想重新創建除飛機和相機以外的所有對象。要做到這一點我做到以下幾點:

export const reload = (/* updatedDependencies */) => { 
    console.info('Canceling the run loop...') 
    cancelAnimationFrame(runLoopIdentifier) // the return value of `requestAnimationFrame`, stored earlier 

    console.info('Removing all children...') 
    for (let i = scene.children.length - 1; i >= 0 ; i--) { 
    let child = scene.children[ i ]; 

    if (child !== plane && child !== camera) { // plane & camera are stored earlier 
     scene.remove(child); 
    } 
    } 

    while (renderer.domElement.lastChild) // `renderer` is stored earlier 
    renderer.domElement.removeChild(renderer.domElement.lastChild) 

    document.removeEventListener('DOMContentLoaded', onDOMLoad) 
    conicalDendriteTreeSegments = require('./plantae/conical-dendrite-trees').default 

    initializeScene() // re-add all your objects 
    runLoopIdentifier = startRenderRunLoop() // render on each animation frame 

    console.info('Reload complete.') 
} 
+0

這不是一個解決方案,它會導致一個HEAP mem泄漏看到我的問題http://stackoverflow.com/questions/37762961/three-js-proper-removing-object-from-scene-still-reserved-in-heap – Martin 2016-06-11 18:46:09

0

的優選方法是使用場景的traverse功能。所有對象都具有此功能,並會通過父級的子級進行深度優先搜索。

Here's a snippet from Mr. Doob himself

scene.traverse(function (object) { 
    if (object instanceof THREE.Mesh) { 
     var geometry = object.geometry; 
     var matrixWorld = object.matrixWorld; 

     ... 

    } 
}); 

下面是從R82的源位:

traverse: function (callback) { 
    callback(this); 
    var children = this.children; 
    for (var i = 0, l = children.length; i < l; i ++) { 
     children[ i ].traverse(callback); 
    } 
} 

您還可以使用traverseVisible你的情況:

scene.traverseVisible(function(child) { 
    if (child.type !== 'Scene') { 
     scene.remove(child); 
    } 
}); 
4

可以完成與

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

說明:

object.children.length返回如果object.children.length 不爲0,如果返回它等於0。

所以你只需要刪除第一個子元素,只要對象有孩子。

+1

區別在哪裏? – csblo 2016-12-13 10:00:13

+0

沒什麼,的確如此。 :O – Akkumulator 2016-12-14 11:05:04

+0

@Akkumulator :-D – csblo 2016-12-15 08:40:21