macierze w grafice 3d

32
Macierze w grafice 3D Nowoczesny OpenGL Jacek Matulewski Instytut Fizyki, UMK WWW: http://www.fizyka.umk.pl/~jacek E-mail: jacek@fizyka.umk.pl Toruńska Letnia Szkoła Matematyki i Informatyki 25-29 sierpnia 2014

Upload: milek

Post on 09-Jan-2016

124 views

Category:

Documents


2 download

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 Presentation

TRANSCRIPT

Page 1: Macierze w grafice 3D

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

Page 2: Macierze w grafice 3D

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

Page 3: Macierze w grafice 3D

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

Page 4: Macierze w grafice 3D

• 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!

Page 5: Macierze w grafice 3D

• Potok renderowania

Trivia

• GLSL: mat3, mat4 + funkcje i operatory(w pewnym stopniu można przenieść ciężar obliczeń na karty graficzne)

• CUDA i inne

Page 6: Macierze w grafice 3D

Macierz rzutowania

Page 7: Macierze w grafice 3D

• 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

Page 8: Macierze w grafice 3D

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)

Page 9: Macierze w grafice 3D

Macierz rzutowania równoległego

𝑥 : [ 𝑙 ,𝑟 ] → [ −1,1 ]

𝑦 : [𝑏 ,𝑡 ] → [ −1,1 ]

𝑧 : [ −𝑛 ,− 𝑓 ] → [ −1,1 ]

𝑥𝑐=𝑎𝑥𝑥𝑒+𝑏𝑥

𝑦 𝑐=𝑎𝑦 𝑦𝑒+𝑏 𝑦

𝑧 𝑐=𝑎𝑧 𝑧𝑒+𝑏𝑧

LERP:𝑥𝑐=

2𝑟− 𝑙

𝑥𝑒

−𝑟+𝑙𝑟 − 𝑙

𝑦 𝑐=2

𝑡−𝑏𝑦𝑒

−𝑡+𝑏𝑡−𝑏

𝑧𝑐=−2

𝑓 −𝑛𝑧𝑒−

𝑓 +𝑛𝑓 −𝑛

położenie na ekranie

głębia

Page 10: Macierze w grafice 3D

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)

Page 11: Macierze w grafice 3D

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

)

Page 12: Macierze w grafice 3D

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

Page 13: Macierze w grafice 3D

Z podobieństwa trójkątów OPeRe i OPpRp:

𝑥𝑒

𝑧𝑒=𝑥𝑝

−𝑛𝑦𝑒

𝑧𝑒

=𝑦 𝑝

−𝑛

𝑥𝑝=−𝑛𝑥𝑒

𝑧𝑒

𝑦 𝑝=−𝑛𝑦𝑒

𝑧𝑒

Macierz rzutowania perspektyw.

istota perspektywy

Page 14: Macierze w grafice 3D

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!

Page 15: Macierze w grafice 3D

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𝑛𝑓𝑓 −𝑛 )

Page 16: Macierze w grafice 3D

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

Page 17: Macierze w grafice 3D

Macierz rzutowania perspektyw.

• Macierz „rzutowania” perspektywicznego(bez podziału nie daje perspektywy!)

𝑷=(2𝑛𝑟 −𝑙

0𝑟+ 𝑙𝑟 −𝑙

0

02𝑛𝑡−𝑏

𝑡+𝑏𝑡−𝑏

0

0 0 −𝑓 +𝑛𝑓 −𝑛

−2𝑛𝑓𝑓 −𝑛

0 0 −1 0)

Page 18: Macierze w grafice 3D

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

Page 19: Macierze w grafice 3D

Macierz świata

Page 20: Macierze w grafice 3D

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

Page 21: Macierze w grafice 3D

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): 𝑹𝑧 𝑹𝑥𝑹𝑧

Page 22: Macierze w grafice 3D

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

Page 23: Macierze w grafice 3D

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=𝑹𝑇

Page 24: Macierze w grafice 3D

Macierz widoku

Page 25: Macierze w grafice 3D

Macierz odpowiadająca funkcji gluLookAt

Macierz widoku

Złożenie przekształceń• przesunięcia (pierwsze)• obrotu

Macierz obrotu wyznaczająwersory układu wsp. kamery

Page 26: Macierze w grafice 3D

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

Page 27: Macierze w grafice 3D

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).

Page 28: Macierze w grafice 3D

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)

Page 29: Macierze w grafice 3D

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

Page 30: Macierze w grafice 3D

Książka

Wykład zawiera lokowanie produktu

Page 31: Macierze w grafice 3D

Artykuł w „Programiście” 5/2014

Wykład zawiera lokowanie produktu

Page 32: Macierze w grafice 3D

Kontakt

E-mail: [email protected]

WWW: http://www.fizyka.umk.pl/~jacek