Differences

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

Link to this comparison view

vdvac:tema1 [2024/04/03 12:12]
anca.morar [Indicații suplimentare]
vdvac:tema1 [2024/04/03 13:24] (current)
anca.morar [Detalii de implementare]
Line 28: Line 28:
 __**Metode importante**__ __**Metode importante**__
  
-**//Citirea și încărcarea datelor//​**:​ Citirea dintr-un fișier .raw și încărcarea datelor în volum+**1.** ​**//Citirea și încărcarea datelor//​**:​ Citirea dintr-un fișier .raw și încărcarea datelor în volum
   * Se poate folosi funcția ''​loadRAWFile()''​ din laboratoarele anterioare   * Se poate folosi funcția ''​loadRAWFile()''​ din laboratoarele anterioare
  
-//**Crearea unui cub**// cu vârfurile în intervalul (0,​0,​0)-(1,​1,​1)+**2.** ​//**Crearea unui cub**// cu vârfurile în intervalul (0,​0,​0)-(1,​1,​1)
   * Se poate folosi funcția ''​createCube()''​ din laboratorul 2   * Se poate folosi funcția ''​createCube()''​ din laboratorul 2
  
-//​**Generarea texturii 3D**// și încărcarea datelor din volum în această textură+**3.** ​//​**Generarea texturii 3D**// și încărcarea datelor din volum în această textură
   * Se poate folosi funcția ''​createVolumeTexture()''​ din laboratorul 2   * Se poate folosi funcția ''​createVolumeTexture()''​ din laboratorul 2
  
