如何在ARCore应用中基于Anchor坐标从屏幕触摸获取3D点?
在ARCore中基于Anchor坐标从屏幕触摸获取3D点的实现方案
核心思路是:先通过屏幕触摸得到世界空间的3D点,再将该点转换为目标Anchor的局部坐标空间——这样后续只需借助该Anchor的Pose,就能把物体精准还原到对应位置。
具体实现步骤
第一步:从触摸操作获取世界空间3D点
利用ARCore的射线检测,从屏幕触摸位置投射射线,检测平面或场景特征点,得到世界空间中的HitPose:// 捕获屏幕触摸事件 MotionEvent touchEvent = ...; // 从触摸坐标创建射线 Ray touchRay = arSceneView.getCamera().createRay(touchEvent.getX(), touchEvent.getY()); // 执行场景命中检测 List<HitResult> hitResults = arSceneView.getSession().getCurrentFrame().hitTest(touchRay); if (!hitResults.isEmpty()) { HitResult validHit = hitResults.get(0); // 提取世界空间下的3D点坐标 Pose worldHitPose = validHit.getHitPose(); float[] worldPoint = {worldHitPose.tx(), worldHitPose.ty(), worldHitPose.tz()};第二步:将世界坐标转换为Anchor局部坐标
通过Anchor在世界空间中的Pose的逆变换,把世界点映射到Anchor的局部坐标系:// 假设你已创建/获取目标Anchor Anchor targetAnchor = ...; Pose anchorWorldPose = targetAnchor.getPose(); // 计算Anchor Pose的逆变换矩阵,用于坐标转换 Pose inverseAnchorPose = anchorWorldPose.inverse(); // 转换世界点到Anchor局部空间 float[] anchorLocalPoint = inverseAnchorPose.transformPoint(worldPoint); // anchorLocalPoint即为基于该Anchor的局部3D坐标,可保存用于后续还原 }第三步:借助Anchor还原物体位置
后续需要放置物体时,将保存的Anchor局部坐标再转换回世界空间:// 从Anchor局部坐标生成对应的世界Pose Pose objectWorldPose = targetAnchor.getPose().compose( new Pose(anchorLocalPoint, new float[]{0, 0, 0, 1}) // 仅位置转换,旋转保持默认 ); // 设置AR物体的Pose yourArNode.setPose(objectWorldPose);
关键注意事项
- 如果需要在应用重启后仍能还原位置,需将Anchor设置为持久化Anchor,可通过ARCore的Cloud Anchor功能或本地存储Anchor的标识信息实现。
- 确保命中检测优先选择已跟踪的平面或特征点,避免无效的HitResult导致坐标偏差。
- ARCore采用右手坐标系,Y轴向上,转换时需注意坐标轴方向一致性。
内容的提问来源于stack exchange,提问作者SeohyeonPark
相关产品推荐
相关产品推荐

