O ancoră cloud este un tip special de ancoră care permite salvarea și reluarea experiențelor AR. Folosind Cloud Anchors API, putem crea spații interactive pe care să le ancorăm în locații din lumea reală și pe care să le distribuim și altor persoane. Practic, spre deosebire de o ancoră clasică, orice obiect cu o ancoră cloud atașată va fi vizibil simultan și oricând altcândva de oricâte device-uri. Ancorele cloud sunt disponibile atât pentru device-uri Android, cât și pentru iOS.
ARCore se conectează la serviciul ARCore Cloud Anchor pentru hosting și resolving. Deci, avem nevoie de conexiune la internet pentru a putea folosi ancore Cloud.
Modul de funcționare al ancorelor cloud:
Pentru a crea și a hosta o ancoră, ARCore folosește o hartă de feature-uri 3D a spațiului înconjurător. Pentru a obține această hartă, camera telefonului trebuie să mapeze mediul înconjurător din jurul punctului de interes din cât mai multe unghiuri și poziții diferite înainte de hosting-ul propriu-zis. Serviciul ARCore Cloud Anchor crează pe urmă o hartă de caracteristici 3D ale spațiului și întoarce id-ul unic.
public void HostAnchor() { Debug.Log("HostAnchor call in progress"); /* Get FeatureMapQuality */ FeatureMapQuality quality = arAnchorManager.EstimateFeatureMapQualityForHosting(GetCameraPose()); Debug.Log(string.Format("Feature Map Quality: {0}", quality)); if (quality != FeatureMapQuality.Insufficient) { /* Start the hosting process */ HostCloudAnchorPromise cloudAnchor = arAnchorManager.HostCloudAnchorAsync(pendingHostAnchor, 365); /* Wait for the promise to solve */ StartCoroutine(WaitHostingResult(cloudAnchor)); } } private IEnumerator WaitHostingResult(HostCloudAnchorPromise hostingPromise) { /* Wait for the promise. Save the id if the hosting succeeded */ yield return hostingPromise; if (hostingPromise.State == PromiseState.Cancelled) { yield break; } var result = hostingPromise.Result; if (result.CloudAnchorState == CloudAnchorState.Success) { anchorIdToResolve = result.CloudAnchorId; Debug.Log("Anchor hosted successfully!"); } else { Debug.Log(string.Format("Error in hosting the anchor: {0}", result.CloudAnchorState)); } }
Când un alt utilizator aflat în același mediu îndreaptă camera telefonului către zona unde a fost salvată ancora cloud, serviciul ARCore Cloud Anchor compară periodic caracteristicile vizuale din scenă cu harta de caracteristici 3D care a fost creată anterior. ARCore folosește aceste comparații pentru a determina poziția și orientarea utilizatorului relative la ancora cloud.
cloudAnchor = arAnchorManager.ResolveCloudAnchorId(anchorIdToResolve);
Pentru a putea folosi ancore cloud este nevoie de o formă de autentificare. În cazul Android, ARCore Extensions oferă suport pentru Keyless și API Key pentru autentificare. Pentru iOS, ARCore Extensions oferă suport pentru Authentication token și API Key. Autentificarea trebuie activată manual în Edit → Project Settings → XR Plug-in Management → ARCore Extensions.
Înainte de a putea utiliza ancore cloud în aplicațiile noastre, trebuie mai întâi să activăm API-ul ARCore Cloud Anchor într-un proiect nou sau deja existent de pe Google Cloud Platform. Activarea API-ului se face aici.
Odată făcut acest pas, în funcție de metoda de autentificare folosită, trebuie să setăm una din următoarele (prin apăsarea butonului Create Credentials):
.\keytool -alias <numele aliasului setat anterior> -keystore <calea către fișierul creat de Unity>\user.keystore -list -v
În consolă vom avea SHA-1 certificate fingerprint.
Opțiunea de autentificare keyless este disponibilă pentru dispozitivele Android. Aceasta permite salvarea unei ancore cloud pentru maxim 365 de zile.
Pași pentru setarea acestui mod de autentificare:
Opțiunea de autentificare pe bază de token este disponibilă pentru dispozitivele iOS. Aceasta permite salvarea unei ancore cloud pentru maxim 365 de zile. Pentru setare, urmați pașii de aici.
Autentificarea pe bază de cheie API este disponibilă atât pe dispozitive iOS, cât și pe dispozitive Android. Aceasta permite salvarea unei ancore pentru o singură zi.
Pași pentru configurare:
FeatureMapQuality indică gradul de calitate al punctelor caracteristice detectate de ARCore de la o anumită poziție. Ancorele cloud care sunt salvate folosind puncte caracteristice de o calitate înaltă vor avea în general rezultate cât mai bune. Dacă gradul de calitate al hărții de puncte caracteristice nu poate fi estimat pentru o anumită poziție și orientare, atunci EstimateFeatureMapQualityForHosting loghează un mesaj de avertizare și are rezultatul FeatureMapQuality.Insufficient. Acest rezultat indică faptul că ARCore va avea cel mai probabil dificultăți în rezolvarea ancorei cloud. Deci, pentru rezultate optime, trebuie să ne asigurăm că FeatureMapQuality indică un rezultat suficient de bun.
FeatureMapQuality quality = arAnchorManager.EstimateFeatureMapQualityForHosting(GetCameraPose());
Vom folosi scena Cloud Anchors din scheletul de laborator. Acesta poate fi descărcat de aici. Scripturile necesare pentru rezolvarea laboratorului se află în Assets→Scripts: ARCloudAnchorManager.cs și CloudAnchorObjectPlacement.cs.
Inițial în scenă aveți 3 butoane:
Pentru testare, ancora cloud va fi mereu atașată pe un cub. Deci, când apăsați butonul Resolve pe ecran ar trebui să vă apară cubul la poziția la care l-ați pus inițial.
Workflow-ul aplicației este următorul: