ARCORE: удалите определенный рендеринг, нажав на этот рендеринг - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю над проектом, используя Sceneform от ARCore.Я разрабатываю его на основе примера HelloSceneform, предоставленного ARCore.То, что я хочу сделать, это добавить визуализируемый объект с помощью нажатия, а затем удалить его, когда я нажимаю на конкретный визуализируемый объект на экране.Я пробовал метод 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);
          }
      });

Есть ли какой-нибудь способ добиться этой функции?

1 Ответ

0 голосов
/ 21 февраля 2019

Приведенный ниже код должен обнаружить касание и удалить узел.

Если вы хотите иметь отдельную кнопку для удаления выбранного узла, вы можете добавить обычную кнопку и слушателя и просто использовать событие «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;
             }
        }

}

...