如何删除放置在 AR 屏幕上的 3d 对象

How to Remove 3d objects which are placed on AR Screen

我有一个 AR 屏幕,我在其中放置了一些 3d 对象。我正在使用 google AR Core 和 android SDK。

我需要通过单击清除按钮从场景中删除这些对象。

我能够移除最后放置的对象。但是其他对象没有移除。

这是我正在使用的代码。

if (newAnchor != null) {
            arFragment.getArSceneView().getScene().removeChild(newAnchor);
            newAnchor.getAnchor().detach();

如果您需要清理场景,可以执行以下操作:

arSceneView.getScene().callOnHierarchy(node -> {
  node.setParent(null);
  if (node instanceof AnchorNode) {
    ((AnchorNode) node).getAnchor().detach();
  }
}

您可以像这样检测用户是否点击了特定节点 - 在此示例中,检查是查看点击节点是否是 'Andy' 可渲染的,即默认示例可使用 Sceneform 渲染:

private void handleOnTouch(HitTestResult hitTestResult, MotionEvent motionEvent) {
        Log.d(TAG,"handleOnTouch");
        // First call ArFragment's listener to handle TransformableNodes.
        arFragment.onPeekTouch(hitTestResult, motionEvent);

        // Check for touching a Sceneform node
        if (hitTestResult.getNode() != null) {
            Log.d(TAG,"handleOnTouch hitTestResult.getNode() != null");
            Node hitNode = hitTestResult.getNode();

            if (hitNode.getRenderable() == andyRenderable) {
                //DO whatever you need to here...

            }
            return;

你可以像这样删除一个节点:

private void removeAnchorNode(AnchorNode nodeToremove) {
        //Remove an anchor node
        if (nodeToremove != null) {
            arFragment.getArSceneView().getScene().removeChild(nodeToremove);
            anchorNodeList.remove(nodeToremove);
            nodeToremove.getAnchor().detach();
            nodeToremove.setParent(null);
            nodeToremove = null;
        } else {
            //Handle error case here
        }
    }

此处提供完整代码:https://github.com/mickod/LineView - 以上是经过编辑的摘录。

您可以使用下面的代码

从场景表单中分离 android 模型
 List<Node> children = new ArrayList<>(arFragment.getArSceneView().getScene().getChildren());
        for (Node node : children) {
            if (node instanceof AnchorNode) {
                if (((AnchorNode) node).getAnchor() != null) {
                    ((AnchorNode) node).getAnchor().detach();
                }
            }
            if (!(node instanceof Camera) && !(node instanceof Sun)) {
                node.setParent(null);
            }
        }