This shows you the differences between two versions of the page.
irva:laboratoare:09 [2021/11/06 12:57] 127.0.0.1 external edit |
irva:laboratoare:09 [2024/01/09 11:33] (current) andrei.lapusteanu |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 09. ===== | + | ===== Laboratorul 09. Meta Quest | Interacțiuni ===== |
+ | |||
+ | ==== Date de intrare ==== | ||
+ | |||
+ | Headset-urile pe care le folosim se bazează pe **Interaction SDK**, care se ocupă de procesarea fluxului de date oferit de către hardware – în esență, datele de interes care pot fi folosite în aplicații sunt poziția și rotația atât a headset-ului cât și a controller-elor sau mâinilor. În implementări mai recente, există funcționalități ce permit și realizarea body și face tracking-ului (face tracking doar pe Meta Pro). | ||
+ | |||
+ | {{ :irva:laboratoare:mq2_l9_inputdata.png?350 |}} | ||
+ | |||
+ | Aceste data de intrare sunt procesate de către **Interaction SDK**. De exemply, pentru hand tracking, datele de intrare sunt trecute printr-un filtru (pentru a minimiza jitter-ul), se creează o mână “sintetică” ce constrânge poziția/rotația mâinii (de exemplu, pentru a nu trece prin anumite obiecte) iar în final se creează reprezentarea vizuală. | ||
+ | |||
+ | Aceste interacțiuni se bazează pe comunicarea dintre un **interactor** și un **interactibil**. Putem defini această “comunicare” ca și o **interacțiune**, așadar lanțul de elemente de interes devine: | ||
+ | |||
+ | <note tip>**Interactor <-> Interaction <-> Interactable**</note> | ||
+ | |||
+ | LINK DETALII AICI | ||
+ | |||
+ | ==== Interactor & interacțiuni ==== | ||
+ | |||
+ | **Interactorul** reprezintă o componentă atașată de controller-e sau de mâini ce are rolul de a iniția acțiuni. Orice interacor implementează interfața **IInteractor**, care dictază acțiunile posibile. Un **interactor** poate schimba evenimente cu alți **interactibili** (detalii în următoarea secțiune). | ||
+ | |||
+ | Un interactor există pentru a defini interacțiuni, care sunt de mai multe tipuri: | ||
+ | * **Grab** și **distance grab**, pentru a ‘prinde’ și deplasa obiecte prin scenă | ||
+ | * **Poke**, pentru interacțiuni de atingere, cum ar fi apăsarea unui buton | ||
+ | * **Ray**, pentru interacțini la distanță bazate pe raze | ||
+ | * **Locomotion**, ce permite deplasarea printr-o scenă | ||
+ | |||
+ | Fiecare dintre aceste interacțiuni se poate implementa (în forma de bază) folosind prefab-uri și configurarea în inspector. | ||
+ | |||
+ | <note tip>Puteți studia mai în detaliu aceste interacțiuni plecând de la [[https://developer.oculus.com/documentation/unity/unity-isdk-interaction-model-overview/|acest link]]</note> | ||
+ | |||
+ | ==== Interactibil ==== | ||
+ | |||
+ | Reprezintă o componentă care răspunde la evenimentele unui **interactor**. **Interactibilul** poată să răspunde unei **interacțiuni** specifice. Orice **interactibil** implementează interfața **IInteractable**, care dictază acțiunile posibile. | ||
+ | |||
+ | De exemplu, un **interactibil** de tip poke nu va răspunde (**interacționa**) cu un **interactor** de tip grab. | ||
+ | |||
+ | {{ :irva:laboratoare:mq2_l9_waiting.jpg?350 |}} | ||
+ | |||
+ | Este important de știut că elementele **interactibile** se pot regăsi intr-una din 4 stări posibile: | ||
+ | * **Disabled** (inactiv) | ||
+ | * **Normal** | ||
+ | * **Hover** (apropiere) | ||
+ | * **Select** (intracțiune) | ||
+ | |||
+ | În următorul GIF puteți observa **interactibilul** în stările **Normal**, **Hover** și **Select**. | ||
+ | |||
+ | {{ :irva:laboratoare:l9_mq2_states.gif?300 |}} | ||
+ | |||
+ | Pentru realizarea acestor **interacțiuni** este necesară configurarea ambelor părți. De exemplu, pentru o **interacțiune** de tip **Poke** folosing hand tracking-ul, obiectele de tip mână din ierarhie for avea atașate obiecte de tip **HandPokeInteractor**, iar elementele **interactibile** vor avea atașate o componentă de tip **PokeInteractible** (care poate răspunde atât la poke-uri de la controller cât și de la mâini). | ||
+ | |||
+ | ==== Sumar interacțiuni ==== | ||
+ | |||
+ | Un flow simplificat al **Interaction SDK**-ului poate fi următorul: | ||
+ | * Se preia input-ului iar în urma procesării și filtrării se randează controller-ele/mâinile | ||
+ | * Controller-ele/mâinile sunt **interactori** care așteaptă/ascultă **interacțiunea** cu elemente **interactibile** | ||
+ | * Dacă **interactorul** este în proximitatea unui **interactibil**, iar cele 2 elemente implementează o **interacțiune** comună (poke, grab), are loc evenimentul de **hover** | ||
+ | * **Interacțiunea** efectivă are loc atunci când **interactibilul** este selectat de către **interactor** | ||
+ | |||
+ | ==== Basic setup | Headset, controllers, hands ==== | ||
+ | |||
+ | Vom realiza în continuare cnfigurarea de bază prin care putem plasa în scenă un headset, precum și controller-e și mâini virtuale. Puteți urmări în detaliu pașii la [[https://developer.oculus.com/documentation/unity/unity-isdk-getting-started/|acest link]], vom prezenta succint pașii și în continuare. | ||
+ | |||
+ | * Deschideți scena **Assets -> L9_MetaQuest -> Scenes -> L9_MQ2_BasicSetup** | ||
+ | * Adăugați în scenă pregab-ul **OVRCameraRig**. Acesta este prefab-ul de bază ce permite tracking-ul atât al headset-ului cât și al interactorilor | ||
+ | * Studiați setările din inspector. Asigurați-vă că tipul de input (**Hand Tracking Support**) este **Controllers and Hands**, iar **Hand Tracking Version** este **V2** | ||
+ | * Atașați prefab-ul **OVRInteraction** ca și copil la **OVRCameraRig**. Acest prefab este cel de bază pentru controller-e sau mâini | ||
+ | * **Setup controlller-e**: Adăgați prefab-ul **OVRControllers** ca și copil la **OVRInteraction**. Acesta se ocupă de inteacțiunile posibile precum și partea vizuală a controller-elor | ||
+ | * **Realizați un build sau testați in-editor folosing Quest Link**. Ar trebui să apară controller-ele în scenă (și să fie tracked) | ||
+ | * Setup hand tracking: Urmați pașii descriși [[https://developer.oculus.com/documentation/unity/unity-isdk-getting-started/|aici]] în secțiunea **Set Up Hands** | ||
+ | * ⚠️ **Atenție**, mâinile vor avea atașate niște physics capsules necesare interacțiunilor, dar implementarea din documentație este (încă) broken, așadar **nu faceți pasul 6** | ||
+ | * Realizați, de asemenea, pașii descriși în subsecțiunea **Add OVRHands Prefab** – atașați prefab-ul **OVRHands** ca și copil la **OVRInteraction** | ||
+ | * Pentru a repara problema cu physics capsules, navigați întâi în ierarhie la **OVRCameraRig -> OVRInteraction -> OVRInteraction**. Atât pe **LeftHand** cât și pe **RightHand** atașați script-ul **HandPhysicsCapsule** și asignați în inspector field-urile necesare (primele 3) | ||
+ | * **Realizați un build sau testați in-editor folosing Quest Link**. Ar trebui să funcționeze atât controller-ele cât și hand tracking-ul și să puteți face switch între cele 2 la run-time | ||
+ | |||
+ | {{ :irva:laboratoare:mq2_l9_handsetup.png?300 |}} | ||
+ | |||
+ | ==== Task-uri ==== | ||
+ | |||
+ | - Implementați setup-ul descris în capitorul “**Basic setup | Headset, controllers, hands**”, pentru a implementa tracking-ul headset-ului, precum și suport pentru controller-e și hand tracking | ||
+ | - Implementați o interacțiune de tip **Grab**. Întrucât pașii descriși în documentație sunt suficient de detaliați, urmăriți modelul prezentat la [[https://developer.oculus.com/documentation/unity/unity-isdk-create-hand-grab-interactions/|acest link]]. Puteți lucra în scena curentă | ||
+ | - **Bonus**: Fiți creativi și implementați un alt tip de interacțiune (altceva decât grab) – plecați tot de la exemplele din documentație. De exemplu, un buton care aprinde/stinge o lumina, sau realizați un obiect pe care îl puteți arunca – sau orice alt exemplu relevant care vă ajută să înțelegi mai bine modul de funcționare interactor <-> interacțiune | ||