This shows you the differences between two versions of the page.
irva:laboratoarear:02 [2024/10/09 16:13] maria_anca.balutoiu [Setup ARCore. Setup AR Foundation] |
irva:laboratoarear:02 [2025/09/29 23:17] (current) maria_anca.balutoiu [Tasks] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laborator AR 02. AR Foundation. Measuring Distances App ===== | + | ===== Laborator AR 02. Adăugarea de Obiecte Augmentate ===== |
- | ===== ARCore. AR Foundation ===== | + | |
- | 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: | + | ==== Plasarea de Obiecte în Scenă. Ancore ==== |
- | * Motion tracking (poziția telefonului este constant calculată relativ la spațiul lume) | + | === Raycast === |
- | * Înțelegerea mediului înconjurător (dimensiunea și poziția aproximativ tuturor tipurilor de suprafețe este constant detectată) | + | |
- | * Light estimation (condițiile de iluminare sunt calculate constant) | + | |
- | + | ||
- | <note important>În [[https://developers.google.com/ar/develop|documentația ARCore]], ultimele versiuni de ARCore în combinație cu Unity sunt marcate ca fiind **deprecated**. În schimb, tot în documentație se recomandă utilizarea **AR Foundation**.</note> | + | |
- | + | ||
- | 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). | + | |
- | + | ||
- | ===== Setup ARCore. Setup AR Foundation ===== | + | |
- | Pentru a crea un proiect nou cu suport pentru AR Foundation, urmăriți pașii de [[https://developers.google.com/ar/develop/unity-arf/getting-started-ar-foundation|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 [[https://developers.google.com/ar/develop/unity-arf/getting-started-extensions|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. | + | |
- | + | ||
- | {{ :irva:error.png?900 |}} | + | |
- | + | ||
- | + | ||
- | ===== Structura unui Proiect ARCore/AR Foundation ===== | + | |
- | Orice proiect AR Foundation, are o serie de componente de bază. Fără aceste componente, proiectul nu este funcțional. Acestea sunt: | + | |
- | * **AR Session** controlează ciclul de viață al aplicației AR | + | |
- | * **XR Origin** (începând cu AR Foundation 5.0) / **AR Session Origin** (orice altă versiune AR Foundation) transformă poziția, scalarea și orientarea feature-urilor trackable (precum suprafețe planare și puncte caracteristice) în sistemul de coordonate Unity. | + | |
- | <note tip> | + | |
- | O sesiune se referă la o instanță AR. În timp ce alte componente precum detecția de plane pot fi activate/dezactivate în mod independent, sesiunea controlează ciclul de viață al întregii aplicații AR, deci controlează toate componentele. Când dezactivăm componenta AR Session, sistemul nu mai urmărește caracteristicile din mediul înconjurător. Apoi, dacă reactivăm ulterior componenta, sistemul încearcă să recupereze și să păstreze caracteristicile detectate anterior. | + | |
- | </note> | + | |
- | + | ||
- | <note tip> | + | |
- | Componenta XR Origin transformă obiectele trackable dintr-un "spațiu al sesiunii" al dispozitivului AR (un spațiu nescalat relativ momentului începerii sesiunii AR) în world space-ul Unity. De exemplu, coordonatele (0, 0, 0) din spațiul sesiune se referă la poziția la care a fost creată sesiunea AR și corespunde poziției componentei XR Origin în world space. Acest concept este similar diferenței dintre local space și world space. | + | |
- | </note> | + | |
- | + | ||
- | * **AR Plane Manager** crează câte un GameObject pentru fiecare plan detectat în mediul înconjurător. Un plan este o suprafață plată reprezentată printr-o poziție, orientare, dimensiuni și puncte limită. Planele pot fi adăugate, modificate și șterse de la un frame la altul. Un plan își mărește dimensiunea în timp pe măsură ce dispozitivul AR descoperă mai multe din mediul înconjurător. | + | |
- | + | ||
- | <note tip> | + | |
- | Pentru a vizualiza plane este nevoie să folosim componenta **AR Default Plane**, pe care să o transformăm în prefab. | + | |
- | </note> | + | |
- | + | ||
- | * **AR Point Cloud Manager** crează câte un GameObject pentru fiecare punct caracteristic detectat în mediul înconjurător. Un punct caracteristic este o zonă din lumea reală, în care se fac treceri bruște de culoare (de exemeplu, colțul unei mese). | + | |
- | + | ||
- | <note tip> | + | |
- | Pentru a vizualiza puncte caracteristice este nevoie să folosim componenta **AR Default Point CLoud**, pe care să o transformăm în prefab. | + | |
- | </note> | + | |
- | ===== Plasarea de Obiecte în Scenă. Ancore ===== | + | |
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. | 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. | ||
Line 73: | Line 32: | ||
</code> | </code> | ||
+ | === Ancore === | ||
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**. | 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**. | ||
Line 79: | Line 39: | ||
</code> | </code> | ||
- | ===== WorldToScreenPoint ===== | + | === WorldToScreenPoint === |
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. | 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. | ||
Line 88: | Line 48: | ||
- | ===== Tasks ===== | + | ==== Tasks ==== |
<note tip> În acest laborator, vom lucra la o aplicație care măsoară distanțe, folosind camera telefonului mobil. Utilizatorul va putea adăuga puncte apăsând pe ecran. Aplicația va calcula distanța dintre ultimele două puncte adăugate, și o va afișa pe ecran în dreptul celor două puncte. Acest text va rămâne la aceiași poziție în spațiul lume. În același timp, în spațiul camerei se va afișa și distanța totală dintre toate punctele adăugate pe ecran. | <note tip> În acest laborator, vom lucra la o aplicație care măsoară distanțe, folosind camera telefonului mobil. Utilizatorul va putea adăuga puncte apăsând pe ecran. Aplicația va calcula distanța dintre ultimele două puncte adăugate, și o va afișa pe ecran în dreptul celor două puncte. Acest text va rămâne la aceiași poziție în spațiul lume. În același timp, în spațiul camerei se va afișa și distanța totală dintre toate punctele adăugate pe ecran. | ||
- | Vom folosi scena **Measure Distances** din scheletul de laborator. Acesta poate fi descărcat de [[https://github.com/Maria-Anca-Balutoiu/IRVA_AR|aici]]. Scriptul necesar pentru rezolvarea laboratorului se află în **Assets->Scripts**: **MeasureDistances.cs**.</note> | + | Vom folosi scena **L2_MeasureDistances** din scheletul de laborator. Acesta poate fi descărcat de [[https://github.com/UPB-Graphics/IRVA|aici]]. Scriptul necesar pentru rezolvarea laboratorului se află în **Assets->Scripts**: **MeasureDistances.cs**.</note> |
+ | |||
+ | <note important>Importați ultima versiune a pachetului ''IRVA_L2_AR'' care se găsește în folder-ul **UnityPackages** din folderul root al proiectului.</note> | ||
- Afișați o linie care să lege ultimele două puncte adăugate pe ecran. | - Afișați o linie care să lege ultimele două puncte adăugate pe ecran. |