Differences

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

Link to this comparison view

irva:laboratoarevr:htcvive [2025/09/30 11:07]
maria_anca.balutoiu created
irva:laboratoarevr:htcvive [2025/09/30 11:55] (current)
maria_anca.balutoiu
Line 1: Line 1:
-===== Laboratorul 07. HTC Vive =====+===== Laborator VR Bonus. HTC Vive =====
 **HTC Vive** este unul dintre cele mai populare sisteme de realitate virtuală. Este considerat un standard al realității virtuale. Acesta asigură tracking cât mai exact atât al HMD-ului (head mounted display) și al controllerelor,​​ cât și al multiplelor accesorii care pot fi adăugate în plus, precum trackere. **HTC Vive** este unul dintre cele mai populare sisteme de realitate virtuală. Este considerat un standard al realității virtuale. Acesta asigură tracking cât mai exact atât al HMD-ului (head mounted display) și al controllerelor,​​ cât și al multiplelor accesorii care pot fi adăugate în plus, precum trackere.
 +
 +**HTC Vive** este cunoscut pentru acuratețea sistemului său de **tracking** pe bază de **base stations**, care oferă o precizie și stabilitate net superioare multor alte căști VR. Aceste stații emit fascicule laser care sunt detectate de senzori integrați în cască și controllere,​ permițând reconstrucția poziției și orientării în spațiu cu o eroare minimă, chiar și în mișcări foarte rapide sau complexe. În comparație,​ multe căști VR standalone se bazează pe **inside-out tracking** (cum este și cazul **Meta Quest**), adică pe camerele integrate în dispozitiv, care pot fi influențate de iluminare, de lipsa reperelor vizuale sau de poziționarea mâinilor în afara câmpului vizual. Astfel, HTC Vive reușește să asigure o urmărire constantă, fluidă și de înaltă acuratețe, motiv pentru care este preferat în aplicații unde fiabilitatea mișcărilor este esențială — de la simulări profesionale până la cercetare și gaming competitiv.
   
 ==== Hardware ==== ==== Hardware ====
Line 17: Line 19:
     
 {{ :​irva:​laboratoare:​htcviveaccessories.png?​700 |}} {{ :​irva:​laboratoare:​htcviveaccessories.png?​700 |}}
- 
 ==== Software ==== ==== Software ====
 === SteamVR === === SteamVR ===
