Search code examples
arcoresceneform

How do I delete individual renderables from the scene using a button using arcore and sceneform?


I'm trying to make a button that will delete a 3d model from the scene after it is selected.

I know that the way to delete 3d objects is by using anchor.detach(). And I can select individual models using node.select(). However, I am not sure how to access the anchor after selecting the node.

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                deleteObject(//I'm not sure how to get the anchor from the selected node//);
            }
        });

private void deleteObject(Anchor anchor){
        anchor.detach();
    }

Solution

  • If you want to delete a particular Renderable and you already know the Anchronode, which is what I believe your case is from the question, then the code below will remove the Renderable and Anchornode:

    private void removeAnchorNode(AnchorNode nodeToremove) {
            //Remove an anchor node
            if (nodeToremove != null) {
                arFragment.getArSceneView().getScene().removeChild(nodeToremove);
                nodeToremove.getAnchor().detach();
                nodeToremove.setParent(null);
                nodeToremove = null;
                Toast.makeText(LineViewMainActivity.this, "Test Delete - anchorNode removed", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(LineViewMainActivity.this, "Test Delete - markAnchorNode was null", Toast.LENGTH_SHORT).show();
            }
        }
    

    The toast are just to help testing so can be removed or left as you choose.

    Update - Kotlin version (tested April 2020):

        private fun removeAnchorNode(nodeToRemove: AnchorNode) {
            //Remove an Anchor node
            arFragment.getArSceneView().getScene().removeChild(nodeToRemove);
            nodeToRemove.getAnchor()?.detach();
            nodeToRemove.setParent(null);
            nodeToRemove.renderable = null
        }