L'SDK ARCore per iOS si interfaccia con ARKit per fornire le funzionalità di Cloud Anchor e consentirti di condividere gli anchor tra dispositivi iOS e Android nello stesso ambiente.
Scopri come utilizzare l'API ARCore Cloud Anchor o il servizio ARCore Cloud Anchor nelle tue app.
Prerequisiti
- Xcode 13.0 o versioni successive
- Cocoapods 1.4.0 o versioni successive se utilizzi Cocoapods
- Un dispositivo Apple compatibile con ARKit con iOS 12.0 o versioni successive (target di deployment per iOS 12.0 o versioni successive)
Se non hai mai utilizzato gli ancoraggi Cloud:
Assicurati di comprendere il processo utilizzato per ospitare e risolvere un Cloud anchor.
Leggi la quickstart per i requisiti di sistema e le istruzioni di configurazione e installazione.
Guarda uno degli esempi di Cloud Anchor
Attiva gli ancoraggi cloud nell'app
Per utilizzare l'API Cloud Anchors, devi creare un
GARSessionConfiguration
e impostare la proprietà cloudAnchorMode
corrispondente, come descritto in
Configurare una sessione ARCore in iOS. Utilizza setConfiguration:error: (GARSession)
per impostare la configurazione.
Devi anche abilitare l'API ARCore per la tua applicazione.
Hosting e risoluzione di anchor
Puoi ospitare e risolvere gli ancoraggi cloud con l'API ARCore Cloud Anchor. L'API include metodi di callback per le operazioni completate e gli oggetti futuri di cui è possibile eseguire il polling.
Ospita un ancoraggio
L'hosting di un ARAnchor
inserisce l'ancoraggio in un sistema di coordinate comune per qualsiasi
spazio fisico.
Una richiesta host invia dati visivi a un server Google, che mappa la posizione di ARAnchor
in un sistema di coordinate che rappresenta lo spazio fisico attuale. Una richiesta host riuscita restituisce un nuovo ID di ancoraggio Cloud, che può essere condiviso e utilizzato per risolvere l'ancoraggio in un secondo momento.
- (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];
}
Risolvere un ancoraggio
La risoluzione di un ARAnchor
consente ai dispositivi Android e iOS in un determinato spazio fisico di aggiungere ancoraggi ospitati in precedenza a nuove scene.
Una richiesta di risoluzione invia a un server Google un ID Cloud anchor insieme ai dati visivi del frame corrente. Il server cercherà di abbinare questi dati visivi alle immagini del punto in cui sono mappati gli ancoraggi Cloud attualmente ospitati. Se la risoluzione ha esito positivo, viene aggiunto un nuovo ancoraggio alla sessione, che viene restituito.
- (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;
}
}
}
Pattern di polling GARSession
facoltativo
Se utilizzi Metal o hai bisogno di un'opzione di polling e la tua app viene eseguita a
almeno 30 FPS, usa il seguente pattern per passare ARFrame
a GARSession
:
-(void)myOwnPersonalUpdateMethod {
ARFrame *arFrame = arSession.currentFrame;
NSError *error = nil;
GARFrame *garFrame = [garSession update:arFrame error:&error];
// your update code here
}
Quote API
L'API ARCore prevede le seguenti quote per la larghezza di banda delle richieste:
Tipo di quota | Massimo | Durata | Si applica a |
---|---|---|---|
Numero di ancoraggi | Schermi illimitati | N/A | Progetto |
Richieste di ancoraggio host | 30 | minuto | Indirizzo IP e progetto |
Richieste di ancoraggio resolve | 300 | minuto | Indirizzo IP e progetto |
Problemi noti e soluzioni alternative
Esistono alcuni problemi noti che si verificano quando si lavora con l'SDK ARCore per iOS.
Le impostazioni di schema predefinite causano l'arresto anomalo dell'app intermittente
Le impostazioni dello schema di GPU Frame Capture e Metal API Validation sono attivate per impostazione predefinita, il che a volte può causare l'arresto anomalo dell'app all'interno dell'SDK.
Diagnosticare un arresto anomalo dell'app
Ogni volta che sospetti che si sia verificato un arresto anomalo, controlla l'analisi dello stack.
Se nell'analisi dello stack viene visualizzato MTLDebugComputeCommandEncoder
, è probabile che questo sia dovuto alle impostazioni dello schema predefinite.
Soluzione
Vai a Product > Scheme > Edit Scheme….
Apri la scheda Run.
Fai clic su Options per visualizzare le impostazioni correnti.
Assicurati che GPU Frame Capture e Metal API Validation siano entrambi disattivati.
Crea ed esegui la tua app.
Consulta il CHANGELOG
di Cocoapods per ulteriori problemi noti.
Limitazioni
L'SDK ARCore per iOS non supporta la chiamata al metodo setWorldOrigin(relativeTransform:)
ARKit.
Considerazioni sul rendimento
L'utilizzo della memoria aumenta quando abiliti l'API ARCore. È previsto un aumento dell'utilizzo della batteria del dispositivo a causa di un maggiore utilizzo della rete e della CPU.