簡體   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

我是 Android 的 AR 新手,我想實現以下行為。 我正在使用場景形式。

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

我有一個 3D model(簡單長方體)。 這是創建長方體的方法。

  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();

}

當檢測到 Surface 時,我需要將此 model 顯示在用戶面前,並且它應該隨着相機的移動而移動。

下面的代碼做到了。 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;
    });

這里的問題是 3D model 在空中,如果我把我的相機移到天花板上,3D Z20F35E630DAF49D8CZ 會在那里 3685.5 在此處輸入圖像描述 在此處輸入圖像描述

有沒有辦法將 3D model 與地板對齊?

此代碼片段幫助我獲得了我想要的確切行為。 我們有一個命中到屏幕中心的 HitTest,因此我們可以獲得“HitResult”並從中獲取 Anchor。 所以這是一種偽點擊事件,我們執行每個幀通道。

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