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

如何在ArCore离线环境中实现持久化Cloud Anchors?可离线使用或本地存储复用吗?

ArCore离线环境下Cloud Anchors与本地锚点方案解答

一、Cloud Anchors能否离线使用?

不行。Cloud Anchors的核心逻辑依赖Google云端服务同步、比对锚点的空间特征数据——创建锚点时需上传空间特征到云端,检索时要从云端拉取匹配数据定位。离线状态下没有云端交互通道,完全无法完成锚点的创建和检索流程,因此没法离线使用。

二、离线环境下的本地锚点持久化方案

如果需要在离线环境下存储、检索并复用锚点,ArCore自带的**Local Anchors(本地锚点)**是最直接的替代方案,具体实现步骤如下:

1. 创建本地锚点

当AR会话检测到合适的平面或空间特征点后,基于当前位姿(Pose)创建本地锚点:

// 假设已获取目标位姿targetPose
LocalAnchor localAnchor = session.createAnchor(targetPose);

2. 持久化存储锚点

将锚点序列化为字节数组,存储到本地设备(比如SharedPreferences、SQLite数据库或本地文件):

// 序列化锚点
byte[] serializedAnchor = localAnchor.serialize();
// 示例:存到SharedPreferences
SharedPreferences prefs = getSharedPreferences("AR_Anchors", MODE_PRIVATE);
prefs.edit().putString("saved_anchor", Base64.encodeToString(serializedAnchor, Base64.DEFAULT)).apply();

3. 检索并复用锚点

下次启动AR应用时,读取本地存储的锚点数据,反序列化后重新获取锚点对象,即可基于它放置AR内容:

// 从SharedPreferences读取
SharedPreferences prefs = getSharedPreferences("AR_Anchors", MODE_PRIVATE);
String encodedAnchor = prefs.getString("saved_anchor", null);
if (encodedAnchor != null) {
    byte[] serializedAnchor = Base64.decode(encodedAnchor, Base64.DEFAULT);
    // 反序列化得到锚点
    LocalAnchor restoredAnchor = session.deserializeAnchor(serializedAnchor);
    // 基于恢复的锚点放置AR内容
    // ...
}

提升本地锚点复用准确率的技巧

  • 搭配空间地图存储:如果环境较大或需要更稳定的锚点复用,可在创建锚点后保存当前空间地图:
// 保存地图
byte[] savedMap = session.saveMap();
// 存储savedMap到本地,下次启动时加载
session.loadMap(savedMap);

加载地图后再反序列化锚点,能让设备更快对齐之前的空间环境,提升锚点定位准确性。

  • 注意:本地锚点仅能在创建它的设备上复用,无法跨设备共享,这是和Cloud Anchors的核心区别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:48:20