Tema 1 - Oldie Room

  • Responsabili: Robert Caragicu, Silviu Stăncioiu, Cristian Lambru
  • Lansare: 16 noiembrie 2025
  • Termen de predare: 11 decembrie 2025, ora 23:55
  • Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!

În cadrul acestei teme, veți avea de realizat o scenă demonstrativă similară cu cea din filmulețul de mai jos.

Interiorul scenei conține o încăpere cu două mese, un televizor, o lampă care luminează și două vaze. Geometria obiectelor este realizată prin utilizarea de suprafețe de rotație și de translație. Pe ecranul televizorului se afișează un foc de artificii. De asemenea, ecranul televizorului este lucios și în el se reflectă toate celelalte obiecte din încăpere. Iluminarea produce umbre care se regăsesc și în reflexia de pe ecranul televizorului.

Geometria obiectelor din încăpere

Descriere generică

Toate obiectele din scenă vor fi plasate într-o cameră de formă un paralelipiped. Pereții, tavanul și podeaua camerei sunt o nuanță de gri. În scenă se află două mese. Pe o masă este un televizor, pe cealaltă este o lampă.

În cadrul acestei teme veți folosi mai multe suprafețe de rotație și translație. Se vor folosi Geometry Shaders descrise în Laboratorul 04. Vom modifica generarea din cadrul laboratorului în 3 moduri importante:

  1. Geometria generată va fi multiplicată pentru a desena într-un singur pas pe toate fețele unui cubemap. Cubemap-ul va fi folosit pentru a desena reflexia mediului înconjurător pe ecranul televizorului (capitolul Reflexiile incăperii pe ecranul televizorului).
  2. Coordonate UV vor fi calculate fiecărui vârf pentru a permite desenarea de suprafețe texturate.
  3. Fiecare vârf va avea calculată o normală pentru a permite atât desenarea suprafețelor iluminate de lampă cât și desenarea reflexiilor pe ecranul televizorului.

Atenție la faptul că acest geometry shader trimite mai multe informații față de cel din Laboratorul 04. Astfel numărul maxim de vârfuri pe o fâșie va fi mai mic (încercați o valoare de 70).

Funcția de eliminare a fețelor auto-obturate (face culling) va fi dezactivată pentru a permite vederea interiorului obiectelor.

Coordonate UV pentru suprafețe de rotație și translație

Atât suprafețele de rotație cât și cele de translație pot fi proiectate în spațiul coordonatelor UV conform figurii. Reamintim că în OpenGL spațiul UV are sistemul de coordonate: axa U la dreapta, axa V în sus, originea în stânga jos. Coordonatele UV sunt între 0 și 1.

Numărul de vârfuri pe orizontală este același cu numărul de instanțe trimise în comanda de desenare (num_instances). Pe verticală, numărul de vârfuri este specificat în geometry shader (num_vertical). Punctele generate pot fi aranjate în spațiul UV sub forma unui grid.

Discretizăm axa U în exact num_instances puncte. Fiecare vârf dintr-o coloană va avea asociată o valoare U.

Discretizăm axa V în exact num_vertical puncte. Fiecare vârf dintr-o linie va avea asoicată o valoare V.

Normală vârfuri pentru suprafețe de rotație și translație

În figură ilustrăm cum se calculează normala unui vârf X. Săgeata roșie și verde reprezintă vectorii tangentă la suprafață. Ei se determină calculând direcția de la vârful X la vârfuri vecine. Normala - săgeata albastră - este produsul vectorial dintre săgeata verde și săgeata roșie (atenție la ordinea termenilor!).

Geometria mesei

Masa este formată dintr-un blat și patru picioare. Picoarele sunt suprafețe de rotație.

Blatul este format din 4 laturi și 2 capace.

Capacele sunt dreptunghiuri.

Laturile sunt suprafețe de translație. Pornind de la o curbă Bezier se realizează două laturi translatând curba pe direcția săgeții roșii, respectiv pe direcția săgeții verzi. Celelalte două laturi se construiesc simetric.

Geometria televizorului

Televizorul este format din două părți: un ecran și o carcasă. Carcasa este un paralelipiped texturat.

Ecranul televizorului este o suprafață de rotație de 180° (deci rotim suprafața doar într-un semicerc). Acestă suprafață este scalată inegal, pe axa transversală cu un factor de 0,2. Din cauză că modelul este scalat inegal trebuie calculate normalele după această scalare. Alternativ se pot calcula vârfurile în mod obișnuit și pe urmă acestea vor fi transformate cu o matrice de modelare. Normalele vor fi transformate folosind inversa transpusei matricei de modelare.

Geometria lămpii

Baza lampei și abajurul sunt suprafețe de rotație. Atenție ca abajurul să nu aibă o gaură în spate.

Geometria vazei

Vaza este generată dintr-o suprafață de rotație.

Iluminarea încăperii

Încăperea este iluminată de lampa care se află pe masa din partea opusă celei pe care se află televizorul și vazele. Se utilizează o sursă de lumină de tip spot, similară cu cea utilizată în Laboratorul 01. Direcția de iluminare trebuie orientată conform geometriei lămpii. Suplimentar, intensitatea iluminării lămpii trebuie să fluctueze conform unui șablon de modificare similar cu cel din filmulețul demonstrativ de mai sus.

Similar cu abordarea utilizata în Laboratorul 01, iluminarea trebuie să producă umbre pe baza obiectelor din încăpere, după cum se poate observa în imaginea de mai jos.

Artificiile pe ecranul televizorului

Ecranul televizorului va afișa constant un show de artificii. Pentru aceasta se va folosi un framebuffer în care se va desena un sistem de particule configurat astfel încât să arate ca niște artificii. Textura de culoare din framebuffer va fi afișată pe ecranul televizorului.

