Saltar al contenido

¿Cómo borro la escena THREE.JS?

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)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *