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

时间:2018-11-06 14:19:09

标签: android opencv augmented-reality arcore sceneform

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

有什么不同的解决方法?

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

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

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

您至少可以使用5种不同的方式在场景中放置3D对象。但是,如果没有Anchor(位于对象的枢轴点的对象的局部坐标系),任何3D几何都不会存在

以下方法可用于放置对象

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

您可以看到,并非总是使用Feature points选项。发挥创造力,并使用所有有效的方法在场景中放置3D。

答案 2 :(得分:1)

您可以将对象锚定到任何可跟踪对象,然后要求用户移动直到墙。您计算距离,然后以某种方式从该可跟踪对象获得对那堵墙的深度感知。当然,您会看到一些漂移,但是ARCore总是会发生这种情况。

答案 3 :(得分:1)

根据ARCore-2020,可以通过使用

来将锚点放置在相机当前所在的位置
session.createAnchor(camera.getDisplayOrientedPose());  

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

因为在处放置了锚点

{{1}}

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

除非您的命中结果可以为您提供可跟踪的特征(例如飞机或点),否则您将无法在无特征的墙上创建锚点。

如果您的应用程序是为特定用例设计的,则可以对环境进行一些假设,并在特征区域中的锚点与特征较少区域中的所需锚点之间建立某种矢量关系。

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

我首先将锚定点放置在 a,b,c 的任意三面墙中,在那里我知道绝对可以追踪一个特征点。

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

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

的旋转

现在,如果您要在墙上放置锚点。您会找到摄影机线和墙平面之间的交点。