【问题标题】:ARCore – How to place/create objects on surfaces like walls without any Feature Points?ARCore – 如何在没有任何特征点的情况下在墙壁等表面上放置/创建对象?
【发布时间】:2019-04-09 22:56:39
【问题描述】:

例如:我有兴趣将 2D 图像放置在垂直平面上(例如:没有特征点的白色或单色墙壁)。

有哪些不同的解决方法?

我知道 ARCore 支持相对于其他对象放置对象。我如何扩展它来满足我将对象相对于未检测到特征点的其他对象放置的要求?

非常感谢任何想法或解决方法。

【问题讨论】:

    标签: java android augmented-reality arcore sceneform


    【解决方案1】:

    您可以将一个对象锚定到任何 Trackable,然后要求用户移动到墙壁。你计算距离,然后你以某种方式从那个可追踪的墙上获得你对那面墙的深度感知。你当然会看到一些偏差,但 ARCore 一直都在发生这种情况。

    【讨论】:

      【解决方案2】:

      您可以相对于相机位置设置一个锚点 - 即将相机指向您要附加到的墙壁。

      要获得正确的深度,您需要将相机保持在设定的预设距离,或者添加前后移动对象的功能。正如@Ali 提到的那样,您会有漂移,但目前这种情况很常见。

      下面的代码将在相机视图的中间添加锚点:

      //Add an Anchor and a renderable in front of the camera       
      Session session = arFragment.getArSceneView().getSession();
      float[] pos = { 0, 0, -1 };
      float[] rotation = { 0, 0, 0, 1 };
      Anchor anchor =  session.createAnchor(new Pose(pos, rotation));
      anchorNode = new AnchorNode(anchor);
      anchorNode.setRenderable(andyRenderable);
      anchorNode.setParent(arFragment.getArSceneView().getScene());
      

      有关此问题的更多讨论,请参见此处:

      该方法确实有效,您可以根据需要设置深度。

      如果您确实还想前后移动可渲染对象,那么可能有更好的方法来做到这一点,但我发现的最可靠的方法是,按照单独的 GitHub 讨论中的建议,删除锚点并创建一个新位置位于新位置后面或前面的设置位置 - 即有一个按钮,允许用户将可渲染对象向后移动 0.1M 或向前移动 0.1M。

      【讨论】:

      • 感谢您的回答。我非常爱你
      【解决方案3】:

      您可以使用至少 5 种不同的方式在场景中放置 3D 对象。但是任何 3D 几何都不能没有Anchor——一个对象的局部坐标系位于其轴心点

      可以使用以下方法来放置对象

      • 如果启用平面检测,ARCore 可以自动将Anchor 添加到当前会话中。
      • 当您点击屏幕时,您可以将一个点投影到一个假想的平面上,放置锚点。
      • ARCore 相机的变换(其位置和方向)可用于放置锚。
      • 特征点(高对比度边缘上的点)可以为您提供放置锚点的位置。
      • 特征点集群允许您保存真实世界的环境地图以供以后检索。

      正如您所见,Feature points 选项并不总是被使用。发挥创意并使用所有有效的方法在场景中放置 3D。

      【讨论】:

        【解决方案4】:

        根据 ARCore-2020,可以通过使用将锚点放置在相机当前所在的位置

        session.createAnchor(camera.getPose());
        

        session.createAnchor(camera.getDisplayOrientedPose());  
        

        因为放置了一个锚点

        float[] pos = {0,0,-1};
        float[] rotation = {0,0,0,1};
        session.createAnchor(new Pose(pos, rotation));
        

        在全局原点(会话开始的地方)创建一个锚点。

        除非您的命中结果可以为您提供可跟踪的特征,例如平面或点,否则您无法在没有特征的墙上创建锚点。

        如果您的应用程序是为特定用例设计的,您可以对环境做出一些假设,并在位于特征区域的锚点和位于特征较少区域的所需锚点之间制定一些矢量关系。

        例如。 如果您想在没有任何功能的墙上放置锚点。 (前提是相机始终处于跟踪状态)。

        我会首先在任意 3 个墙 a、b、c 上放置一个锚点,我知道那里肯定有一个可追踪的特征点。

        使用这 3 个点创建一个平面,可以在此处找到其数学运算

        https://sites.math.washington.edu/~king/coursedir/m445w04/notes/vector/equations.html

        现在得到沿相机观察方向的直线方程 ->

        如果相机位姿 = X = {x,y,z} 且 Q = {qx,qy,qz,qw},则直线方程 = {x,y,z} + LAMBDA (Q.{0 ,0,-1})

        其中 LAMBDA 是沿线的随机变量。 Q.{0,0,-1} 表示 {0,0,-1} 与四元数 Q 的旋转

        所以现在如果你想在墙上放一个锚。您会找到相机线和墙壁平面之间的交点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          • 1970-01-01
          • 2014-10-02
          • 1970-01-01
          • 2011-07-07
          • 2016-07-03
          • 1970-01-01
          相关资源
          最近更新 更多