如何将可渲染对象放置到HitTestResult getPoint()位置

时间:2018-10-08 14:54:27

标签: java android raycasting arcore sceneform

我想将一个可渲染的小球放置到轻拍已放置的模型的位置,并将其锚定到该位置。可以实现吗?如果可以,如何实现?

private void tryPlaceModel(MotionEvent motionEvent, Frame frame)
{
   if (isModelPlaced)
   {
      return;
   }

   if (motionEvent != null && frame.getCamera().getTrackingState() == TrackingState.TRACKING)
   {
    for (HitResult hit : frame.hitTest(motionEvent))
    {
    Trackable trackable = hit.getTrackable();

    if (trackable instanceof Plane && ((Plane) trackable).isPoseInPolygon(hit.getHitPose()))
    {
       // Create the Anchor.
       Anchor anchor = hit.createAnchor();
       AnchorNode anchorNode = new AnchorNode(anchor);
       anchorNode.setParent(arSceneView.getScene());

       TransformableNode model = new TransformableNode(arFragment.getTransformationSystem());
       model.setParent(anchorNode);
       model.setRenderable(andyRenderable);
       model.select();

       isModelPlaced = true;

       model.setOnTapListener((hitTestResult, motionEvent1) ->
       {
          Frame frame1 = arSceneView.getArFrame();

          if (motionEvent1 != null && frame1.getCamera().getTrackingState() == TrackingState.TRACKING)
          {
             com.google.ar.sceneform.rendering.Color color = new com.google.ar.sceneform.rendering.Color();
             color.set(Color.RED);

             MaterialFactory.makeOpaqueWithColor(this, color)
                   .thenAccept(
                         material ->
                         {
                            Pose pose = Pose.makeTranslation(hitTestResult.getPoint().x, hitTestResult.getPoint().y, hitTestResult.getPoint().z);

                            Anchor anchor1 = session.createAnchor(pose);

                            AnchorNode anchorNode1 = new AnchorNode(anchor1);
                            anchorNode1.setParent(hitTestResult.getNode());

                            Renderable sphere = ShapeFactory.makeSphere(0.05f,
                                  /* WRONG LOCATION */anchorNode1.getLocalPosition(), material);

                            Node indicatorModel = new Node();
                            indicatorModel.setParent(anchorNode1);
                            indicatorModel.setRenderable(sphere);
                         }
                   );
          }
       });
    }
 }
 }

这就是我现在的位置。该代码完全可以工作,除了我希望球体出现的位置。我也尝试过使用AnchorNode.getWorldPosition,但这也是错误的。

球体出现在模型的背面。这是因为getPoint()方法返回了射线照射到平面上的点(尽管从字面上说,它返回了射线照射到模型/节点上的点),或者我只是做错了什么?

1 个答案:

答案 0 :(得分:1)

点击事件击中一个节点时,会调用Node.OnTapListener,该节点不同于响应平面上的命中测试的平面侦听器,而不是响应节点。

HitTestResult在可渲染对象上具有命中的节点和命中点的世界坐标。有了这些,您可以创建一个节点,将父节点设置为该节点的命中值,并将世界位置设置为该Hittest结果点:

Mod