This is an old revision of the document!
Dispozitivele dezvoltate de către Meta (în trecut, cunoscute ca și Oculus) sunt soluții `all-in-one` ce permit dezvoltarea aplicațiilor de realitate virtuală și oferă suport pentru cele mai recente funcționalități din acest domeniu, precum hand tracking, realitate mixtă (MR), audio spațializat, eye și body tracking.
În mod curent, în seria Quest, regăsim 4 astfel de dispozitive ce oferă suport activ pentru dezvoltarea aplicațiilor VR, anume:
Pentru dezvoltarea aplicațiilor de VR, există suport pentru OpenXR (aplicații native), sau SDK-uri ce oferă integrare cu game engine-urile standard, precum Unity și Unreal Engine.
Integrarea SDK-ului vine cu suport pentru diverse feature-uri pe care le putem utiliza, în funcție de necesitățile aplicației pe care dorim s-o dezvoltăm:
În imaginea de mai jos puteți studia un flow generalizat al dezvoltării aplicațiilor de VR folosind dispozitivele celor de la Meta.
Aplicația vă oferă setări adiționale pentru un dispozitiv Quest conectat la calculator. Folosind MQDH puteți să:
IRVA_ProjectSetup_XRPluginProviderController, care se găsește în folder-ul UnityPackages din folder-ul root al proiectului, după care restartați Unity.
Începând cu versiunea 59, pachetul de integrare se folosește de UPM (Unity Package Manager), oferind astfel o modalitate mai ușoară de integrare, realizarea rapidă a upgrade-urilor, iar probabil cel mai important, un management ușor în alegerea pachetelor esențiale de folosit (Core, Integration, Audio, etc.). Versiunea up-to-date la momentul redactării acestui text este 81.0.0.
Din File → Build Profiles vă recomandăm să vă creați un nou profil de build derivat din platforma Meta Quest.
O să primiți un prompt pentru instalarea backend-ului OpenXR, acceptați-l.
com.unity.xr.oculus.
În Unity Editor ar trebui să vă apară un nou buton Meta VR Tools (în stânga-sus, sub toolbar).
De aici puteți deschide Project Setup Tool, care vă permite să vă configurați proiectul de Unity pentru a fi compatibil cu cerințele SDK-ului.
Puteți realiza build-uri în cel mai simplu mod folosiți opțiunea de Build And Run din meniul profilului de build selectat (Meta Quest). La finalul build-ului, aplicația este instalată pe headset și pornită în mod automat. Aplicația se poate apoi regăsi în submeniul Unknown Sources.
Pentru alte variante de build, în urma creării APK-ului din Unity (așadar Build simplu, nu Build And Run), se pot folosi Meta Quest Developer Hub sau SideQuest pentru instalarea acestor aplicații pe headset (proces cunsocut ca și sideloading).
IRVA_L4_VR_MetaXR_Skeleton care se găsește în folder-ul UnityPackages din folder-ul root al proiectuluiVeți învăța în continuare cum se pot integra diverse componente ale SDK-ului aplicația voastră: headset-ul virtual, controller-ele, hand tracking-ul, funcționalitatea de passthrough, etc.
SDK-ul a introdus recent o nouă modalitate de setup a acestor elemente printr-un meniu de Building Blocks.
În trecut, componentele player-ului trebuiau alcătuite din building block-uri separate. De exemplu, dacă doream un player care să poată folosi atât controllerele cât și mâinile pentru a interacționa cu un obiect trebuiau inserate:
Fiecare dintre acestea adăuga câte o componentă și făcea setup în mod automat în ierarhie. Spre exemplu:
În noile versiuni ale SDK-ului a fost introdus un building block numit Interactions Rig care este util întrucât unifică toate componentele menționate mai sus, nefiind necesar setup-ul individual. Introduceți-l pe acesta în scenă via drag-and-drop.
Selectați obiectul [BuildingBlock] Camera Rig. În cadrul acestui laborator nu va trebui să-l modificați dar rețineți că acesta conține configurări esențiale atunci când o să lucrați la proiectele voastre.
Nagivagați în inspector la script-ul OVRManager. Acesta conține numeroase setări ce țin de sesiunea VR, precum:
Este locul central în care se poate configura sesiunea VR în cadrul acestui SDK.
Obiectele OVRHands și OVRControllers conțin atașate script-uri ce implementază structurile de date ce reprezintă în esență controllerele sau mâinile virtuale și pot fi utilizate pentru a citi date legate de input.
Obiectele OVRLeftHandVisual, OVRRightHandVisual, OVRLeftControllerVisual și OVRRightControllerVisual oferă logica și asset-urile pentru reprezentarea vizuală a mâinilor, respectiv controllerelor.
Ce este esențial de reținut este că orice interacțiune necesită pe de-o parte un interactor, de exemplu, un HandGrabInteractor (vedeți în ierarhie [BuildingBlock] OVRInteractionComprehensive → LeftInteractions → Hand and No Controller → HandGrabInteractor) care poate interacționa doar cu un obiect care are atașat un script de tip interactibil, în cazul acesta, un HandGrabInteractable
Rețineți, de asemenea, că interactorul poate interacționa cu un interactibil de același tip - de exemplu, un interactor de tip Poke nu poate comunica cu un interactibil de tip Distance Grab.
Atenție la faptul că se face distincție între interactori/interactibile compatibili pentru controller sau mâini. De exemplu:
Același principiu se aplică și pentru interactibili.
Adăugați în scenă building block-ul Grab Interaction.
Uitați vă în inspector la obiectul [BuildingBlock] Cube → [BuildingBlock] HandGrabInstallationRoutine. Observați că există preconfigurate script-urile necesare de tip interactibil:
Rețineți existența acestora în cazul în care aveți nevoie de interacțiuni de tip grab pe obiecte custom.
În cadrul task-urilor din laborator veți avea de completat implementarea unei arme pe care o veți folosi pentru a trage în niște obiecte (sticle) regăsite în scena suport.
Funcționarea armei este descrisă în mod modular printr-o serie de script-uri, unele dintre acestea le veți avea de completat:
Pentru a realiza acest feature, va trebui în esență să detectați schimarea de stare a interactibilului atașat de armă. Rețineți că HandGrabInteractable a fost adăugat atunci când ați creat pose-ul custom.
Adăugați pentru script-ul GunHandGrabController elementele lipsă din inspector.
În script-ul GunHandGrabController va trebui să interogați starea variabilei handGrabInteractable - Pentru a realiza acest lucru, abonați-vă evenimentului numit WhenStateChanged de pe handGrabInteractable.
În event handler-ul creat, va trebui să vă folosiți de proprietățile NewState și PreviousState ale argumentului InteractableStateChangeArgs pentru a testa starea de grab / release.
// Object has been grabbed. if (state.NewState == InteractableState.Select) { ... }
// Object has been released. if (state.PreviousState == InteractableState.Select && state.NewState != InteractableState.Select) { ... }
Pentru a accesa interactorul care a declanșat interacțiunea și în esență obiectul tip IHand aferent, puteți interoga structura SelectingInteractors, care descrie intractorii care interacționează în mod curent cu interactibilul (arma) astfel:
var handInteractor = handGrabInteractable.SelectingInteractors.FirstOrDefault();
Pentru a extrage componenta tip IHand:
var hand = handInteractor.Hand;
Urmăriți comentariile din script pentru a finaliza acest task.
TODO