android - 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 问题的图示。
我的观察:
当我根据相机姿势获取锚点时,我假设锚点的方向和姿势属性仅基于相机姿势,即当相机移动(平移)时,锚点也会相应移动 - 我的理解是否正确?
ArSession_acquireNewAnchor(ar_session_, raw_camera_pose , &anchor)
在使用基于 hitResult 的锚点采集时,一切正常,即当设备在适当的位置(触摸坐标)从一个方向更改为另一个方向时出现锚对象 - 但是我的用例不依赖于触摸输入事件。我需要在给定场景的预定义位置坐标上实现相同的效果。
if( ArHitResult_acquireNewAnchor (ar_session_, ar_hit_result, &anchor)!= AR_SUCCESS) { LOGE("不成功"); 返回; }
请注意,这是使用 ArCore NDK 开发的。
解决方案
我可以通过调整锚对象的位姿值来实现这一点。
相机原始姿势由 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 精度。
推荐阅读
- json - 使用 Powershell 运行多个迭代 API 调用
- ocaml - 不支持沙丘版本
- python-3.x - Sklearn 在手动训练期间停止损失高原
- python - SQL join 子句中的 table1.{0} == table2.{0} 是什么意思?
- dialogflow-es - DialogFlow with Telegram:如何接收图像并将其与对话一起保存
- jquery - Popover JS 抛出错误甚至已经包含
- react-native - this.setState 不是函数。React Native 新手
- docker - 尝试运行 apk add 时为 PowerPC (PPC64le) 构建基于 alpine 的图像失败
- javascript - 如何显示来自数据库的反应项目列表
- kubernetes - Spring Cloud Kubernetes + Spring Cloud Gateway:无法找到 k8s 服务的实例