Macierze w grafice 3D

Report
Jacek Matulewski
Instytut Fizyki, UMK
WWW: http://www.fizyka.umk.pl/~jacek
E-mail: [email protected]
Macierze w grafice 3D
Nowoczesny OpenGL
Toruńska Letnia Szkoła Matematyki i Informatyki
25-29 sierpnia 2014
Motywacja
•
•
•
•
nowoczesny OpenGL (3.*, 4.0)
WebGL (HTML 5)
OpenGL ES 2.0
analogicznie w DirectX 10, 11 (ale XNA Math)
Zmiany w nowoczesnym OpenGL (m.in.):
• obowiązkowanie buforowanie (werteksów)
• shadery, w tym nowe
• algebra macierzy (GLM)
• macierze w grafice 3D
• Profile, zamieszanie z tworzeniem kontekstu
Macierze OpenGL
• macierz model-widok
macierz świata (modelu)
glTranslate, glScale, glRotate
macierz widoku
gluLookAt
• macierz rzutowania
glFrustum, glOrtho, gluPerspective
Funkcje usunięte z profilu rdzennego
GLM, własna implementacja
Trivia
• Współrzędne jednorodne:



0



0



0

+0 +
+0 +
+0 + 

0 
0
0
0
0
0 +0  =
+0 +
+0 +
+0 + 
0
0
0
=
 0 0 

+0 +
+0 +
+0 + 
0
0
0
1
1
1
• Dzielenie perspektywiczne:




/
/
/
Sami piszemy shadery,
które „konsumują” macierze!
• Macierze w grafice 3D:
=
















=
[0]
[1]
[2]
[3]
[4] [8] [12]
[5] [9] [13]
[6] [10] [14]
[7] [11] [15]
Trivia
• Potok renderowania
• GLSL: mat3, mat4 + funkcje i operatory
(w pewnym stopniu można przenieść ciężar obliczeń na karty graficzne)
• CUDA i inne
Macierz rzutowania
Macierz rzutowania
• Macierz rzutowania OpenGL nie jest
macierzą rzutowania na płaszczyznę!
• Macierz rzutowania OpenGL nie zmniejsza
wymiaru zrzutowanego wektora
• Perspektywa w grafice 3D: x, y ~ 1/z (nie 1/r)
(dzięki temu proste przechodzą w proste)
• Macierz rzutowania perspektywicznego
OpenGL nie wprowadza perspektywy!
• Dzielenie perspektywiczne (transf. nieliniowa)
Macierz rzutowania równoległego
• Rzutowanie izometryczne (równoległe):
bez perspektywy tzn. dalsze obiekty po
zrzutowaniu nie są mniejsze
• Zmiana we wszystkich współrzędnych (x, y, z)
jest liniowa (LERP): prostokątny obszar
widzenia przechodzi w sześcian (NDC)
• Podział perspektywiczny
nic device
nie wnosi
NDC (ang. normalized
coordinates)
(ukł. wsp.
przycinania
= NDC)
normalizacja
= zakres
współrzędnych to [-1,1]
• Zmiana kierunku osi OZ
(w OpenGL i XNA/MG, ale nie w Direct3D)
Macierz rzutowania równoległego
LERP:
,  →
−1,1
położenie: na
ekranie
 =
2
+
 −
−
−
 =
2
+
 −
−
−
 =   + 
 =   + 
: ,  → −1,1
 =   + 
: −, − → −1,1
głębia
 = −
2
+
 −
−
−
Macierz rzutowania równoległego
We współrzędnych jednorodnych:
2
+
 =  =
 −

−  − 
2
+
 =  =
 −

−  − 

2
+
=  =
 −

−  − 
 =  = 1
2
−
=
0
0
0
2
−
0
0
0
0
0
−
2
−
0
+
−
−
+
−
−
+
−
−
1
Wolny wyraz „załatwia” współrzędna skalowania
Macierz rzutowania równoległego
Przypadek symetryczny:
r = –l = w/2
2

=
t = –b = h/2
0
0
0
0
2
ℎ
0
0
2
−
−
0
+
−
−
1
0
0
0
0
Typowe wartości w i h:
w = 2 (l = –1, r = 1)
h = 2 (t = 1, b = –1)
n = 0, f = 1
=
1
0
0
0
0 0
1 0
0 −2
0 0
0
0
−1
1
Macierz rzutowania perspektyw.
• Rzutowanie perspektywiczne: rozmiar
obiektów zależy od głębi, a nie od odległości
• Transformacja perspektywiczna
nie jest liniowa (głębokość z w mianowniku)
• Kluczowa rola podziału perspektywicznego
Macierz rzutowania perspektyw.
Z podobieństwa trójkątów OPeRe i OPpRp:


=
 −


=
 −

 = −


 = −

istota perspektywy
Macierz rzutowania perspektyw.
• Perspektywa + przeskalowanie
(we wsp. x i y, jak w rzutowaniu równoległym)
 =
2

+
1 2
+
−
−
=−
 +

−

−
  − 
− 
 =
2

+
1 2
+
−
−
=−
 +

−

−
  − 
− 
Przekształcenie nieliniowe!
część liniowa (macierz)
tu użyjemy podziału perspektywicznego
Macierz rzutowania perspektyw.
• Transformacja do wsp. przycinania i NDC
2
+
 =
 +

−
− 
 =


=
 −
2
+
 =
 +

−
− 
 =


=
 −
 =   + 