-Pentru a putea dezvolta aplicații pentru HTC Vive, folosind Unity, putem folosi **SteamVR**. [[https://store.steampowered.com/​app/250820/SteamVR/|SteamVR]] este o aplicație propietară Steam, care este folosită atât de utilizatorii obișnuiți care doresc să se joace jocuri VR, cât și de dezvoltatori în dezvoltarea acestor jocuri. SteamVR oferă suport pentru multiple HMD-uri, precum Valve Index, HTC Vive, Oculus Rift sau Windows Mixed Reality. +Pentru a putea dezvolta aplicații pentru HTC Vive, folosind Unity, putem folosi **SteamVR**. [[https://​store.steampowered.com/​app/​250820/​SteamVR/​|SteamVR]] este o aplicație propietară Steam, care este folosită atât de utilizatorii obișnuiți care doresc să se joace jocuri VR, cât și de dezvoltatori în dezvoltarea acestor jocuri. SteamVR oferă suport pentru multiple HMD-uri, precum Valve Index, HTC Vive, Oculus Rift sau Windows Mixed Reality. Pentru a putea folosi SteamVR, este necesar să avem un cont pe [[https://​​store.steampowered.com/​​|Steam]] și să aveam Steam instalat pe calculator. Pe urmă, putem instala SteamVR.
-   +
-Pentru a putea folosi SteamVR, este necesar să avem un cont pe [[https://​​store.steampowered.com/​​|Steam]] și să aveam Steam instalat pe calculator. Pe urmă, putem instala SteamVR.+
     
 {{ :​irva:​laboratoare:​steamvrdetection.png?​300 |}} {{ :​irva:​laboratoare:​steamvrdetection.png?​300 |}}
-==== Setup Unity ====+=== Setup Unity ===
 Odată instalat SteamVR, putem să ne jucăm orice joc VR. Cu toate astea, ca să putem crea propriile aplicații, este nevoie și de un plugin pentru Unity. Din **Unity Asset Store** trebuie să importăm [[https://​assetstore.unity.com/​packages/​tools/​integration/​steamvr-plugin-32647|SteamVR Plugin]]. Odată instalat SteamVR, putem să ne jucăm orice joc VR. Cu toate astea, ca să putem crea propriile aplicații, este nevoie și de un plugin pentru Unity. Din **Unity Asset Store** trebuie să importăm [[https://​assetstore.unity.com/​packages/​tools/​integration/​steamvr-plugin-32647|SteamVR Plugin]].
  
-Odată instalat pluginul, acceptăm setările default pentru SteamVR. Pe urmă, setăm proiectul pentru un proiect VR, nu AR: **Edit -> Project Settings -> XR Plug-in Management -> PC -> OpenVR Loader**.+Odată instalat pluginul, acceptăm setările default pentru SteamVR. Pe urmă, setăm proiectul pentru un proiect VR: **Edit -> Project Settings -> XR Plug-in Management -> PC -> OpenVR Loader**.
  
-{{ :irva:​laboratoare:​openvr.png?600 |}}+Ultimul pas în configurarea proiectului este să generăm acțiunile specifice pentru input-ul VR**Window -> SteamVR Input**. Acceptăm setările default și le salvăm (**Save and Generate**).
  
-Ultimul pas în configurarea proiectului este să generăm acțiunile specifice pentru input-ul VR:**Window -> SteamVR Input**. Acceptăm setările default și le salvăm (**Save and Generate**). 
  
-{{ :​irva:​laboratoare:​steamvrinput.png?​600 |}} +=== Player. Camera ===
- +
-==== Player. Camera ​====+
 Pentru a putea avea control asupra HMD-ului si a controllerelelor,​ trebuie să adăugăm în scena default Unity prefab-ul **Player**. Acesta conține printre altele, componentele specifice mâinilor (controllerelelor) și ale HMD-ului. Cum orice joc VR este first person, jucătorul are o cameră asociată. Drept urmare, camera default din Unity nu este necesară. Aceasta trebuie ștearsă. Odată adăugat prefab-ul, putem testa aplicația. Observăm cum jucătorul din VR se mișcă în funcție de mișcările noastre. Pentru a putea avea control asupra HMD-ului si a controllerelelor,​ trebuie să adăugăm în scena default Unity prefab-ul **Player**. Acesta conține printre altele, componentele specifice mâinilor (controllerelelor) și ale HMD-ului. Cum orice joc VR este first person, jucătorul are o cameră asociată. Drept urmare, camera default din Unity nu este necesară. Aceasta trebuie ștearsă. Odată adăugat prefab-ul, putem testa aplicația. Observăm cum jucătorul din VR se mișcă în funcție de mișcările noastre.
  
-{{ :​irva:​laboratoare:​htcviveplayer.png?​400 |}} +=== Deplasare în VR ===
- +
-==== Deplasare în VR ====+
 O problemă importantă în aplicațiile VR este deplasarea. Pe de o parte, dacă în lumea reală ne deplasăm, ne deplasăm automat și în VR. Pe de altă parte, de obicei este indicat să nu facem acest lucru mai mult de câțiva pași, deoarece este foarte ușor să ne rănim. Drept urmare, deplasarea în VR pe distanțe mai mari trebuie făcută din cod. O problemă importantă în aplicațiile VR este deplasarea. Pe de o parte, dacă în lumea reală ne deplasăm, ne deplasăm automat și în VR. Pe de altă parte, de obicei este indicat să nu facem acest lucru mai mult de câțiva pași, deoarece este foarte ușor să ne rănim. Drept urmare, deplasarea în VR pe distanțe mai mari trebuie făcută din cod.
  
Line 54: Line 48:
 {{ :​irva:​laboratoare:​htcviveteleportpoint.png?​400 |}} {{ :​irva:​laboratoare:​htcviveteleportpoint.png?​400 |}}
  
-Un **teleport area** este o suprafață în care jucătorul se poate teleporta. De data aceasta, jucătorul nu mai este limitat să se teleporteze într-un singur punct, ci se poate teleporta oriunde pe acea suprafață. Pentru a adăuga o astfel de zonă de teleportare,​ mai întâi trebuie să adaăugam un plan simplu în scenă, căruia îi setăm ce poziție și dimensiune dorim. Pe urmă, pe acest plan, adăugăm scriptul **Teleport Area**, care va transforma întregul plan într-o zonă de teleportare.+Un **teleport area** este o suprafață în care jucătorul se poate teleporta. De data aceasta, jucătorul nu mai este limitat să se teleporteze într-un singur punct, ci se poate teleporta oriunde pe acea suprafață. Pentru a adăuga o astfel de zonă de teleportare,​ mai întâi trebuie să adăugăm un plan simplu în scenă, căruia îi setăm ce poziție și dimensiune dorim. Pe urmă, pe acest plan, adăugăm scriptul **Teleport Area**, care va transforma întregul plan într-o zonă de teleportare.
  
 {{ :​irva:​laboratoare:​htcviveteleportarea.png?​400 |}} {{ :​irva:​laboratoare:​htcviveteleportarea.png?​400 |}}
  
-==== Interacțiunea cu Obiectele în VR ====+=== Interacțiunea cu Obiectele în VR ===
 Pentru a interacționa cu obiectele în VR (să le luăm în mână de exemplu), este suficient să atașăm scriptul **Interactable** pe ele. Mai mult, dacă vrem să aplicăm legile fizice pe aceste obiecte sau dacă vrem să le putem arunca, putem atașa și scriptul **Throwable**,​ care automat atașează obiectului un **RigidBody**. Pentru a interacționa cu obiectele în VR (să le luăm în mână de exemplu), este suficient să atașăm scriptul **Interactable** pe ele. Mai mult, dacă vrem să aplicăm legile fizice pe aceste obiecte sau dacă vrem să le putem arunca, putem atașa și scriptul **Throwable**,​ care automat atașează obiectului un **RigidBody**.
-==== Adăugarea unui Tracker ​====+=== Adăugarea unui Tracker ===
 Dacă dorim să folosim și accesorii HTC Vive, este suficient să le facem pair din SteamVR. Odată setate, avem acces la oricând la ele în Unity. Ca să le putem vizualiza în aplicație, trebuie să atașăm scriptul **Steam VR_Tracked Object** pe obiectul 3D care va reprezenta tracker-ul (de exemplu, un cub). Odată atașat, trebuie specificat ce device vrem să reprezinte obiectul 3D. Astfel, vom modifica parametrul **Index** al scriptului. Dacă dorim să folosim și accesorii HTC Vive, este suficient să le facem pair din SteamVR. Odată setate, avem acces la oricând la ele în Unity. Ca să le putem vizualiza în aplicație, trebuie să atașăm scriptul **Steam VR_Tracked Object** pe obiectul 3D care va reprezenta tracker-ul (de exemplu, un cub). Odată atașat, trebuie specificat ce device vrem să reprezinte obiectul 3D. Astfel, vom modifica parametrul **Index** al scriptului.
  
Line 68: Line 62:
  
 {{ :​irva:​laboratoare:​htcvivetrackerindex.png?​300 |}} {{ :​irva:​laboratoare:​htcvivetrackerindex.png?​300 |}}
-===== Tasks =====  +==== Tasks ==== 
-<note important>​Setup-ul pentru SteamVR in Unity a fost deja facut in proiectul suport (https://​github.com/​Andrei-Lapusteanu/​IRVA_VR). Nu uitati sa luati ultimele update-uri!</​note>​ +
-  - Realizați setup-ul necesar rularii proiectului in VR: Update repository, instalare SteamVR (pachet in Unity), conexiune hardware intre casca si calculator. Veti avea de implementat cateva functionalitati in scena **Assets -> L7_HTCVive -> Scenes -> HTCViveLab** +
-  - Adaugati in scena prefab-ul **Player**. Testati head tracking-ul si controller-ele prin rularea proiectului (play din Unity Editor) +
-  - Adaugati cateva zone de teleportare pentru a putea urca treptele. Plasati ultima zona de teleportare intre mesele de pe platforma superioara. Nu uitati sa va adaugati prefab-ul **Teleporting** pentru a putea folosi functia de teleportare intre obiectele **TeleportPoint** +
-  - Adaugati mai multe obiecte de tip **throwable** (optional, testati diferite scale-uri, setari de rigidbody, etc. pentru acestea) +
- +
-Bonus: +
- +
-  * Folosind oricare dintre cele doua butoane portocalii de pe mese puteti instantia un proiectil care este lansat in directia voastra. Implementati si adaugati in scena un obiect (baseball bat, o paleta, etc.) pe care o puteti tine (ancora) de mana, cu ajutorul careia sa loviti proiectilul. Puteti studia diverse obiecte interactibile in scena **Assets -> SteamVR -> InteractionSystem - > Samples -> Interactions_Example** pentru a vedea pentru ce tipuri de obiecte exista suport. +
- +
-<​hidden>​ +
-<note tip>În acest laborator, pe lângă HTC Vive, vom folosi și funcția de tracking a telefonului mobil pe care o pune la dispoziție ARCore. Astfel, vom avea 2 aplicații:​ +
-  * Phone Movement - aplicație mobile în care vom calcula poziția telefonului. +
-  * HTC Vive - aplicație VR în care vom vedea real time traiectoria telefonului și o vom compara cu HTC Vive. De asemenea, vom implementa și funcționalități de bază HTC VIVE. +
-Cele două aplicații vor comunica între ele prin UDP. Scheletul de cod poate fi descărcat de [[https://​github.com/​Maria-Anca-Balutoiu/​IRVA.git|aici]]. Scripturile necesare pentru rezolvarea laboratorului se află în **Assets->​Scripts**:​ **UDPSend.cs** și **UDPReceive.cs**. +
-</​note>​+
   - Realizați toate setările pentru a putea vizualiza scena în VR.   - Realizați toate setările pentru a putea vizualiza scena în VR.
   - Adăugați cel puțin 3 puncte de teleportare și o zonă de teleportare.   - Adăugați cel puțin 3 puncte de teleportare și o zonă de teleportare.
   - Adăugați cel puțin un cub, pe care să îl puteți arunca.   - Adăugați cel puțin un cub, pe care să îl puteți arunca.
   - Adăugați o reprezentare vizuală a tracker-ului HTC Vive. Observați cum se mișcă în scenă.   - Adăugați o reprezentare vizuală a tracker-ului HTC Vive. Observați cum se mișcă în scenă.
--------- +  ​- Realizați ​un setup în care să puteți compara tracking-ul în HTC Vive (foarte precis datorită base station-urilor) în comparație cu Meta Quest (care nu necesită hardware extern)Pentru asta puteți crea 2 scene: scena care va rula pe căști (și va trimite ​poziția și orientarea ​headset-ului) și scena în care se va putea vizualiza live mișcarea căștilorPentru ușurințăputeți realiza o conexiune UDP (dacă atât căștile, cât și PC-ul se află în aceiași rețea), astfel: 
-  ​- Realizați ​conexiunea UDP dintre aplicația VR șaplicația AR. + 
-  ​Reprezentați axele obiectului din aplicația Desktop ​care reprezintă dispozitivul mobil. +<note warning>​Dacă în cazul **Meta Quest** este necesar un build de **Android**,​ în cazul **HTC Vive** (care este în permanență conectat la calculator) build-ul care va trebui făcut este de **Windows**.</note> 
-  - Trimiteți poziția ​și orientarea camerei de la telefon mobil la calculator. + 
-  - Afișați datele primite de la telefonul mobil, dar și poziția și orientarea ​tracker-ului pe ecran în aplicația Desktop. +<​code>​ 
-  - Pe aplicația Desktopmodificați poziția ​și orientarea obiectului ​care reprezintă telefonul mobil. +using System.Net;​ 
-</hidden>+using System.Net.Sockets;​ 
 +using System.Threading;​ 
 + 
 +public class UDPReceive : MonoBehaviour 
 +
 +    Thread receiveThread;​ 
 +    UdpClient client; 
 +    private int port; 
 + 
 +    public void Start() 
 +    { 
 +        /* Set a port to listen to (same port you will use on the headset) */ 
 +        port = 0; 
 +        /* Setup UDP for receiving data */ 
 +        receiveThread = new Thread(new ThreadStart(ReceiveData));​ 
 +        receiveThread.IsBackground = true; 
 +        receiveThread.Start();​ 
 +    } 
 + 
 +    /* Receive messages via UDP */ 
 +    private void ReceiveData() 
 +    { 
 +        client = new UdpClient(port);​ 
 + 
 +        while (true) 
 +        { 
 +            try 
 +            { 
 +                IPEndPoint anyIP = new IPEndPoint(IPAddress.Any,​ 0); 
 +                byte[] data = client.Receive(ref anyIP); 
 + 
 +                string text = Encoding.UTF8.GetString(data);​ 
 +                ParseText(text);​ 
 + 
 +            } 
 +            catch (Exception err) 
 +            { 
 +                print(err.ToString());​ 
 +            } 
 +        } 
 +    } 
 + 
 +    void OnDisable() 
 +    { 
 +        if (receiveThread != null) 
 +            receiveThread.Abort();​
  
-<​hidden>​ +        client.Close();​ 
-<note important>​Nu s-a reușit portarea în întregime a feature-urilor ce țin de Google Cardboard în proiectul nostru încă :). Pagina are caracter temporar.</note>+    } 
 +} 
 +</code>
  
-Link catre proiect VR (de portat): https://​github.com/​Andrei-Lapusteanu/​3D-UPB-2021-XR-Workshop+<​code>​ 
 +using System.Net; 
 +using System.Net.Sockets;​ 
 +using System.Threading;​
  
-Explicații și todo-uri sunt prezentate aicihttps://​github.com/​Andrei-Lapusteanu/​3D-UPB-2021-XR-Workshop/​tree/​master/​3D-UPB-2021-VirtualReality+public class UDPSend ​MonoBehaviour 
 +
 +    private string IP; 
 +    private int port; 
 +    IPEndPoint remoteEndPoint;​ 
 +    UdpClient client;
  
-<​note>​Este posibil ca unele todo-uri să fie modificate ​(simplificate)</note>+    public void Start() 
 +    { 
 +        ​/* Set the IP of your computer */ 
 +        IP = "​127.0.0.1";​ 
 +        /* Set a port to send messages to. You can use 1098 */ 
 +        port = 0; 
 +        /* Setup UDP connection for sending messages */ 
 +        remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP),​ port); 
 +        client = new UdpClient();​ 
 +    }
  
-Totuși, puteți vizuaiza work in progress-ul pentru portare aici: https://github.com/​Maria-Anca-Balutoiu/​IRVA/​tree/​L7-VR-GoogleCardboard, (branch "​**L7-VR-GoogleCardboard**"​)+    ​/* Send data via UDP */ 
 +    private void SendMessage(string message) 
 +    { 
 +        try 
 +        { 
 +            byte[] data = Encoding.UTF8.GetBytes(message);​ 
 +            client.Send(datadata.Length,​ remoteEndPoint);​ 
 +        } 
 +        catch (Exception err) 
 +        { 
 +            print(err.ToString())
 +        } 
 +    }
  
-<​note>​ Din link-ul de explicații nu funcționează încă realizarea cu succes a build-ului pe telefon ​(așadar secțiunile 8 și 9)</note> +    public void Update() 
-</hidden>+    { 
 +        ​/* Send data to the tracking app */ 
 +        SendMessage("​Hello world!"​);​ 
 +    } 
 +} 
 +</code>
  
irva/laboratoarevr/htcvive.1759219665.txt.gz · Last modified: 2025/09/30 11:07 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