Как мне очистить три.Сцена с JS

Я пытаюсь найти способы снятия всех объектов в сцене, не разрушая саму сцену. Я знаю, что именование объекта-это один из способов, а затем, когда мы хотим удалить объект, мы просто "получаем" его по имени. Однако я хочу найти быстрый способ очистить сцену от всех объектов в ней, независимо от их имен. Есть ли простой способ сделать это? Спасибо!

3 ответов


вы можете пересечь дочерние объекты сцены и удалить их один за другим.


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

Edit:

Как было предложено в комментариях, ответ выше неверен. Правильный способ удалить все объекты из сцены - использовать цикл for/while.

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

Примечание: это просто быстрая и грязная очистка иерархии объектов. Если вы планируете делать это много, вы рискуете столкнуться с утечками памяти с кодом выше, потому что рендерер имеет ссылки на материалы объектов, текстуры и геометрию. Полная очистка сцены сложнее, и есть много других вопросов, которые входят в более подробно:


обход всех дочерних элементов и вызов dispose по их геометрии, материалу и текстуре. Код ниже-это мое решение.

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)

у меня есть более лаконичный способ сделать это. Я заметил, что remove метод Object3D принимает более одного параметра для удаления объекта. Это позволяет нам использовать весь children массив путем изменения вызова для использования каждого элемента в качестве отдельных параметров, воспользовавшись встроенным apply метод для функций. Это работает так:

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