首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android AR Sceneform随着相机的移动移动3D模型。3D模型应与底部对齐

Android AR Sceneform随着相机的移动移动3D模型。3D模型应与底部对齐
EN

Stack Overflow用户
提问于 2020-12-15 17:49:25
回答 1查看 212关注 0票数 0

我是AR for Android的新手,我想实现以下行为。我使用的是Sceneform。

代码语言:javascript
运行
复制
implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.15.0'

我有一个3D模型(简单的长方体)。下面是创建长方体的方法。

代码语言:javascript
运行
复制
  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();

}

我需要这个模型显示在用户面前,当表面被检测到,它应该随着相机的移动。

下面的代码可以做到这一点。3D模型显示在中心和相机前面1米处。

代码语言:javascript
运行
复制
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模型在空中,如果我把相机移到天花板上,3D模型就会在那里。

有没有办法把3D模型和地板对齐?

EN

Stack Overflow用户

发布于 2021-01-14 18:59:08

这段代码帮助我获得了我想要的确切行为。我们有一个点击屏幕中心的HitTest,所以我们可以得到一个"HitResult“,并从中获得锚点。所以这是一种伪点击事件,我们在每个帧通道中执行。

代码语言:javascript
运行
复制
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
                        }
                    }
                }
            }
        }
    }
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65303465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档