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

Unity开发位置型AR应用:Geospatial Anchor与Cloud Anchor选型及脚本问题

AR跨设备固定位置显示物体及Geospatial Anchor定位问题解决

一、Geospatial Anchor 与 Cloud Anchor 的选择

  • 仅用Geospatial Anchor就足够满足你的需求。它基于全球地理坐标系(经纬度+海拔)创建锚点,只要用户设备支持Geospatial功能且定位准确,所有用户都能在同一现实位置看到对应的AR物体。
  • Cloud Anchor的核心作用是基于环境视觉特征同步锚点,适合无明确地理坐标的场景(比如室内相对位置对齐),你的场景不需要搭配它。

二、Geospatial Anchor 位置偏移、抖动问题修复

针对你提供的脚本,问题主要出在锚点创建时机、精度判断和逻辑稳定性上,以下是具体修正方案:

1. 等待定位精度达标后再创建锚点

当EarthTrackingState刚进入Tracking状态时,设备的地理定位精度还未稳定,此时创建的锚点会有极大误差。需要增加对定位精度的判断,比如要求精度小于1米时再执行创建逻辑:

// 替换原逻辑中的创建判断
if (cameraGeospatialPose.Accuracy < 1.0f) // 精度阈值可根据需求调整
{
    anchor = ARAnchorManagerExtensions.AddAnchor(arAnchorManager, latitude, longitude, altitude, Quaternion.identity);
    spawnedPrefab = Instantiate(prefabMarker, anchor.transform);
}

2. 避免重复创建锚点

用独立的布尔变量标记锚点是否已创建,防止因状态波动导致重复初始化:

private bool hasSpawnedAnchor = false; // 新增标记变量

// 在创建逻辑中加入判断
if (isSessionReady && earthTrackingState == TrackingState.Tracking && cameraGeospatialPose.Accuracy < 1.0f && !hasSpawnedAnchor)
{
    anchor = ARAnchorManagerExtensions.AddAnchor(arAnchorManager, latitude, longitude, altitude, Quaternion.identity);
    spawnedPrefab = Instantiate(prefabMarker, anchor.transform);
    hasSpawnedAnchor = true; // 标记为已创建
}

3. 优化初始化监听逻辑

放弃Update轮询,改用事件监听来响应跟踪状态变化,减少无效判断:

private void OnEnable()
{
    arEarthManager.EarthTrackingStateChanged += OnEarthTrackingStateChanged;
}

private void OnDisable()
{
    arEarthManager.EarthTrackingStateChanged -= OnEarthTrackingStateChanged;
}

private void OnEarthTrackingStateChanged(EarthTrackingStateChangedEventArgs args)
{
    if (args.TrackingState == TrackingState.Tracking && Input.location.status == LocationServiceStatus.Running && !hasSpawnedAnchor)
    {
        var cameraPose = arEarthManager.CameraGeospatialPose;
        if (cameraPose.Accuracy < 1.0f)
        {
            anchor = ARAnchorManagerExtensions.AddAnchor(arAnchorManager, latitude, longitude, altitude, Quaternion.identity);
            spawnedPrefab = Instantiate(prefabMarker, anchor.transform);
            hasSpawnedAnchor = true;
        }
    }
}

4. 基础检查项

  • 确认latitude、longitude、altitude的数值格式正确:纬度范围-9090,经度范围-180180,海拔采用WGS84坐标系基准值。
  • 确保设备已授予精确位置权限,并在开阔户外环境测试(室内或遮挡场景GPS精度会大幅下降)。

内容的提问来源于stack exchange,提问作者Mattia Pompita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:45:31