Table of Contents

Tema 1 - AR Mirror

În cadrul acestei teme va trebui să implementați un demo tehnic ce utilizează și prezintă cunoștințele acumulate. Un video demonstrativ ce înfățișează o posibilă implementare îl puteți viziona în continuare:

Ideea temei este utilizarea unei oglinzi de realitate augmentată (AR) care reflectă mediul înconjurător, dar augmentat. Astfel:

Afișarea conturului unui obiect 3D

Considerăm un triunghi care aparține unui obiect 3D, cu normala $N$ a feței, în spațiul lume. De asemenea, considerăm vectorul de vizualizare (direcția forward a camerei), $V$, în spațiul lume. Dacă unghiul dintre vectorul de vizualizare și normala $N$:

Conturul obiectului este format din muchiile care conectează fețe FRONT_FACE cu fețe BACK_FACE. Totuși, acest contur este destul de zimțat.

Există mai multe metode de afișarea conturului unui obiect 3D. În cadrul acestei teme va trebui să utilizați tehnica prezentată mai jos.

În cadrul temei, vom extinde algoritmul prezentat mai sus, la nivel de vârf. Considerăm că fiecare vârf al triunghiului are o normală diferită: $N_1$, $N_2$, $N_3$. Dacă unghiul dintre vectorul de vizualizare și normala unui vârf:

Dacă un triunghi are și vârfuri orientate spre observator, și vârfuri care sunt orientate în sens invers, atunci considerăm că acel triunghi conține un segment de contur. Vârfurile segmentului de contur se vor determina prin interpolare între vârfurile triunghiului.

În figura de mai sus, $P_2$ este “orientat” către observator (produsul scalar dintre $N_2$ și $V$, $dot_2> 0$), iar $P_1$ și $P_3$ sunt “orientate” în sens invers. Astfel, pe muchiile $P_1P_2$ și $P_2P_3$ se află câte un vârf de pe contur, $P_{12}$, respectiv $P_{23}$. $P_{12}$ și $P_{23}$ se calculează prin interpolare între vârfurile $P_1$ și $P_2$, respectiv $P_2$ și $P_3$, ținând cont că normalele lui $P_{12}$ și $P_{23}$ sunt perfect perpendiculare pe vectorul de vizualizare ($dot_{12}=0$, $dot_{23}=0$).

Vectorul de vizualizare (al camerei care este utilizată pentru redarea scenei în buffer-ul de culoare default) se poate obține cu următoarea funcție:

 GetSceneCamera()->m_transform->GetLocalOZVector(); 

Sistemul de particule

Sistemul de particule emite “licurici” care urmează traiectoriile unor curbe Bezier. În cele ce urmează vor fi descrise proprietățile sistemului de particule. În cadrul temei puteți varia aceste proprietăți, atât timp cât rezultatul este unul asemănător cu cel din video. Sistemul de particule conține 100 de elemente. O particulă conține următoarele proprietăți:

struct Particle
{
    glm::vec4 position;
    glm::vec4 speed;
    glm::vec4 initialPos;
    glm::vec4 initialSpeed;
    float delay;
    float initialDelay;
    float lifetime;
    float initialLifetime;
}

Proprietățile sistemului de particule sunt următoarele:

Reflexia dinamică a mediului înconjurător

Mediul înconjurător va conține un skybox static (puteți folosi texturile din laboratorul 6) și o serie de obiecte dinamice (puteți folosi arcașii din laboratorul 6 și/sau alte obiecte pe care se aplică animații de translație/rotație/scalare).

Se va desena în scenă o oglindă (un quad) care poate fi deplasată (translație pe axele $Ox$, $Oy$, $Oz$) și rotită (față de axele $Ox$, $Oy$, $Oz$) din taste. Din poziția oglinzii se va desena un cubemap într-un framebuffer. Apoi se va folosi acel cubemap din framebuffer pentru a reda reflexia mediului înconjurător pe oglindă:

Desenarea cu cele 6 camere se va realiza într-un singur pas de rasterizare. Acest lucru va fi posibil prin utilizarea unui framebuffer ce conține o textură cubemap. Pe fiecare față a texturii cubemap se va desena geometria din punctul de vizualizare a uneia din cele 6 camere (ca în laboratorul 6).

Pentru a obține acest rezultat, în geometry shader se emite de 6 ori geometria, o dată pentru fiecare față. Cele 6 versiuni ale geometriei sunt identice în spatiul obiectului. Se folosesc 6 matrici de transformare în spații de vizualizare diferite, câte una pentru fiecare cameră și se calculează pozițiile vârfurilor emise în spațiul de vizualizare a fiecărei camere. Cele 6 versiuni diferite ale geometriei în spațiul de vizualizare sunt trimise spre rasterizare și sunt desenate într-una din cele 6 texturi de culoare ale framebuffer-ului. Textura în care se va desena se alege pe baza feței corespunzătoare spațiului de vizualizare al camerei în care a fost proiecată geometria.

Cele 6 texturi de culoare ale framebuffer-ului vor fi pătrate pentru a se mapa fără deformare pe fețele interioare ale cubului. Nu este necesară o rezoluție mare a fiecărei texturi. Rezoluția de 512×512 / 1024×1024 este suficientă.

La desenarea conturului în cubemap, de fiecare dată se va lua în considerare vectorul de vizualizare corespunzător feței curente a cubului (de exemplu, pentru fața X pozitivă se va considera vectorul $(1,0,0)$).

Notare (250)

Bonusuri posibile

Indicații suplimentare

Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio.

Pentru implementarea temei, in folderul src/lab_m2 puteti crea un nou folder, de exemplu Tema1, cu fisierele Tema1.cpp si Tema1.h (pentru implementare POO, este indicat sa aveti si alte fisiere). Pentru a vedea fisierele nou create in Visual Studio in Solution Explorer, apasati click dreapta pe filtrul lab_m2 si selectati Add→New Filter. Dupa ce creati un nou filtru, de exemplu Tema1, dati click dreapta si selectati Add→Existing Item. Astfel adaugati toate fisierele din folderul nou creat. In fisierul lab_list.h trebuie adaugata si calea catre header-ul temei. De exemplu: #include “lab_m2/Tema1/Tema1.h”

Arhivarea proiectului

  • In mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii
  • inainte de a face arhiva asigurati-va ca ati curatat proiectul Visual Studio:
    • click dreapta pe proiect in Solution ExplorerClean Solution
    • si stergeti folderul /build/.vs (daca nu il vedeti, este posibil sa fie ascuns)
  • SAU stergeti complet folderul /build
  • in cazul in care arhiva tot depaseste limita de 50MB (nu ar trebui), puteti sa stergeti si folderul /deps sau /assets intrucat se pot adauga la testare. Nu este recomandat sa faceti acest lucru intrucat ingreuneaza mult testarea in cazul in care versiunea curenta a librariilor/resurselor difera de versiunea utilizata la momentul scrierii temei.