This shows you the differences between two versions of the page.
|
irva:laboratoarevr:04 [2025/11/10 15:14] andrei.lapusteanu |
irva:laboratoarevr:04 [2025/11/11 18:18] (current) andrei.lapusteanu |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | |||
| ====== Laborator VR 04. Meta XR. Setup și interacțiuni de bază ====== | ====== Laborator VR 04. Meta XR. Setup și interacțiuni de bază ====== | ||
| Line 83: | Line 82: | ||
| * Descărcați și importați în proiectul de Unity: | * Descărcați și importați în proiectul de Unity: | ||
| - | * [[https://assetstore.unity.com/packages/tools/integration/meta-xr-core-sdk-269169|Meta XR Core SDK]] | + | * [[https://assetstore.unity.com/packages/tools/integration/meta-xr-interaction-sdk-265014|Meta XR Interaction SDK]]. Acesta va instala ca dependințe: |
| - | * [[https://assetstore.unity.com/packages/tools/integration/meta-xr-interaction-sdk-essentials-264559|Meta XR Interaction SDK Essentials]] | + | * [[https://assetstore.unity.com/packages/tools/integration/meta-xr-core-sdk-269169|Meta XR Core SDK]] |
| - | * [[https://assetstore.unity.com/packages/tools/integration/meta-xr-interaction-sdk-265014|Meta XR Interaction SDK]] | + | * [[https://assetstore.unity.com/packages/tools/integration/meta-xr-interaction-sdk-essentials-264559|Meta XR Interaction SDK Essentials]] |
| - | * Importați //Example Scenes// din sample-urile pachetului | + | * Importați //Example Scenes// din sample-urile pachetului **Meta XR Interaction SDK** |
| * Aveți linked pașii oficiali pentru [[https://developer.oculus.com/documentation/unity/unity-package-manager/|importul pachetelor]] și modalități de [[https://developer.oculus.com/documentation/unity/unity-xr-plugin/|update ]]a acestora | * Aveți linked pașii oficiali pentru [[https://developer.oculus.com/documentation/unity/unity-package-manager/|importul pachetelor]] și modalități de [[https://developer.oculus.com/documentation/unity/unity-xr-plugin/|update ]]a acestora | ||
| * Acceptați prompt-urile care vă apar, restart la editor dacă este necesar | * Acceptați prompt-urile care vă apar, restart la editor dacă este necesar | ||
| Line 111: | Line 110: | ||
| <note> | <note> | ||
| OpenXR reprezintă backend-ul necesar pentru a dezvolta și face build-uri folosind Meta XR. | OpenXR reprezintă backend-ul necesar pentru a dezvolta și face build-uri folosind Meta XR. | ||
| - | Se poate instala, în mod alternativ, din **Package Manager**, apăsați pe (+), selecați **Add package from git URL**, introduceți ''com.unity.xr.oculus''. | + | Se poate instala, în mod alternativ, din **Package Manager**, apăsați pe (+), selecați **Add package from git URL**, introduceți ''com.unity.xr.openxr''. |
| </note> | </note> | ||
| Line 152: | Line 151: | ||
| <note> Aveți [[https://developer.oculus.com/documentation/unity/ts-odh-deploy-build/|aici]] un ghid pentru folosirea MQDH. | <note> Aveți [[https://developer.oculus.com/documentation/unity/ts-odh-deploy-build/|aici]] un ghid pentru folosirea MQDH. | ||
| + | </note> | ||
| + | |||
| + | <note warning> | ||
| + | Dacă întâmpinați erori de compilare la build, cel mai probabil sunt datorită script-ului ''GravityGunController'' din laboratorul 3. Pe scurt, build-ul din laboratorul curent încearcă să compileze acest script, care conține componente specifice SteamVR, iar cum SteamVR nu este inclus în build, acele componente nu sunt găsite. | ||
| + | |||
| + | Unity package-ul pentru L3 a fost actualizat pentru a rezolva această problemă, **dar pentru a rezolva pe loc eroarea** cuprindeți întreg script-ul ''GravityGunController'' într-o directivă de preprocesare corespunzătoare build-urilor Standalone, astfel: | ||
| + | |||
| + | <code c#> | ||
| + | #if UNITY_STANDALONE | ||
| + | |||
| + | // ... script GravityGunController ... | ||
| + | |||
| + | #endif | ||
| + | </code> | ||
| </note> | </note> | ||
| Line 159: | Line 172: | ||
| * Importați ultima versiune a pachetului ''IRVA_L4_VR_MetaXR_Skeleton'' care se găsește în folder-ul **UnityPackages** din folder-ul root al proiectului | * Importați ultima versiune a pachetului ''IRVA_L4_VR_MetaXR_Skeleton'' care se găsește în folder-ul **UnityPackages** din folder-ul root al proiectului | ||
| + | * Deschideți scena din schelet - veți lucra pentru următoarele task-uri în aceasta | ||
| ==== Building Blocks ===== | ==== Building Blocks ===== | ||
| Line 294: | Line 308: | ||
| {{ :irva:laboratoarevr:irva_2025_vr_l4_hand_pose_samples_2.gif?400 |}} | {{ :irva:laboratoarevr:irva_2025_vr_l4_hand_pose_samples_2.gif?400 |}} | ||
| - | Acest feature oferă un grad sporit de imersivitate, întrucât dezvoltatorii se pot asigura de faptul că interacțiunea mână-obiect virtual este deserată fără probleme cum ar fi clipping-ul. | + | Acest feature oferă un grad sporit de imersivitate, întrucât dezvoltatorii se pot asigura de faptul că interacțiunea mână-obiect virtual este desenată fără probleme cum ar fi clipping-ul. |
| <note tip> | <note tip> | ||
| Line 430: | Line 444: | ||
| Afișați în consolă valoarea pe care o obțineți. În continuare va trebui să setați valorile min și max (din inspector) pentru ''usableFingerCurlRange'' folosind **valoarea afișată în consolă**: | Afișați în consolă valoarea pe care o obțineți. În continuare va trebui să setați valorile min și max (din inspector) pentru ''usableFingerCurlRange'' folosind **valoarea afișată în consolă**: | ||
| * Rulați scena, luați arma în mână | * Rulați scena, luați arma în mână | ||
| - | * Îndoiți degetul arătător suficient cât **doar să atingă** trăgaciul armei - notați valoarea de curl din consolă - aceasta va fi valoarea de **minim** pentru slider | + | * Îndoiți degetul arătător suficient cât **doar să atingă** trăgaciul armei - notați valoarea de curl din consolă - aceasta va fi valoarea de **maxim** pentru slider |
| - | * Îndoiți (aproape) complet degetul arătător, până în momentul în care pose-ul degetului nu se mai schimbă - notați valoarea de curl din consolă - aceasta va fi valoarea de **maxim** pentru slider | + | * Îndoiți (aproape) complet degetul arătător, până în momentul în care pose-ul degetului nu se mai schimbă - notați valoarea de curl din consolă - aceasta va fi valoarea de **minim** pentru slider |
| **Normalizați valoarea curl-ului** între valorile de minim și maxim obținute. De exemplu, dacă min/max slider sunt [200;250], remapați în range-ul [0;1]. În script-ul ''Utils'' aveți metoda ajutătoare ''Remap''. | **Normalizați valoarea curl-ului** între valorile de minim și maxim obținute. De exemplu, dacă min/max slider sunt [200;250], remapați în range-ul [0;1]. În script-ul ''Utils'' aveți metoda ajutătoare ''Remap''. | ||
| Line 471: | Line 485: | ||
| Testați dacă ''hitInfo.collider'' are atașat un script de tip **Bottle** - dacă testul trece, apelați metoda ''Shatter'' de pe ''Bottle''. | Testați dacă ''hitInfo.collider'' are atașat un script de tip **Bottle** - dacă testul trece, apelați metoda ''Shatter'' de pe ''Bottle''. | ||
| + | === Resetare sticle === | ||
| + | |||
| + | Pentru a reseta sticlele de pe cea de-a doua masă din scenă, ne vom folosi de un **intractibil de tip Poke** - pe scurt, această funcționează ca un buton virtal și primește input de la **interactorul** de tip **HandPokeInteractor**. | ||
| + | |||
| + | Îl aveți deja definit în scenă. | ||
| + | |||
| + | {{ :irva:laboratoarevr:irva_2025_vr_l4_poke_interactor.png?300 |}} | ||
| + | |||
| + | <note tip> | ||
| + | Rețineți, aceste componente, precum acest interactibil de tip Poke, se pot adăuga în scenele voastre folosind meniul Building Blocks! | ||
| + | </note> | ||
| + | |||
| + | Legarea se poate realiza și în cod, dar pentru acest task, folosiți-vă de evenimentele expuse în inspector de pe script-ul ''InteractableUnityEventWrapper'' atașat obiectului **BottleReset_PokeInteractable**. Evenimentul de interes este ''Select''. | ||
| + | |||
| + | Legați la acesta metoda ''SpawnBottles'' din script-ul ''BottlesManager'' - îl găsiți atașat de obiectul **BottlesTable** în scenă. | ||
| + | |||
| + | === Demo implementare task-uri === | ||
| + | |||
| + | {{ :irva:laboratoarevr:irva_2025_vr_l4_final.gif?450 |}} | ||
| ==== Tasks ==== | ==== Tasks ==== | ||
| - | - Urmăriți pașii desciși în laborator pentru a face **setup** SDK-ului **Meta XR**: Meta Quest App, Quest Link, Meta XR Unity package | + | - Urmăriți pașii descriși în laborator pentru a face setup SDK-ului Meta XR |
| - | - Importați și testați în modul **Quest Link** scenele sample | + | - Importați și testați în modul Quest Link scenele sample |
| - | - Realizați și testați un **build pe headset** al uneia dintre aceste scene sample | + | - Realizați și testați un build pe headset al uneia dintre aceste scene sample |
| - | + | - Creați un nou pose custom pentru a ține arma în mână | |
| - | TODO | + | - Folosiți utilitarul Hand Grab Pose Recorder |
| + | - Ajustați pose-ul după înregistrarea acestuia (poziția încheieturilor degetelor) | ||
| + | - Aplicați regulile pentru grabbing și pose de pe ''HandGrabInteractable'' și ''HandGrabPose'' | ||
| + | - Completați script-ul ''GunHandGrabController'' pentru a detecta momentul în care arma este grabbed | ||
| + | - Nu uitați să asignați întâi în inspectorul acestui script componentele necesare de pe Interaction Rig! | ||
| + | - Completați script-ul ''GunFingerCurlController'' pentru a citi și aplica inputul corespuzător valorii de curl a degetului arătător | ||
| + | - Completați script-ul ''GunRaycastController'' pentru a realiza raycast-ul în urma evenimentului de tragere și adăugați logica de spargere a sticlelor în cazul în care raza se intersectează cu un obiect de tip ''Bottle'' | ||
| + | - Legați poke interactable-ul "Reset Bottles" de script-ul ''BottlesManager'' pentru a reseta sticlele | ||
| + | - [✨Bonus✨] Creați un nou poke interactor | ||
| + | * Atașat de armă (de ex. în partea stângă / lângă grip) | ||
| + | * Prin apăsarea acestuia se va face toggle între modul de tragere semi-automatic și automat al armei | ||
| + | * La apăsare să schimbați textul (opțional și culoarea) interactorului astfel încât acesta să indice modul curent de tragere al armei | ||
| + | * Extindeți logica ''GunFireController'' pentru logica de tragere tip automat (sau creați-vă propriile script-uri, după plac/necesitate) | ||