ARCore este un SDK de realitate augmentată dezvoltat de Google. Este o tehnologie relativ recent apărută pe piață, fiind pentru prima dată publicată pe 1 martie 2018. ARCore este folosit pentru a crea aplicații de realitate augmentată atât pentru Android, cât și pentru iOS. Are suport pentru multiple platforme de development pentru telefon, precum Unity, Unreal, Android Studio, Xcode.
ARCore funcționează pe baza a trei principii:
AR Foundation este un API pentru multiple platforme din Unity. AR Foundation NU implementează niciun feature AR. Pentru a putea folosi AR Foundation, este nevoie să importăm în proiect și pachetele necesare pentru platforma pentru care dezvoltăm aplicația (ARKit pentru iOS, ARCore pentru Android).
Pentru a crea un proiect nou cu suport pentru AR Foundation, urmăriți pașii de aici. AR Foundation vine cu o serie de feature-uri mai puține decât ARCore. Pentru a putea avea acces la toate feature-urile ARCore (cum ar fi ancorele cloud), este necesar să importăm și o serie de extensii pentru AR Foundation. Urmați pașii de aici.
Din moment ce ARCore extensions for AR Foundation instalează automat și Apple ARKit XR Plugin, dacă nu aveți și suportul de iOS instalat o să primți eroarea de mai jos în consolă. Cu toate acestea, nu este o problemă blocantă și o putem ignora din moment ce nu facem build-uri pentru iOS.
Orice proiect AR Foundation, are o serie de componente de bază. Fără aceste componente, proiectul nu este funcțional. Acestea sunt:
Pentru a adăuga obiecte în scenă folosind inputul utilizatorului, va trebui să verificăm la fiecare frame dacă utilizatorul a apăsat pe ecran. Funcția Frame.Raycast() implementează un raycast în funcție de poziția de pe ecran apăsată de utilizator pentru a detecta dacă utilizatorul a apăsat pe un plan sau pe un feature point detectat în imagine.
if (m_RaycastManager.Raycast(touchPosition, s_Hits, TrackableType.PlaneWithinPolygon)) { // Raycast hits are sorted by distance, so the first one will be the closest hit. var hitPose = s_Hits[0].pose; // Instantiate prefab at the hit pose. var gameObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation); // Compensate for the hitPose rotation facing away from the raycast (i.e. // camera). gameObject.transform.Rotate(0, _prefabRotation, 0, Space.self); // Attach an anchor to allow AR Foundation to track the hitpoint as understanding of // the physical world evolves. gameObject.AddComponent<ARAnchor>(); }
Dacă în urma raycast-ului, utilizatorul a nimerit un plan sau un feature point, atunci un obiect 3D este instanțiat la poziția TrackableHit pe care a nimerit-o utilizatorul.
var gameObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);
Poziția punctului nimerit este folosit pentru a crea o ancoră. Ancora este un obiect specific ARCore care menține obiectul fix la o anumită poziție relativ cu lumea reală. Pe măsură ce ARCore învață mediul înconjurător, ARCore își poate schimba sistemul de coordonate global. Automat, un obiect fără o ancoră atașată și-ar schimba poziția în funcție de noul sistem de coordonate global. Cu ajutorul unei ancore, obiectul rămâne însă relativ fix în lumea reală, nu în sistemul ARCore. Când nu mai avem nevoie de o ancoră (sunt foarte costisitoare din punct de vedere al timpului de execuție), o putem distruge, folosind funcția Destroy.
gameObject.AddComponent<ARAnchor>();
Dacă dorim să poziționăm anumite elemente de interfață grafică să urmărească anumite obiecte (deci să nu fie fixe într-o anumită zonă a ecranului, ci să urmărească un anumit obiect) putem folosi funcția WorldToScreenPoint, care primește ca parametru poziția din spațiul global pe care dorim să îl urmărim. Folosind această funcție, poziția este convertită la spațiul camerei.
Camera.main.WorldToScreenPoint(new Vector3(0, 0, 0));
Vom folosi scena Measure Distances din scheletul de laborator. Acesta poate fi descărcat de aici. Scriptul necesar pentru rezolvarea laboratorului se află în Assets→Scripts: MeasureDistances.cs.
Rezultat final: