首页 > 解决方案 > ArCore :: 锚点 - 始终使用 ArSession_acquireNewAnchor API 出现在镜头前

问题描述

应用信息:

我正在开发一个基于ArCore (NDK)的 Android 应用程序,以在真实的相机源上增强某些对象(从搅拌器工具生成)。现在我可以将对象绘制为锚点,这些锚点会随着相机位置的变化而放大/缩小。

我正在使用 ArSession_acquireNewAnchor API 来托管距离相机大约几英寸的锚点,如下所示。

ArPose_create(ar_session_, nullptr, &camera_pose);
ArPose_getPoseRaw(ar_session_, camera_pose, raw_camera_pose);
ArAnchor *anchor = nullptr;
if (ArSession_acquireNewAnchor(ar_session_, raw_camera_pose, &anchor)!=AR_SUCCESS) {          
    LOGE("Anchor is not successfully acquired");
    } 

启动应用程序并将设备保持在同一方向后,可以看到上面的锚点。

问题陈述:

当相机位置/方向发生变化时,这些锚点不会按预期显示。请帮助 - PFB 问题的图示。

我的观察:

  1. 当我根据相机姿势获取锚点时,我假设锚点的方向和姿势属性仅基于相机姿势,即当相机移动(平移)时,锚点也会相应移动 - 我的理解是否正确?

    ArSession_acquireNewAnchor(ar_session_, raw_camera_pose , &anchor)

  2. 在使用基于 hitResult 的锚点采集时,一切正常,即当设备在适当的位置(触摸坐标)从一个方向更改为另一个方向时出现锚对象 - 但是我的用例不依赖于触摸输入事件。我需要在给定场景的预定义位置坐标上实现相同的效果。

    if( ArHitResult_acquireNewAnchor (ar_session_, ar_hit_result, &anchor)!= AR_SUCCESS) { LOGE("不成功"); 返回; }

问题陈述

请注意,这是使用 ArCore NDK 开发的。

标签: androidaugmented-realityarcoreprojection-matrix

解决方案


我可以通过调整锚对象的位姿值来实现这一点。

相机原始姿势由 7 个参数组成,如下所示。

  raw_pose = {0, 0, 0, 1.0, driftx, 0,-5.0};

用于获取锚点的 API-

  ArSession_acquireNewAnchor(ar_session_, raw_pose, &anchor);

在这里,第 7 个索引值将锚点放置在距离相机 5 个单位的位置。第 5 个索引值(driftx)指示 ArCore 为给定的锚点在 x 中进行必要的(driftx 单位)转换。当设备从一侧转向另一侧时,属性driftx 用于跟踪相机位姿的漂移(仅相机位姿的第5 个索引值)。

计算driftx 的方法没有得到准确的解,但接近于预期的结果。正在进一步研究提高driftx 精度。


推荐阅读