Solución:
Puede atravesar los objetos secundarios de la escena y eliminarlos uno por uno.
scene.children.forEach(function(object){
scene.remove(object);
});
Editar:
Como se sugiere en los comentarios, la respuesta anterior es incorrecta. La forma correcta de eliminar todos los objetos de la escena es mediante un bucle for / while.
while(scene.children.length > 0){
scene.remove(scene.children[0]);
}
Nota: Esto es solo una limpieza rápida y sucia de la jerarquía de objetos. Si planea hacer esto mucho, corre el riesgo de sufrir pérdidas de memoria con el código anterior porque el renderizador tiene referencias a los materiales, texturas y geometrías de los objetos. Una limpieza completa de la escena es más complicada y hay muchas otras preguntas que entran en más detalle:
- Three.js Collada: ¿Cuál es la forma correcta de disponer () y liberar memoria (recolección de basura)?
- TRES js eliminar correctamente el objeto de la escena (aún reservado en HEAP)
- Desasignación de objetos del montón al eliminar la malla de la escena
Tengo una forma más concisa de hacer esto. Noté que el remove
El método de Object3D acepta más de un parámetro para la eliminación de objetos. Esto nos permite usar todo children
matriz modificando la llamada para usar cada elemento como parámetros individuales aprovechando la función incorporada apply
método para funciones. Esto funciona así:
scene.remove.apply(scene, scene.children);
Recorrer a todos los niños y llamar a disponer de su geometría, material y textura. El siguiente código es mi solución.
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){
//in case of map, bumpMap, normalMap, envMap ...
Object.keys(obj.material).forEach(prop => {
if(!obj.material[prop])
return
if(obj.material[prop] !== null && typeof obj.material[prop].dispose === 'function')
obj.material[prop].dispose()
})
obj.material.dispose()
}
}
clearThree(scene)