简体   繁体   English

Android AR 场景。 随着相机移动 3D model 移动。 3D model 应与底部对齐

[英]Android AR Sceneform. Moving 3D model along with Camera moving. 3D model should be align to the bottom

I'm a newbie in AR for Android, and I wanna achieve the following behavior.我是 Android 的 AR 新手,我想实现以下行为。 I'm using Sceneform.我正在使用场景形式。

implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.15.0'

I have a 3D model (simple cuboid).我有一个 3D model(简单长方体)。 Here is the method to create cuboid.这是创建长方体的方法。

  private ModelRenderable 3dModel;

  private void createModel(AnchorNode anchorNode) {
  TransformableNode cartoonPersonNodeThree = new TransformableNode(arFragment.getTransformationSystem());
      cartoonPersonNodeThree.getScaleController()
          .setEnabled(false); // Disable scaling
      cartoonPersonNodeThree.getTranslationController()
          .setEnabled(false); // Disable moving
      cartoonPersonNodeThree.setParent(anchorNode);
      cartoonPersonNodeThree.setRenderable(3dModel);
      cartoonPersonNodeThree.select();

} }

I need this model to be displayed in front of user when Surface is detected, and it should be moved along with camera moving.当检测到 Surface 时,我需要将此 model 显示在用户面前,并且它应该随着相机的移动而移动。

The code below does it.下面的代码做到了。 3D model is displayed in the center and 1m in front of the camera. 3D model 显示在中央和相机前方 1m 处。

arFragment.getArSceneView()
    .getScene()
    .addOnUpdateListener(frameTime -> {
      Frame frame = arFragment.getArSceneView()
          .getArFrame();
      if (frame == null) {
        return;
      }

      if (frame.getCamera()
          .getTrackingState() != TrackingState.TRACKING) {
        return;
      }

      if (isModelAlreadyInPlace) {
        return;
      }

      if (isModelLocked) {
        return;
      }

      removeAnchorNode(anchorNode); // Remove previous 3D model

      // Place the anchor 1m in front of the camera.
      Session session = arFragment.getArSceneView()
          .getSession();
      Anchor newMarkAnchor = session.createAnchor(frame.getCamera()
          .getPose()
          .compose(Pose.makeTranslation(0, 0, -1f)) //This will place the anchor 1M in front of the camera
          .extractTranslation());

      AnchorNode addedAnchorNode = new AnchorNode(newMarkAnchor);
      addedAnchorNode.setRenderable(cartoonPersonThree);
      addedAnchorNode.setParent(arFragment.getArSceneView()
          .getScene());
      anchorNode = addedAnchorNode;
    });

The issue here is that 3D model is in the air, if I move my camera up to the ceiling, 3D model will be there.这里的问题是 3D model 在空中,如果我把我的相机移到天花板上,3D Z20F35E630DAF49D8CZ 会在那里 3685.5 在此处输入图像描述 在此处输入图像描述

Is there a way to align 3 D model to the floor?有没有办法将 3D model 与地板对齐?

This code snippet helped me to get exact behavior I wanted.此代码片段帮助我获得了我想要的确切行为。 We have a HitTest which hits to the center of our screen so we can get a "HitResult" and get Anchor from it.我们有一个命中到屏幕中心的 HitTest,因此我们可以获得“HitResult”并从中获取 Anchor。 So it's kind of pseudo tap event which we perform each frame chane.所以这是一种伪点击事件,我们执行每个帧通道。

private fun initArFragment() {
    arFragment.arSceneView.scene.addOnUpdateListener {
        arFragment.arSceneView?.let { sceneView ->
            sceneView.arFrame?.let { frame ->
                if (frame.camera.trackingState == TrackingState.TRACKING) {
                    val hitTest =
                        frame.hitTest(sceneView.width / 2f, sceneView.height / 2f)
                    val hitTestIterator = hitTest.iterator()
                    if (hitTestIterator.hasNext()) {
                        if (!placed) {
                            val hitResult = hitTestIterator.next()
                            val anchor = hitResult.createAnchor()
                            if (anchorNode == null) {
                                anchorNode = AnchorNode()
                                anchorNode?.setParent(sceneView.scene)
                                transformableNode =
                                    DragTransformableNode(arFragment.transformationSystem)
                                transformableNode?.setParent(anchorNode)
                                boxNode = createBoxNode(.4f, .6f, .4f)
                                boxNode?.setParent(transformableNode)
                            }
                            anchorNode?.anchor?.detach()
                            anchorNode?.anchor = anchor
                        }
                    }
                }
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM