iOS 版 ARCore SDK 會與 ARKit 介面連結,提供 Cloud Anchor 功能,讓您在相同環境中在 iOS 和 Android 裝置之間共用錨點。
瞭解如何在您自己的應用程式中使用 ARCore Cloud Anchor API 或 ARCore Cloud Anchor 服務。
必要條件
- Xcode 13.0 以上版本
- 如果使用 Cocoapods,請使用 1.4.0 以上版本
- 搭載 iOS 12.0 以上版本的 ARKit 相容 Apple 裝置 (必須指定 iOS 12.0 以上版本為部署目標)
如果您是 Cloud Anchors 新手:
請務必瞭解用於代管及解析 Cloud Anchor 的程序。
請詳閱快速入門指南,瞭解系統需求、設定和安裝說明。
查看其中一個 Cloud Anchor 範例
在應用程式中啟用 Cloud Anchors
如要使用 Cloud Anchors API,您必須建立 GARSessionConfiguration
,並為其設定 cloudAnchorMode
屬性,如在 iOS 中設定 ARCore 工作階段所述。使用 setConfiguration:error: (GARSession)
設定設定。
您也必須為應用程式啟用 ARCore API。
主機和解析錨點
您可以使用 ARCore Cloud Anchor API 代管及解析雲端錨點。這個 API 包含已完成作業的回呼方法,以及可輪詢的 Future 物件。
主持節目
代管 ARAnchor
會將錨點置於任何指定實體空間的通用座標系統中。
主機要求會將視覺資料傳送至 Google 伺服器,後者會將 ARAnchor
的位置對應至代表目前實體空間的座標系統。成功的代管要求會傳回新的 Cloud Anchor ID,可供您稍後用於解析錨點。
- (void)addAnchorWithTransform:(matrix_float4x4)transform {
self.arAnchor = [[ARAnchor alloc] initWithTransform:transform];
[self.sceneView.session addAnchor:self.arAnchor];
__weak ExampleViewController *weakSelf = self;
self.hostFuture = [self.cloudAnchorManager
hostCloudAnchor:self.arAnchor
completion:^(NSString *anchorId, GARCloudAnchorState cloudState) {
[weakSelf handleHostAnchor:anchorId cloudState:cloudState];
}
error:nil];
[self enterState:HelloARStateHosting];
}
解析錨點
解決 ARAnchor
後,特定實體空間中的 Android 和 iOS 裝置就能將先前代管的錨點新增至新場景。
解析要求會將雲端錨點 ID 和目前影格中的視覺資料傳送至 Google 伺服器。伺服器會嘗試將這項視覺資料與目前代管 Cloud Anchor 的對應圖像比對。解析成功後,系統會在工作階段中新增錨點並傳回。
- (void)resolveAnchorWithIdentifier:(NSString *)identifier {
GARResolveCloudAnchorFuture *garFuture =
[self.gSession resolveCloudAnchorWithIdentifier:identifier
completionHandler:completion
error:&error];
}
// Pass the ARFRame to the ARCore session every time there is a frame update.
// This returns a GARFrame that contains a list of updated anchors. If your
// anchor's pose or tracking state changed, your anchor will be in the list.
- (void)cloudAnchorManager:(CloudAnchorManager *)manager didUpdateFrame:(GARFrame *)garFrame {
for (GARAnchor *garAnchor in garFrame.updatedAnchors) {
if ([garAnchor isEqual:self.garAnchor] && self.resolvedAnchorNode) {
self.resolvedAnchorNode.simdTransform = garAnchor.transform;
self.resolvedAnchorNode.hidden = !garAnchor.hasValidTransform;
}
}
}
選用的 GARSession
輪詢模式
如果您使用 Metal 或需要輪詢選項,且應用程式以至少 30 fps 的速度執行,請使用下列模式將 ARFrame
傳遞至 GARSession
:
-(void)myOwnPersonalUpdateMethod {
ARFrame *arFrame = arSession.currentFrame;
NSError *error = nil;
GARFrame *garFrame = [garSession update:arFrame error:&error];
// your update code here
}
API 配額
ARCore API 針對要求頻寬設有以下配額:
配額類型 | 上限 | 持續時間 | 套用對象 |
---|---|---|---|
錨點數 | 無限制 | 無 | 專案 |
錨點主機要求 | 30 | 分鐘 | IP 位址和專案 |
錨定resolve要求 | 300 | 分鐘 | IP 位址和專案 |
已知問題和解決方法
使用 iOS 版 ARCore SDK 時,會發生一些已知問題。
預設配置設定導致應用程式不時當機
根據預設,系統會啟用 GPU 影格擷取和 Metal API 驗證配置設定,這可能導致應用程式在 SDK 中當機。
診斷應用程式當機問題
每當您懷疑發生異常終止時,請查看堆疊追蹤。如果在堆疊追蹤中看到 MTLDebugComputeCommandEncoder
,可能是因為預設的配置文件設定。
解決方法
前往Product > Scheme > Edit Scheme…。
開啟 Run 分頁。
點選 Options 即可查看目前的設定。
請確認已停用 GPU Frame Capture 和 Metal API Validation。
建構並執行應用程式。
如需其他已知問題,請參閱 Cocoapods CHANGELOG
。
限制
iOS 版 ARCore SDK 不支援 ARKit setWorldOrigin(relativeTransform:)
方法呼叫。
效能注意事項
啟用 ARCore API 後,記憶體用量會增加。由於網路用量和 CPU 使用率較高,因此裝置的電池用量也會增加。