This is an old revision of the document!


Laborator AR 02. Adăugarea de Obiecte Augmentate

Plasarea de Obiecte în Scenă. Ancore

Raycast

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.

Funcția Physics.Raycast este în general folosită atunci când avem nevoie de un raycast în aplicațiile Unity. Cu toate acestea, în cazul realității augmentate trebuie să facem un raycast în lumea reală, folosind camera telefonului. În acest sens, AR Foundation/ARCore oferă funcția Frame.Raycast().

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);

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.

gameObject.AddComponent<ARAnchor>();

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.

Camera.main.WorldToScreenPoint(new Vector3(0, 0, 0));

Tasks

Î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 aici. Scriptul necesar pentru rezolvarea laboratorului se află în Assets→Scripts: MeasureDistances.cs.

Importați ultima versiune a pachetului IRVA_L2_AR care se găsește în folder-ul UnityPackages din folderul root al proiectului.

  1. Afișați o linie care să lege ultimele două puncte adăugate pe ecran.
  2. Afișați pe ecran distanța dintre ultimele două puncte adăugate în dreptul liniei adăugate.
  3. Afișați pe ecran distanța totală măsurată.
  4. Bonus: Adăugați posibilitatea de a reselecta un cub adăugat anterior pe ecran. Odată ce cubul este selectat, îl veți putea muta la altă poziție, iar distanțele vor fi recalculate.

Vă puteți folosi de acest tutorial pentru bonus.

Rezultat final:

irva/laboratoarear/02.1759163731.txt.gz · Last modified: 2025/09/29 19:35 by maria_anca.balutoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0