Differences

This shows you the differences between two versions of the page.

Link to this comparison view

irva:laboratoare:09 [2022/10/21 14:04]
maria_anca.balutoiu
irva:laboratoare:09 [2024/01/09 11:33] (current)
andrei.lapusteanu
Line 1: Line 1:
-===== Laboratorul 09. Oculus ​Quest 2 =====+===== 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 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 
 + 
 + 
irva/laboratoare/09.1666350273.txt.gz · Last modified: 2022/10/21 14:04 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