ThreeJS: Remove object from scene

前端 未结 8 1966
后悔当初
后悔当初 2021-01-30 06:45

I\'m using ThreeJS to develop a web application that displays a list of entities, each with corresponding \"View\" and \"Hide\" button; e.g. entityName View Hide

相关标签:
8条回答
  • 2021-01-30 07:04
    clearScene: function() {
        var objsToRemove = _.rest(scene.children, 1);
        _.each(objsToRemove, function( object ) {
              scene.remove(object);
        });
    },
    

    this uses undescore.js to iterrate over all children (except the first) in a scene (it's part of code I use to clear a scene). just make sure you render the scene at least once after deleting, because otherwise the canvas does not change! There is no need for a "special" obj flag or anything like this.

    Also you don't delete the object by name, just by the object itself, so calling

    scene.remove(object); 
    

    instead of scene.remove(object.name); can be enough

    PS: _.each is a function of underscore.js

    0 讨论(0)
  • 2021-01-30 07:06

    When you use : scene.remove(object); The object is removed from the scene, but the collision with it is still enabled !

    To remove also the collsion with the object, you can use that (for an array) : objectsArray.splice(i, 1);

    Example :

    for (var i = 0; i < objectsArray.length; i++) {
    //::: each object ::://
    var object = objectsArray[i]; 
    //::: remove all objects from the scene ::://
    scene.remove(object); 
    //::: remove all objects from the array ::://
    objectsArray.splice(i, 1); 
    

    }

    0 讨论(0)
  • 2021-01-30 07:08

    I think seeing your usage for addEntity and removeEntity code would be helpful, but my first thought is are you actually setting the object.name? Try in your loader just before scene.add(object); something like this:

    object.name = "test_name";
    scene.add(object);
    

    What might be happening is the default "name" for an Object3D is "", so when you then call your removeEntity function it fails due to the scene objects name being ""

    Also, I notice you pass in object.name to your loader? Is this where your storing the URL to the resource? If so, I would recommend using the Object3D's built in .userData method to store that information and keep the name field for scene identification purposes.

    Edit: Response to newly added Code

    First thing to note is it's not a great idea to have "/" in your object name, it seems to work fine but you never know if some algorithm will decide to escape that string and break your project.

    Second item is now that I've seen your code, its actually straight forward whats going on. Your delete function is trying to delete by name, you need an Object3D to delete. Try this:

    function removeEntity(object) {
        var selectedObject = scene.getObjectByName(object.name);
        scene.remove( selectedObject );
        animate();
    }
    

    Here you see I lookup your Object3D in the Three.js Scene by passing in your object tag's name attribute. Hope that helps

    0 讨论(0)
  • 2021-01-30 07:11

    THIS WORKS GREAT - I tested it so, please SET NAME for every object

    give the name to the object upon creation

        mesh.name = 'nameMeshObject';
    

    and use this if you have to delete an object

        delete3DOBJ('nameMeshObject');
    
    
    
        function delete3DOBJ(objName){
            var selectedObject = scene.getObjectByName(objName);
            scene.remove( selectedObject );
            animate();
        }
    

    open a new scene , add object

    delete an object and create new

    0 讨论(0)
  • 2021-01-30 07:14

    You can use this

    function removeEntity(object) {
        var scene = document.querySelectorAll("scene");                               //clear the objects from the scene
        for (var i = 0; i < scene.length; i++) {                                    //loop through to get all object in the scene
        var scene =document.getElementById("scene");                                  
        scene.removeChild(scene.childNodes[0]);                                        //remove all specified objects
      }   
    
    0 讨论(0)
  • 2021-01-30 07:20

    If your element is not directly on you scene go back to Parent to remove it

      function removeEntity(object) {
            var selectedObject = scene.getObjectByName(object.name);
            selectedObject.parent.remove( selectedObject );
        }
    
    0 讨论(0)
提交回复
热议问题