Sistemul de particule va avea următorul comportament:

  • Se va alege o culoare random a particulelor, iar toate particulele din sistem vor avea aceeași culoare.
  • Toate particulele vor porni de la acceași poziție inițială și vor avea aceeași viteză inițială care le va face să se ducă în sus.
  • În orice moment particulele sunt afectate de gravitație. Particulele care au fost lansate se vor ridica până în punctul in care viteza lor pe verticală devine 0 (sau mai mică decât 0) din cauza gravitației. În acel punct vor exploda pe direcții random (se poate folosi o functie de generat numere pseudo-random între 0 și 1 în GLSL care să primească ca input gl_VertexID. Aceste numere pot fi folosite pentru componentele unui vec3, care după normalizare să reprezinte direcția).
  • Viteza de după explozie a particulelor va fi pe direcția calculată anterior, înmulțită cu o valoare aleasă aleator (magnitudinea acesteia).
  • Particulele vor avea toate un lifetime, care va fi același pentru toate particulele. Când expiră lifetime-ul acestora, sistemul de particule se resetează și show-ul de artificii o ia de la capăt.

Sistemul de particule pentru artificiile folosite în demo:

Reflexiile încăperii pe ecranul televizorului

Din centrul televizorului se va randa întreaga scenă (mai puțin televizorul și ecranul acestuia) într-un cubemap. Obiectele desenate în acest cubemap trebuie să fie luminate și să casteze umbre.

Pe ecranul televizorului se va folosi acest cubemap pentru a reflecta încăperea (vezi Laboratorul 06)

Pentru ca televizorul să afișeze și show-ul de artificii, dar și reflexiile se va face o interpolare liniară între culorile preluate din cele două texturi (textura în care se randeaza artificiile și cubemap-ul reflexiilor) cu un factor de interpolare constant (ex: 0.25). Exemplu de implementare:

out_color = mix(texture(color_texture, uv), texture(texture_cubemap, cubemapDir), 0.25);

Pentru combinarea celor două texturi vă puteți juca cu formula folosită pentru a obține ce rezultate vreți, dar important este ca pe suprafața ecranului să fie prezente și reflexiile și artificiile.

Pentru facilitarea vizualizării efectului de reflexie pe suprafața ecranului de la televizor, acesta din urmă trebuie să poată fi rotit în jurul axei OY, în ambele sensuri, prin apăsarea butoanelor 1 și 2 de la tastatură. Reflexia pe ecran trebuie să fie coerentă cu rotația pe care o are ecranul televizorului.

Notare (250)

  1. Desenarea geometriei scenei (100p)
    • Geometria mesei - 30p
      • Blatul mesei - 20p
      • Picioarele mesei - 10p
    • Geometria televizorului - 20p
    • Geometria lămpii - 20p
    • Geometria vazei - 10p
    • Asamblarea încăperii din obiecte - 20p
  2. Iluminarea încăperii (50p)
    • Desenarea geometriei scenei cu texturi și iluminare de la lampă - 20p
    • Desenarea umbrelor pentru obiectele din scenă - 30p
  3. Desenarea artificiilor pe ecranul televizorului (50p)
    • Desenarea artificiilor - 40p
    • Desenarea articiilor pe ecranul televizorului - 10p
  4. Desenarea reflexiei obiectelor din scenă în ecranul televizorului (50p)

Rezolvările cerințelor de la punctul 2 sunt punctate doar în situația în care se iluminează, respectiv se creează umbre, cu geometrie realizată prin suprafețe de translație și de rotație.

Similar, rezolvarea cerinței 4 este punctată doar în situația în care pe ecranul televizorului este reflectată geometrie realizată prin suprafețe de translație și de rotație.

Bonusuri posibile

  • Introducerea de alte obiecte create prin utilizarea suprafețelor de translație și de rotație
  • Schimbarea tematicii lumii cu observatia ca se pastreaza geometria ecranului, artificiile de pe ecran, reflexiile, iluminarea si umbrele
  • Orice aduce imbunatatiri vizuale scenei

Indicații suplimentare

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

Pentru implementarea temei, în folderul src/lab_m2 puteți crea un nou folder, de exemplu Tema1, cu fișierele Tema1.cpp și Tema1.h (pentru implementare POO, este indicat să aveți și alte fișiere). Pentru a vedea fișierele nou create în Visual Studio în Solution Explorer, apăsați click dreapta pe filtrul lab_m2 și selectați Add→New Filter. După ce creați un nou filtru, de exemplu Tema1, dați click dreapta și selectați Add→Existing Item. Astfel adăugați toate fișierele din folderul nou creat. În fișierul lab_list.h trebuie adăugată și calea către header-ul temei. De exemplu: #include “lab_m2/Tema1/Tema1.h”.

Arhivarea proiectului

  • În mod normal arhiva trebuie să conțină toate resursele necesare compilării și rulării
  • Înainte de a face arhiva asigurați-vă că ați curățat proiectul Visual Studio:
    • click dreapta pe proiect în Solution ExplorerClean Solution
    • și ștergeți folderul /build/.vs (dacă nu il vedeți, este posibil să fie ascuns)
  • SAU ștergeți complet folderul /build
  • În cazul în care arhiva tot depășește limita de 50MB (nu ar trebui), puteți să ștergeți și folderul /deps sau /assets întrucât se pot adăuga la testare. Nu este recomandat să faceți acest lucru întrucât îngreunează mult testarea în cazul în care versiunea curentă a bibliotecilor/resurselor diferă de versiunea utilizată la momentul scrierii temei.

pgapi/teme/2025/01.txt · Last modified: 2025/12/03 13:47 by robert.caragicu
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