6

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

有哪些不同的解决方法?

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

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

4

4 回答 4

5

您可以相对于相机位置设置锚点 - 即将相机指向您要连接的墙壁。

要获得正确的深度,您需要将相机保持在设定的预设距离,或者添加前后移动对象的能力。正如@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。

于 2018-11-06T15:55:49.597 回答
2

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

以下方法可用于对象的放置

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

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

于 2018-11-07T00:37:00.257 回答
1

根据 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));

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

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

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

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

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

创建一个平面,使用这 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 的旋转

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

于 2020-09-07T06:35:48.147 回答
1

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

于 2018-11-06T14:39:34.620 回答