ARCORE:通过单击此渲染,删除特定的渲染



我正在使用Arcore的SceneForm从事一个项目。我将其基于Arcore提供的HellosceneForm示例。我想做的是通过hit添加可渲染的对象,然后在屏幕上单击特定渲染时将其删除。我已经尝试了Anchornode.setontaplistener的方法如下,但是它不起作用(无响应):

anchorNode.setOnTapListener(new Node.OnTapListener() {
                      @Override
                      public void onTap(HitTestResult hitTestResult, MotionEvent motionEvent) {
                          if(anchorNode.getAnchor()!=null){
                              arFragment.getArSceneView().getScene().removeChild(anchorNode);
                              anchorNode.getAnchor().detach();
                              anchorNode.setParent(null);
                          }
                      }
                  });

我还尝试了以下方法,这会导致意外关闭:

      Scene scene = arFragment.getArSceneView().getScene();
      scene.addOnPeekTouchListener(new Scene.OnPeekTouchListener() {
          @Override
          public void onPeekTouch(HitTestResult hitTestResult, MotionEvent motionEvent) {
              Node node = hitTestResult.getNode();
              node.setParent(null);
          }
      });

是否有任何方法可以实现此功能?

下面的代码应检测到触摸并删除节点。

如果您想拥有一个单独的按钮来删除选定的节点,则可以添加一个常规按钮和侦听器,然后使用"触摸"事件选择要删除的节点。

private void handleOnTouch(HitTestResult hitTestResult, MotionEvent motionEvent) {
        Log.d(TAG,"handleOnTouch");
        // First call ArFragment's listener to handle TransformableNodes.
        arFragment.onPeekTouch(hitTestResult, motionEvent);
        //We are only interested in the ACTION_UP events - anything else just return
        if (motionEvent.getAction() != MotionEvent.ACTION_UP) {
            return;
        }
        // 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) {
                Toast.makeText(LineViewMainActivity.this, "We've hit Andy!!", Toast.LENGTH_SHORT).show();
                arFragment.getArSceneView().getScene().removeChild(hitNode);
                AnchorNode hitNodeAnchor = (AnchorNode) hitNode;
                if (hitNodeAnchor != null) {
                     hitNode.getAnchor().detach();
                }
                hitNode.setParent(null);
                hitNode = null;
             }
        }

}

上面从VR测试应用程序的各个部分中提取,并在此处合并以进行简洁示例 - 完整的工作应用程序源可在此处提供:https://github.com/mickod/lineview

更新-Kotlin版本(2020年4月测试):

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

我知道我迟到了,但对某人可能有帮助。

  1. 您要删除的节点,首先您必须通过单击或触摸该节点选择可转移的节点
  2. TransfarableNode.setOntaplistener 这个方法中的这个butit为我们提供了目的。
  3. 之后,从 hittestResult 获得节点,而不是分离节点。

这是您可以用于选择和删除节点的代码。

    transformableNode.setParent(anchorNode );
    transformableNode.setRenderable(model_nodeRenderable);
    transformableNode.select();
    transformableNode.setOnTapListener((HitTestResult hitTestResult, MotionEvent Event) ->
    {
       Node nodeToRemove = hitTestResult.getNode();
       anchorNode.removeChild(nodeToRemove );
    });

最新更新