You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:45:35