-**//​Intersecția dintre o dreaptă și un plan//**+**4.** ​**//​Intersecția dintre o dreaptă și un plan//**
   * Intersecția se poate calcula cu formulele de [[https://​en.wikipedia.org/​wiki/​Line%E2%80%93plane_intersection|aici]] (forma algebrică)   * Intersecția se poate calcula cu formulele de [[https://​en.wikipedia.org/​wiki/​Line%E2%80%93plane_intersection|aici]] (forma algebrică)
   * Planul este caracterizat prin:   * Planul este caracterizat prin:
Line 46: Line 46:
     * un punct de pe dreaptă ​     * un punct de pe dreaptă ​
  
-**//​Sortarea punctelor în ordine trigonometrică sau orară//**+**5.** ​**//​Sortarea punctelor în ordine trigonometrică sau orară//**
     *  Se poate folosi algoritmul prezentat [[https://​www.baeldung.com/​cs/​sort-points-clockwise|aici]] ​     *  Se poate folosi algoritmul prezentat [[https://​www.baeldung.com/​cs/​sort-points-clockwise|aici]] ​
  
-//​**Generarea unui poligon din geometria proxy**// în funcție de vectorul de vizualizare,​ poziția observatorului (''​obsPos''​) și distanța de la observator la planul de secționare (''​viewDist''​)+**6.** ​//​**Generarea unui poligon din geometria proxy**// în funcție de vectorul de vizualizare,​ poziția observatorului (''​obsPos''​) și distanța de la observator la planul de secționare (''​viewDist''​)
     * Pentru fiecare latură a cubului, se calculează intersecția dintre dreapta pe care stă latura și planul de secționare curent     * Pentru fiecare latură a cubului, se calculează intersecția dintre dreapta pe care stă latura și planul de secționare curent
       * Planul de secționare e caracterizat prin       * Planul de secționare e caracterizat prin
-        * vectorul de vizualizare ''​viewVec''​+        * normala la plan: vectorul de vizualizare ''​viewVec'':​  
 +          * ''​- glm::​normalize(camera->​m_transform->​GetLocalOZVector())''​
         * un punct de pe plan (de exemplu, dat de ''​obsPos + viewVec * viewDist''​)         * un punct de pe plan (de exemplu, dat de ''​obsPos + viewVec * viewDist''​)
       * Dreapta curentă e caracterizată prin       * Dreapta curentă e caracterizată prin
Line 60: Line 61:
     * Punctele rămase se sortează în ordine trigonometrică/​orară     * Punctele rămase se sortează în ordine trigonometrică/​orară
  
-//​**Afișarea geometriei proxy**//+**7.** ​//​**Afișarea geometriei proxy**//
   * Funcția de generare a unui poligon proxy se apelează de ''​poligNo''​ ori, modificând distanța de la observator la planul curent de secționare (se randează poligoanele în ordinea de la cel mai îndepărtat la cel mai apropiat)   * Funcția de generare a unui poligon proxy se apelează de ''​poligNo''​ ori, modificând distanța de la observator la planul curent de secționare (se randează poligoanele în ordinea de la cel mai îndepărtat la cel mai apropiat)
     * ''​poligNo''​ poate fi modificat de la tastatură     * ''​poligNo''​ poate fi modificat de la tastatură
 +    * o valoare rezonabilă inițială pentru ''​poligNo''​ poate fi dimensiunea volumului (pe una din axe). De exemplu, pentru volumul de date din fișierul ''​engine.raw'',​ valoarea inițială ''​poligNo = 256''​
   * Se activează blending-ul și se setează funcția de blending pentru acumularea din spate în față (la fel ca în laboratorul 3)   * Se activează blending-ul și se setează funcția de blending pentru acumularea din spate în față (la fel ca în laboratorul 3)
  
Line 68: Line 70:
 Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio. Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio.
  
-<​note>​Pentru implementarea temei, în folderul **src/lab_m1** 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_m1** ș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_m1/​Tema1/​Tema1.h”**</​note>​+Generarea geometriei proxy se poate realiza fie în programul aplicație (fișierul .cpp), fie în **vertex shader** (mai complicat) sau **geometry shader** (recomandat).  
 + 
 +<​note>​Pentru implementarea temei, în folderul **src/lab_vdvac** 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, ​puteți să rulați din nou cmake, sau să apăsați click dreapta pe filtrul **lab_vdvac** și să 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_vdvac/​Tema1/​Tema1.h”**</​note>​
  
 <note important>​ <note important>​
-Generarea geometriei proxy se poate realiza fie în programul aplicație (fișierul .cpp), fie în **vertex shader** (mai complicat) sau **geometry shader** (recomandat) +Dacă alegeți implementarea ​în shadere, trebuie să aveți grijă la câteva aspecte.
-</​note> ​+
  
-<​note>​ +//**Instrucțiuni repetitive**// 
-Dacă alegeți implementarea în shadere, aveți grijă la următoarele aspecte: + 
-  ​* Dacă folosiți instrucțiunea ''​for'',​ mergeți cu număr fix de iterații. De exemplu, dacă vreți să procesați elementele unui vector de puncte de dimensiune ''​nrPuncte''​ (care e o variabilă cu valoarea maximă 12), puteți folosi următorul artificiu:<​code>​for (int i = 0; i < 12; i++)+Dacă folosiți instrucțiunea ''​for'',​ mergeți cu număr fix de iterații. De exemplu, dacă vreți să procesați elementele unui vector de puncte de dimensiune ''​nrPuncte''​ (care e o variabilă cu valoarea maximă 12), puteți folosi următorul artificiu:<​code>​for (int i = 0; i < 12; i++)
 { {
    if (i >= nrPuncte)    if (i >= nrPuncte)
Line 84: Line 87:
    ....    ....
 }</​code>​ }</​code>​
-  ​* Dacă generați geometria proxy în geometry shader, intrarea programului shader poate fi un obiect bogus (de exemplu, un punct sau o linie formată din două puncte). Totuși, aveți grijă la limita de puncte ​care se pot genera pentru o singură primitivă. Astfel, este indicat ca o rulare a programului geometry shader să genereze un singur poligon al geomtriei proxy, și nu toată geometria.  ​+ 
 +//**Limită hardware**//​ 
 + 
 +Dacă generați geometria proxy în geometry shader, intrarea programului shader poate fi un obiect bogus (de exemplu, un punct sau o linie formată din două puncte). Totuși, aveți grijă la limita de vârfuri ​care se pot genera pentru o singură primitivă. Astfel, este indicat ca o rulare a programului geometry shader să genereze un singur poligon al geomtriei proxy, și nu toată geometria.  ​
 </​note> ​ </​note> ​
  
Line 100: Line 106:
   - Alte elemente interesante   - Alte elemente interesante
  
 +====Demo====
 +
 +<​html>​
 +<p style="​text-align:​center;​margin:​auto;">​
 +<iframe width="​430"​ height="​250"​ src="​https://​www.youtube.com/​embed/​6fc2_RY4JOE"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe>​
 +</p>
 +</​html>​
vdvac/tema1.1712135560.txt.gz · Last modified: 2024/04/03 12:12 by anca.morar
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