ARCORE:通过单击此可渲染对象来删除特定的可渲染对象

问题描述 投票:1回答:2

我正在使用ARCore的Sceneform开发项目。我基于ARCore提供的HelloSceneform示例进行开发。我想做的是通过单击添加一个可渲染对象,然后在单击屏幕上的特定可渲染对象时将其删除。我已经尝试过如下方法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);
          }
      });

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

arcore sceneform
2个回答
1
投票

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

如果要使用单独的按钮来删除选定的节点,可以添加常规按钮和侦听器,而只需使用'touch'事件来选择要删除的节点。

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);
                hitNode.getAnchor().detach();
                hitNode.setParent(null);
                hitNode = null;
             }
        }

}


0
投票

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

  1. 您要删除的节点,首先必须通过单击或触摸该节点来选择可转移节点
  2. TransfarableNode.setOnTapListener此方法为我们服务。
  3. HitTestResult获取节点,然后分离节点。

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

    transformableNode.setParent(anchorNode );
    transformableNode.setRenderable(model_nodeRenderable);
    transformableNode.select();
    transformableNode.setOnTapListener((HitTestResult hitTestResult, MotionEvent Event) ->
    {

       Node nodeToRemove = hitTestResult.getNode();
       anchorNode.removeChild(nodeToRemove );

    });
© www.soinside.com 2019 - 2024. All rights reserved.