Differences

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

Link to this comparison view

vdvac:tema1 [2024/04/03 12:15]
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 74: Line 76:
 <note important>​ <note important>​
 Dacă alegeți implementarea în shadere, trebuie să aveți grijă la câteva aspecte. Dacă alegeți implementarea în shadere, trebuie să aveți grijă la câteva aspecte.
 +
 +//​**Instrucțiuni repetitive**//​
  
 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++)
Line 84: Line 88:
 }</​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.1712135721.txt.gz · Last modified: 2024/04/03 12:15 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