Как мне очистить три.Сцена с 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);