macierze w grafice 3d
DESCRIPTION
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. n owoczesny OpenGL (3.*, 4.0) WebGL (HTML 5) - PowerPoint PPT PresentationTRANSCRIPT
Macierze w grafice 3DNowoczesny OpenGL
Jacek MatulewskiInstytut Fizyki, UMK
WWW: http://www.fizyka.umk.pl/~jacekE-mail: [email protected]
Toruńska Letnia Szkoła Matematyki i Informatyki25-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 rzutowania
macierz świata (modelu) macierz widokugluLookAtglTranslate, glScale, glRotate
glFrustum, glOrtho, gluPerspective
Funkcje usunięte z profilu rdzennego GLM, własna implementacja
• Współrzędne jednorodne:
Trivia
(𝑜𝑥𝑥 𝑜𝑥𝑦 𝑜𝑥𝑧 𝑡𝑥𝑜𝑦𝑥 𝑜𝑦𝑦 𝑜𝑦𝑧 𝑡𝑦𝑜𝑧𝑥 𝑜𝑧𝑦 𝑜𝑧𝑧 𝑡 𝑧0 0 0 1
)(𝑥0
𝑦 0
𝑧 0
1)=(
𝑜𝑥𝑥𝑥0+𝑜𝑥𝑦 𝑦0+𝑜𝑥𝑧 𝑧 0+𝑡𝑥𝑜𝑦𝑥 𝑥0+𝑜𝑦𝑦 𝑦0+𝑜𝑦𝑧 𝑧0+𝑡𝑦𝑜𝑧𝑥𝑥0+𝑜𝑧𝑦 𝑦0+𝑜𝑧𝑧 𝑧 0+𝑡 𝑧
1)(𝑜𝑥𝑥 𝑜𝑥𝑦 𝑜𝑥𝑧
𝑜𝑦𝑥 𝑜𝑦𝑦 𝑜𝑦𝑧
𝑜𝑧𝑥 𝑜𝑧𝑦 𝑜𝑧𝑧)(𝑥0
𝑦0
𝑧 0)+(𝑡𝑥𝑡𝑦𝑡 𝑧)=(𝑜𝑥𝑥 𝑥0+𝑜𝑥𝑦 𝑦0+𝑜𝑥𝑧 𝑧 0+𝑡𝑥
𝑜𝑦𝑥𝑥0+𝑜𝑦𝑦 𝑦0+𝑜𝑦𝑧 𝑧 0+𝑡𝑦𝑜𝑧𝑥𝑥0+𝑜𝑧𝑦 𝑦0+𝑜𝑧𝑧 𝑧0+𝑡 𝑧
)
(𝑥𝑦𝑧𝑤
) (𝑥 /𝑤𝑦 /𝑤𝑧 /𝑤 )
• Dzielenie perspektywiczne:
𝑴=(𝑚𝑥𝑥 𝑚𝑥𝑦 𝑚𝑥𝑧 𝑚𝑥𝑤
𝑚𝑦𝑥 𝑚𝑦𝑦 𝑚𝑦𝑧 𝑚 𝑦𝑤
𝑚𝑧𝑥 𝑚𝑧𝑦 𝑚𝑧𝑧 𝑚𝑧𝑤
𝑚𝑤𝑥 𝑚𝑤𝑦 𝑚𝑤𝑧 𝑚𝑤𝑤
)=(𝑚[0 ] 𝑚 [4 ] 𝑚 [8] 𝑚[12]𝑚 [1 ] 𝑚[5] 𝑚 [9] 𝑚[13]𝑚 [2 ] 𝑚[6 ] 𝑚 [10 ] 𝑚 [14]𝑚[3 ] 𝑚[7] 𝑚[11] 𝑚[15]
)• Macierze w grafice 3D:
Sami piszemy shadery, które „konsumują” macierze!
• Potok renderowania
Trivia
• 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 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
NDC (ang. normalized device coordinates)normalizacja = zakres współrzędnych to [-1,1]
Macierz rzutowania równoległegoMacierz 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 nie wnosi(ukł. wsp. przycinania = NDC)
• Zmiana kierunku osi OZ (w OpenGL i XNA/MG, ale nie w Direct3D)
Macierz rzutowania równoległego
𝑥 : [ 𝑙 ,𝑟 ] → [ −1,1 ]
𝑦 : [𝑏 ,𝑡 ] → [ −1,1 ]
𝑧 : [ −𝑛 ,− 𝑓 ] → [ −1,1 ]
𝑥𝑐=𝑎𝑥𝑥𝑒+𝑏𝑥
𝑦 𝑐=𝑎𝑦 𝑦𝑒+𝑏 𝑦
𝑧 𝑐=𝑎𝑧 𝑧𝑒+𝑏𝑧
LERP:𝑥𝑐=
2𝑟− 𝑙
𝑥𝑒
−𝑟+𝑙𝑟 − 𝑙
𝑦 𝑐=2
𝑡−𝑏𝑦𝑒
−𝑡+𝑏𝑡−𝑏
𝑧𝑐=−2
𝑓 −𝑛𝑧𝑒−
𝑓 +𝑛𝑓 −𝑛
położenie na ekranie
głębia
Macierz rzutowania równoległego
We współrzędnych jednorodnych:
Wolny wyraz „załatwia” współrzędna skalowania
𝑥𝑁𝐷𝐶=𝑥𝑐=2
𝑟 −𝑙𝑥𝑒−
𝑟+ 𝑙𝑟 −𝑙
𝑤𝑒
𝑦𝑁𝐷𝐶=𝑦𝑐=2
𝑡−𝑏𝑦𝑒−
𝑡+𝑏𝑡−𝑏
𝑤𝑒
𝑦𝑁𝐷𝐶=𝑦𝑐=2
𝑡−𝑏𝑦𝑒−
𝑡+𝑏𝑡−𝑏
𝑤𝑒
𝑤𝑐=𝑤𝑒=1
𝑶=(2
𝑟 −𝑙0 0 −
𝑟+ 𝑙𝑟 −𝑙
02
𝑡−𝑏0 −
𝑡+𝑏𝑡−𝑏
0 0 −2
𝑓 −𝑛−𝑓 +𝑛𝑓 −𝑛
0 0 0 1)
Macierz rzutowania równoległego
Przypadek symetryczny:
r = –l = w/2
t = –b = h/2𝑶=(
2𝑤
0 0 0
02h
0 0
0 0 −2
𝑓 −𝑛−𝑓 +𝑛𝑓 −𝑛
0 0 0 1)
w = 2 (l = –1, r = 1)
Typowe wartości w i h:
h = 2 (t = 1, b = –1)
n = 0, f = 1
𝑶=(1 0 0 00 1 0 00 0 −2 −10 0 0 1
)
Macierz rzutowania perspektyw.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
Z podobieństwa trójkątów OPeRe i OPpRp:
𝑥𝑒
𝑧𝑒=𝑥𝑝
−𝑛𝑦𝑒
𝑧𝑒
=𝑦 𝑝
−𝑛
𝑥𝑝=−𝑛𝑥𝑒
𝑧𝑒
𝑦 𝑝=−𝑛𝑦𝑒
𝑧𝑒
Macierz rzutowania perspektyw.
istota perspektywy
Macierz rzutowania perspektyw.
• Perspektywa + przeskalowanie (we wsp. x i y, jak w rzutowaniu równoległym)
𝑥𝑁𝐷𝐶=2
𝑟 − 𝑙 (−𝑛 𝑥𝑒
𝑧𝑒 )−𝑟+ 𝑙𝑟 −𝑙
=−1𝑧𝑒 ( 2𝑛
𝑟 − 𝑙𝑥𝑒+
𝑟+𝑙𝑟 − 𝑙
𝑧𝑒)𝑦𝑁𝐷𝐶= 2
𝑡−𝑏 (−𝑛 𝑦𝑒
𝑧𝑒)−
𝑡+𝑏𝑡−𝑏
=−1𝑧𝑒 ( 2𝑛
𝑡−𝑏𝑥𝑒+
𝑡+𝑏𝑡−𝑏
𝑧𝑒)część liniowa (macierz)
tu użyjemy podziału perspektywicznego
Przekształcenie nieliniowe!
Macierz rzutowania perspektyw.
• Transformacja do wsp. przycinania i NDC
𝑥𝑐=2𝑛𝑟− 𝑙
𝑥𝑒+𝑟+𝑙𝑟 − 𝑙
𝑧𝑒
𝑦 𝑐=2𝑛𝑡−𝑏
𝑥𝑒+𝑡+𝑏𝑡−𝑏
𝑧𝑒
𝑤𝑐=−𝑧𝑒
𝑧𝑐=𝑎𝑧 𝑧𝑒+𝑏𝑧 nie może zależeć od x i y
𝑥𝑁𝐷𝐶=𝑥𝑐
𝑤𝑐
=𝑥𝑐
−𝑧𝑒
𝑦𝑁𝐷𝐶=𝑦𝑐
𝑤𝑐
=𝑦 𝑐
− 𝑧𝑒
𝑧𝑁𝐷𝐶=𝑧 𝑐
𝑤𝑐
=𝑧 𝑐
−𝑧𝑒
𝑧𝑁𝐷𝐶=−1𝑧𝑒
(𝑎𝑧 𝑧𝑒+𝑏𝑧 )
• Transformacja głębi
𝑧 : [ −𝑛 ,− 𝑓 ] → [ −1,1 ]𝑧𝑁𝐷𝐶=−
1𝑧𝑒
(− 𝑓 +𝑛𝑓 −𝑛
𝑧𝑒−2𝑛𝑓𝑓 −𝑛 )
Macierz rzutowania perspektyw.
𝑧𝑁𝐷𝐶=−1𝑧𝑒
(𝑎𝑧 𝑧𝑒+𝑏𝑧 )
• Transformacja głębi
𝑧 : [ −𝑛 ,− 𝑓 ] → [ −1,1 ]𝑧𝑁𝐷𝐶=−
1𝑧𝑒
(− 𝑓 +𝑛𝑓 −𝑛
𝑧𝑒−2𝑛𝑓𝑓 −𝑛 )
-1
-0.5
0
0.5
1
-10-9-8-7-6-5-4-3-2-1
z ND
C
ze
Macierz rzutowania perspektyw.
• Macierz „rzutowania” perspektywicznego(bez podziału nie daje perspektywy!)
𝑷=(2𝑛𝑟 −𝑙
0𝑟+ 𝑙𝑟 −𝑙
0
02𝑛𝑡−𝑏
𝑡+𝑏𝑡−𝑏
0
0 0 −𝑓 +𝑛𝑓 −𝑛
−2𝑛𝑓𝑓 −𝑛
0 0 −1 0)
Macierz rzutowania perspektyw.
• Wersja symetryczna:
𝑷=(2𝑛𝑤
0 0 0
02𝑛h
0 0
0 0 −𝑓 +𝑛𝑓 −𝑛
−2𝑛𝑓𝑓 −𝑛
0 0 − 1 0)
• Dla w = 2, h = 2, n = 1:
𝑷=(1 0 0 00 1 0 0
0 0 −𝑓 +1𝑓 −1
−2 𝑓𝑓 −1
0 0 − 1 0)
h=2𝑛 tg(𝜑2 )Pole widzenia w pionie (FOVY):
𝑎=𝑤 /hProporcja ekranu (aspect ratio):
Pomijam problem transformacji do układu współrzędnych viewportu
Macierz świata
Translacje (!)
Macierz świata
𝑻 (𝑥𝑦𝑧𝑤
)=(1 0 0 ∆ 𝑥0 1 0 ∆ 𝑦0 0 1 ∆ 𝑧0 0 0 1
)(𝑥𝑦𝑧𝑤
)=(𝑥+∆𝑥 ·𝑤𝑦+∆ 𝑦 ·𝑤𝑧+∆𝑧 ·𝑤
𝑤)
Skalowania i obroty
𝑺(𝑥𝑦𝑧𝑤
)=(𝑠𝑥 0 0 00 𝑠𝑦 0 00 0 𝑠 𝑧 00 0 0 1
)( 𝑥𝑦𝑧𝑤)=(𝑠𝑥𝑥𝑠𝑦 𝑦𝑠𝑧 𝑧𝑤
)Pochylenia
Obroty 2D (wokół osi OZ, OX i OY):
Macierz świata – macierze obrotu
𝑹𝑧=(cos(𝛾) −sin (𝛾) 0 0sin(𝛾) cos (𝛾) 0 0
0 0 1 00 0 0 1
) 𝑹𝑥=(1 0 0 00 cos(𝛼) − sin(𝛼) 00 sin(𝛼) cos (𝛼) 00 0 0 1
)𝑹 𝑦=(
cos (𝛽) 0 sin(𝛽) 00 1 0 0
− sin(𝛽) 0 cos (𝛽) 00 0 0 1
)Kąty Cardana (yaw, pitch, roll): 𝑹𝑥𝑹𝑦𝑹𝑧
Kąty Eulera (fizyka, powt. oś OZ): 𝑹𝑧 𝑹𝑥𝑹𝑧
Obrót wokół dowolnej osi:
Macierz świata – macierze obrotu
𝑹�⃗�=¿
Macierze obrotu to macierze ortonormalne• wiersze i kolumny to wersory
(układów współrzędnych)• wiersze są ortogonalne• kolumny są ortogonalne
Własności macierzy ortonormalnych:• odwrotność = transpozycja• 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 świata – macierze obrotu
𝑹−1=𝑹𝑇
Macierz widoku
Macierz odpowiadająca funkcji gluLookAt
Macierz widoku
Złożenie przekształceń• przesunięcia (pierwsze)• obrotu
Macierz obrotu wyznaczająwersory układu wsp. kamery
Macierz odpowiadająca funkcji gluLookAt
Macierz widoku
Dane wejściowe (arg. funkcji): • położenie kamery E• położenie centrum C• Wektor polaryzacji
Należy obliczyć wersoryukładu współrzędnych kamery
Macierz odpowiadająca funkcji gluLookAt
Macierz widoku
Konstrukcja:1. Oblicz wektor .2. Zapisz znormalizowaną wartość tego
wektora .3. Oblicz wektor prostopadły do wektorów
i korzystając z iloczynu wektorowego (zwrot wyniku wyznacza reguła śruby prawoskrętnej).
4. Znormalizuj wektor .5. 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 odpowiadająca funkcji gluLookAt
Macierz widoku
𝑹=(𝑅𝑥 𝑅𝑦 𝑅𝑧 0
𝑈𝑥′ 𝑈 𝑦
′ 𝑈 𝑧′ 0
−𝐹 𝑥′ −𝐹 𝑦
′ −𝐹 𝑧′ 0
0 0 0 1)
𝑽=𝑹𝑻=(𝑅𝑥 𝑅𝑦 𝑅𝑧 − �⃗�∘𝐸
𝑈𝑥′ 𝑈 𝑦
′ 𝑈 𝑧′ −𝑈 ′ ∘ �⃗�
−𝐹 𝑥′ −𝐹 𝑦
′ −𝐹 𝑧′ �⃗� ′ ∘𝐸
0 0 0 1)
𝑻=(1 0 0 −𝐸𝑥
0 1 0 −𝐸𝑦
0 0 1 −𝐸𝑧
0 0 0 1)
macierz obrotu
ostateczna macierz widoku
macierz translacji
𝑽=𝑹𝑻=(𝑅𝑥 𝑅𝑦 𝑅𝑧 0
𝑈𝑥′ 𝑈 𝑦
′ 𝑈 𝑧′ 0
−𝐹 𝑥′ −𝐹 𝑦
′ −𝐹 𝑧′ 0
0 0 0 1)(
1 0 0 −𝐸𝑥
0 1 0 −𝐸𝑦
0 0 1 −𝐸𝑧
0 0 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