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).
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:
Interactor ↔ Interaction ↔ Interactable
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.
Puteți studia mai în detaliu aceste interacțiuni plecând de la
acest link
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.
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.
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 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
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
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
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