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
相关产品推荐
相关产品推荐