nie może zależeć od x i y



=
=
 −
 = −
• Transformacja głębi
 = −
1
  + 
  
: −, − → −1,1

1
+
2
=−
−
 −

−  −
Macierz rzutowania perspektyw.
1
zNDC
0.5
0
-0.5
-1
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
ze
• Transformacja głębi
 = −
1
  + 
  
: −, − → −1,1

1
+
2
=−
−
 −

−  −
Macierz rzutowania perspektyw.
• Macierz „rzutowania” perspektywicznego
(bez podziału nie daje perspektywy!)
2
−
=
0
0
2
−
0
0
0
0
+
−
+
−
+
−
−
−1
0
0
2
−
−
0
Macierz rzutowania perspektyw.
• Wersja symetryczna:
2

=
0
0
0
0
2
ℎ
0
0
+
−
−
−1
2
−
−
0
0
0
0
0
Pole widzenia w pionie (FOVY):

ℎ = 2 tg
2
Proporcja ekranu (aspect ratio):
 = /ℎ
• Dla w = 2, h = 2, n = 1:
1 0
0 1
=
0 0
0 0
0
0
0
0
+1
2
−
−
−1
−1
−1
0
Pomijam problem transformacji
do układu współrzędnych viewportu
Macierz świata
Macierz świata
Translacje (!)



=


1
0
0
0
0
1
0
0
0
0
1
0
∆
∆
∆
1


=


 + ∆ · 
 + ∆ · 
 + ∆ · 

Skalowania i obroty



=



0
0
0
Pochylenia
0

0
0
0
0

0
0
0
0
1

 

 
= 

 


Macierz świata – macierze obrotu
Obroty 2D (wokół osi OZ, OX i OY):
 =
cos()
sin()
0
0
−sin()
cos()
0
0
0
0
1
0
0
0
0
1
 =
1
0
0
0
0
cos()
sin()
0
 =
cos()
0
−sin()
0
0
−sin()
cos()
0
0
0
0
1
0 sin()
1
0
0 cos()
0
0
0
0
0
1
Kąty Cardana (yaw, pitch, roll):
  
Kąty Eulera (fizyka, powt. oś OZ):
  
Macierz świata – macierze obrotu
Obrót wokół dowolnej osi:
 =
cos  + (1 − cos  ) 2
(1 − cos  )   + sin  
(1 − cos  )   − sin  
(1 − cos  )   − sin  
cos  + (1 − cos  ) 2
(1 − cos  )   + sin  
(1 − cos  )   + sin  
(1 − cos  )   − sin  
cos  + (1 − cos  ) 2
Macierze obrotu
to macierze ortonormalne
• wiersze i kolumny to wersory
(układów współrzędnych)
• wiersze są ortogonalne
• kolumny są ortogonalne
Macierz świata – macierze obrotu
Własności macierzy ortonormalnych:
• odwrotność = transpozycja −1 = 
• zachowują rozmiary obiektów
• równoważne z kwaternionami jednostkowymi
• za pomocą macierzy obrotu można zapisać
równania ruchu brył sztywnych
(obrotów brył w ich układzie własnym)
Macierz widoku
Macierz widoku
Macierz odpowiadająca funkcji gluLookAt
Złożenie przekształceń
• przesunięcia (pierwsze)
• obrotu
=
Macierz obrotu wyznaczają
wersory układu wsp. kamery
Macierz widoku
Macierz odpowiadająca funkcji gluLookAt
Dane wejściowe (arg. funkcji):
• położenie kamery E
• położenie centrum C
• Wektor polaryzacji 
Należy obliczyć wersory
układu współrzędnych kamery
Macierz widoku
Macierz odpowiadająca funkcji gluLookAt
Konstrukcja:
1.
2.
3.
4.
5.
Oblicz wektor  =  − .
Zapisz znormalizowaną wartość tego
wektora ′ =   .
Oblicz wektor  prostopadły do wektorów
′ i  korzystając z iloczynu wektorowego
 = ′ ×  (zwrot wyniku wyznacza
reguła śruby prawoskrętnej).
Znormalizuj wektor .
Oblicz wektor ′ =  × ′ prostopadły
do wektorów  i ′ (wektor ′ będzie
jednostkowy, bo oba czynniki są jednostkowe,
a jednocześnie prostopadłe do siebie).
Macierz widoku
Macierz odpowiadająca funkcji gluLookAt
macierz obrotu
=

′
−′
0

′
−′
0

′
−′
0
0
0
0
1
macierz translacji
=
1
0
0
0
0
1
0
0
0 −
0 −
1 −
0
1
ostateczna macierz widoku


 0



− ∘ 1 0
′
′
′



0 ∘0 1
′
′
′






−′

=

=



 =  = − ′ − ′ − ′ 0
0 0
′
′
′
− − −
′ ∘ 0 0
0
0
0
1
0
0
0
1
0
0
1
0
−
−
−
1
Macierze OpenGL
Podsumowanie
• wzory używane w tradycyjnym OpenGL
oraz XNA Math, GLM i innych
• macierz rzutowania izometrycznego
(równoległego) i perspektywicznego
• macierze przekształceń
• konstrukcja macierzy widoku
Książka
Wykład zawiera lokowanie produktu
Artykuł w „Programiście” 5/2014
Wykład zawiera lokowanie produktu
Kontakt
E-mail: [email protected]
WWW: http://www.fizyka.umk.pl/~jacek

similar documents