ARCore – 如何在没有任何特征点的情况下在墙壁等表面上放置/创建对象?

Posted

技术标签:

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

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

有哪些不同的解决方法?

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

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

【问题讨论】:

【参考方案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());

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

https://github.com/google-ar/sceneform-android-sdk/issues/19

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

如果您确实还想前后移动可渲染对象,那么可能有更好的方法来做到这一点,但我发现的最可靠的方法是,按照单独的 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 的旋转

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

【讨论】:

以上是关于ARCore – 如何在没有任何特征点的情况下在墙壁等表面上放置/创建对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有控制器调用的情况下在项目内的任何地方调用模型方法?

如何在没有任何附加模块的情况下在迷你 Web 服务器中返回 json?

如何在没有任何第三方模块的情况下在 Node Js 中发布 https 帖子?

如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表

如何在没有任何 vue 库的情况下在 vue 回调中获取 http 响应标头(axios)

在没有任何用户控制或交互的情况下在 iPhone 上播放全屏视频?