Wykład
Przekształcenia geometryczne
- podstawy matematyczne
- przekształcenia 2D
- współrzędne jednorodne i macierzowa reprezentacja
przekształceń 2D
- składanie przekształceń 2D
- układy współrzędnych
- przekształcenia 3D
- składanie przekształceń 3D
- model procesu rzutowania 3D
- rzut perspektywiczny
- rzut ortogonalny
- okno zobrazowania (viewport)
Podstawy matematyczne
1. Wektory
Wektorem nazywamy uporządkowaną parę punktów. Pierwszy z tych
punktów nazywamy początkiem wektora, a drugi końcem wektora.
AB - wektor o początku w punkcie A i końcu w punkcie B
Długością wektora (moduł wektora) nazywamy długość odcinka
łączącego początek wektora z jego końcem.
AB
oznaczenie: lub AB
Kierunkiem wektora niezerowego nazywamy kierunek prostej, na której
ten wektor leży.
AB
Zwrotem wektora niezerowego nazywamy ten zwrot prostej AB, w
którym punkt A poprzedza punkt B. Dwa niezerowe wektory równoległe
mają ten sam kierunek, ich zwroty mogą być zgodne lub przeciwne.
Dwa wektory niezerowe nazywamy równymi, jeśli mają ten sam
kierunek, ten sam zwrot i równe moduły.
Dodawanie wektorów.
v
B C
u u+v
A D
= u + v
AC
- przemienne: u + v = v + u
- Å‚Ä…czne: (u + v) + w = u + (v + w)
Mnożenie wektora przez liczbę. Iloczynem wektora u przez liczbę k
nazywamy wektor, który:
1) jest równoległy do wektora u
2) ma długość %k%u
3) ma zwrot wektora u jeśli k>0, u`"0, względnie zwrot wektora u, jeśli
k<0, u`"0. Wektor ten oznaczamy ku lub uk.
Właściwości:
- (Ä…²)½ = Ä…(²½)
- 1½ = ½
- (Ä… + ²)½ = Ä…½ + ²½
- Ä…(½ + w) = Ä…½ + Ä…w
Kombinacją liniową wektorów u1, ....., un,, o współczynnikach a1, ....., an,,
gdzie n jest liczbÄ… naturalnÄ…, nazywamy wektor
a1 u1 + a1 u2 + ... + an un
2. Iloczyn skalarny
Iloczynem skalarnym dwóch wektorów u i v nazywamy liczbę, którą
oznaczamy symbolem u · v i która w przypadku, gdy oba wektory sÄ…
niezerowe, jest równa iloczynowi modułów tych wektorów
pomnożonemu przez cosinus kąta między nimi
u · v = uv cos{u, v}
a która jest zerem w przypadku, gdy co najmniej jeden z tych wektorów
jest zerowy.
Właściwości:
1. Iloczyn skalarny dwóch wektorów u i v jest zerem wtedy i tylko
wtedy, gdy wektory te są prostopadłe
u · v = 0 u 4% v
2. Iloczyn skalarny dowolnego wektora u przez ten sam wektor jest
równy kwadratowi modułu tego wektora
u ·u = u2
3. Dla dowolnych wektorów u, v, a, b i dowolnej liczby k zachodzą
następujące równości:
u · v = v ·u - przemienność mnożenia skalarnego
(ku) · v = k(u · v) = u · (kv) - Å‚Ä…czność mnożenia skalarnego z
mnożeniem wektora przez liczbę
u · (a+b) = u ·a + u · b - rozdzielność mnożenia skalarnego
względem dodawania wektorów
3. Macierze
DEF.:
Ciąg dwuwskaznikowy skończony
[ai,j] id"m,jd"n gdzie: m, n liczby naturalne
którego wyrazy ai,j są liczbami rzeczywistymi nazywamy macierzą
wymiaru (m, n) i zapisujemy w postaci tablicy:
a a ... a
îÅ‚ Å‚Å‚
1,1 1,2 1,n
ïÅ‚a a ... a śł
2,1 2,2 2,n
ïÅ‚ śł
A = [ai,j] id"m,jd"n =
ïÅ‚ ... ... ... ... śł
ïÅ‚a a ... a śł
m,1 m,2 m,n
ðÅ‚ ûÅ‚
Wyrazy są ustawione w m wierszach i n kolumnach w taki sposób, że
wyraz ai,j znajduje się w i-tym wierszu i j-tej kolumnie. Jeżeli w
macierzy m = n, to macierz tÄ™ nazywamy macierzÄ… kwadratowÄ… stopnia
n.
Mnożenie macierzy przez liczbę. Iloczynem macierzy A=[ai,j] przez
liczbÄ™ s nazywamy macierz
sA = s[ai,j] = [sai,j]
którą otrzymujemy, mnożąc każdy wyraz macierzy A przez liczbę s.
Dodawanie i odejmowanie macierzy. SumÄ… macierzy A=[ai,j] i B =
[bi,j] tego samego wymiaru nazywamy macierz
A+B = [ai,j] + [bi,j] = [aij,+ bi,j]
którą otrzymujemy, dodając do każdego wyrazu macierzy A odpowiedni
wyraz macierzy B. Analogicznie określamy różnicę dwóch macierzy
A-B = [ai,j] - [bi,j] = [aij,- bi,j]
Mnożenie macierzy przez macierz. Niech będą dane dwie macierze
A=[ai,j]m,n B = [bi,j]n,p
Których wymiary (m,n) i (n,p) są dostosowane tak, aby w każdym
wierszu pierwszej macierzy było tyle wyrazów, ile jest w każdej
kolumnie drugiej macierzy. Iloczynem i-tego wiersza pierwszej macierzy
przez k-tÄ… kolumnÄ™ drugiej macierzy nazywamy liczbÄ™
b
îÅ‚ Å‚Å‚
1k
n
ïÅ‚ śł
c = [a ,..., a ] ... = a b
"
ik i1 in ij jk
ïÅ‚ śł
j =1
ïÅ‚b śł
ðÅ‚ nk ûÅ‚
Iloczynem macierzy A przez macierz B nazywamy macierz
C = AB = [cik] m,p
Której każdy wyraz cik jest iloczynem i-tego wiersza macierzy A przez
k-tÄ… kolumnÄ™ macierzy B.
Przykład: mnożenie macierzy przez macierz
x y
îÅ‚ Å‚Å‚
1 1
a a a a x + a x + a x a y + a y + a y
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
1 2 3 1 1 2 2 3 3 1 1 2 2 3 3
ïÅ‚x y śł
=
2 2
ïÅ‚b b b śł ïÅ‚b x + b x + b x b y + b y + b y śł
ïÅ‚ śł
ðÅ‚ 1 2 3 ûÅ‚ ðÅ‚ 1 1 2 2 3 3 1 1 2 2 3 3 ûÅ‚
ïÅ‚x y śł
ðÅ‚ 3 3 ûÅ‚
Własności działań na macierzach
1. Mnożenie macierzy przez liczbę jest łączne i rozdzielne względem
dodawania liczb i dodawania macierzy
r(sA) = (rs)A (r+s)A = rA + sA s(A+B) = sA + sB
2. Dodawanie macierzy jest przemienne i Å‚Ä…czne
A+B = B+A (A+B)+C = A+(B+C)
3. Mnożenie macierzy przez macierz nie jest przemienne
AB `" BA
4. Mnożenie macierzy przez macierz jest łączne i rozdzielne względem
dodawania macierzy
(AB)C=A(BC) F(G+H)=FG+FH
(G+H)K=GK+HK
5. Mnożenie przez macierz zerową
A0=0 0A=0
Wyznaczniki macierzy kwadratowej
n stopień macierzy
n=2
a a
11 12
det A = = a a - a a
11 22 12 21
a a
21 22
n=3
a a a
11 12 13
det A = a a a = a a a + a a a + a a a -
21 22 23 11 22 33 12 23 31 13 21 32
a a a - a a a - a a a - a a a
31 32 33 13 22 31 11 23 32 12 21 33
Własności:
1. Jeśli macierze A i B są kwadratowe tego samego stopnia, to
det AB = det A det B
2. Macierz kwadratowÄ… A nazywamy:
- osobliwÄ…, gdy det A = 0
- nieosobliwÄ…, gdy det A `" 0
Macierz transponowana
Niech będzie macierz dowolnego wymiaru
A=[ai,j] id",n ,jd"m
MacierzÄ… transponowanÄ… macierzy A nazywamy macierz
A*=[a* ] id",n ,jd"m gdzie: a* = a
i,j i,j ,ji
Własności:
1. Dla każdych macierzy A, B, C, których wymiary są dostosowane
tak, aby istniały iloczyny AB i BC, zachodzi równość
(AB)* = B*A* (ABC)* = C*B*A*
2. Dla każdej kwadratowej macierzy A zachodzi równość
det A* =det A
Macierz odwrotna
Jeśli A jest macierzą nieosobliwą, to macierz X spełniającą związki
AX = E XA = E
nazywamy macierzÄ… odwrotnÄ… do macierzy A i oznaczamy A-1.
A-1 = X
Własności:
1. Wyznacznik macierzy odwrotnej jest odwrotnością wyznacznika
macierzy danej
det A-1 = (det A)-1
2. Jeśli macierze A i B są nieosobliwe i tego samego stopnia, a liczba s
jest różna od 0, to
(s A) 1 = s 1 A 1
(A 1) 1 = A
(AB) 1 = B 1A 1
(A 1)* = (A*) 1
Własności działań na macierzach
5. Mnożenie macierzy przez liczbę jest łączne i rozdzielne względem
dodawania liczb i dodawania macierzy
r(sA) = (rs)A (r+s)A = rA + sA s(A+B) = sA + sB
6. Dodawanie macierzy jest przemienne i Å‚Ä…czne
A+B = B+A (A+B)+C = A+(B+C)
7. Mnożenie macierzy przez macierz nie jest przemienne
AB `" BA
8. Mnożenie macierzy przez macierz jest łączne i rozdzielne względem
dodawania macierzy
(AB)C=A(BC) F(G+H)=FG+FH
(G+H)K=GK+HK
5. Mnożenie przez macierz zerową
A0=0 0A=0
Przekształcenia geometryczne 2D
1. Translacja (przesunięcie) zmiana lokalizacji
y
T
P
P
x
P = {Px, Py} - punkty obiektu przed przekształceniem
P = {P , P } - punkty obiektu po przekształceniu
x y
T = [dx, dy] - wektor translacji
Zapis macierzowy:
d
x' x
îÅ‚ Å‚Å‚
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
x
= +
ïÅ‚d śł
ïÅ‚y'śł ïÅ‚yśł
albo P = P + T
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ y
ðÅ‚ ûÅ‚
2. Skalowanie zmiana rozmiaru
S = [sx, sy] sx i sy, - współczynniki skalowania
y
P
P
sx = sy
x
y
P
P
sx < sy
x
y
P P
sx > sy
x
Zapis macierzowy:
s 0
x' x
îÅ‚ Å‚Å‚
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
x
=
ïÅ‚ śł
ïÅ‚y'śł ïÅ‚yśł
albo P = SP
0 s
ðÅ‚ ûÅ‚ y ðÅ‚ ûÅ‚
ðÅ‚ ûÅ‚
3. Obrót zmiana orientacji
Obrót o kÄ…t ¸ wokół poczÄ…tku ukÅ‚adu współrzÄ™dnych
y
P
P
¸ = 45º
x
Wyprowadzenie wzoru:
y
P =(x ,y )
r
P=(x,y)
r
¸
Åš
x
rcos(¸+Åš)
rcos(Åš)
x = r cosÅš, y = r sinÅš (1)
x =r cos(¸+Åš) = r cosÅš cos¸ r sinÅš sin¸ (2)
y =r sin(¸+Åš) = r cosÅš sin¸ + r sinÅš cos¸ (3)
Po podstawieniu (2) i (3) do (1) otrzymamy:
x = x cos¸ y sin¸, y = x sin¸ + y cos¸ (4)
Zapis macierzowy:
x' cos¸ - sin¸ x
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
=
ïÅ‚y'śł ïÅ‚sin¸ cos¸ śł ïÅ‚yśł
albo P = RP
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
4. Współrzędne jednorodne
x x'
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
ïÅ‚yśł ïÅ‚y'śł
P = P'=
ïÅ‚ śł ïÅ‚ śł
ïÅ‚1śł ïÅ‚1 śł
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
Translacja
x' 1 0 d x
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
x
ïÅ‚y'śł ïÅ‚0 1 d śł ïÅ‚yśł
=
y
albo P = TP
ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł
ïÅ‚1 śł ïÅ‚0 0 1 śł ïÅ‚1śł
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
gdzie: T macierz translacji
Skalowanie
x' s 0 0 x
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
x
ïÅ‚y'śł ïÅ‚
= 0 s 0śł ïÅ‚yśł
y
ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł
albo P = SP
ïÅ‚1 śł ïÅ‚ 0 0 1śł ïÅ‚1śł
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
gdzie: S macierz skalowania
Obrót
x' cos¸ - sin¸ 0 x
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
ïÅ‚ y'śł ïÅ‚sin¸ cos¸ 0śł ïÅ‚yśł
=
ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł albo P = RP
ïÅ‚1 śł ïÅ‚ 0 0 1śł ïÅ‚1śł
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
gdzie: R macierz obrotu
5. Składanie przekształceń 2D
Obrót obiektu wokół dowolnego punktu P1 o kÄ…t ¸
1) 2)
y y
P1 (x1,y1)
T[x1,y1]
x x
Oryginalny rysunek
Po przesunięciu o wektor T do
początku układu współrzędnych
3) 4)
y y
P1 (x1,y1)
-T[x1,y1]
¸ = 45º
x x
Po przesunięciu o wektor -T do
Po obrocie o kÄ…t ¸
poczÄ…tkowego punktu P1
Macierz przekształcenia
1 0 x cos¸ - sin¸ 0 1 0 - x
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
1 1
ïÅ‚0 śł ïÅ‚sin¸ cos¸ 0śł ïÅ‚0 1 - y śł
T (x , y )R(¸ )T (-x ,- y ) = 1 y
1 1 1 1 1 1
ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł
ïÅ‚0 0 1 śł ïÅ‚ 0 0 1śł ïÅ‚0 0 1 śł
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
Skalowanie obiektu względem dowolnego punktu P1 [x1,y1]
Kolejne kroki:
1. Przesunięcie o wektor T tak aby punkt P1 znalazł się w początku
układu współrzędnych
2. Skalowanie ze współczynnikami sx, sy
3. Przesunięcie o wektor T
Macierz przekształcenia
1 0 x s 0 0 1 0 - x
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
1 x 1
ïÅ‚0 śł ïÅ‚ śł
T (x , y )S(s , s )T (-x ,- y ) = 1 y 0 s 0śł ïÅ‚0 1 - y
1 1 x y 1 1 1 y 1
ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł
ïÅ‚0 0 1 śł ïÅ‚ 0 0 1śł ïÅ‚0 0 1 śł
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
Skalowanie i obrót względem punktu P1 będącym środkiem obrotu i
skalowania i przesunięcie obiektu do punktu P2
Kolejne kroki:
1. Przesunięcie o wektor T[x1,y1] tak aby punkt P1 znalazł się w
początku układu współrzędnych
2. Skalowanie ze współczynnikami sx, sy
3. Obrót o kÄ…t ¸ wokół poczÄ…tku ukÅ‚adu współrzÄ™dnych
4. Przesunięcie o wektor T2[x2,y2] do punktu P2
Macierz przekształcenia
T (x , y )S(s , s )R(¸ )T (x , y ) =
1 1 x y 2 2
1 0 x s 0 0 cos¸ - sin¸ 0 1 0 x
îÅ‚ Å‚Å‚îÅ‚ Å‚Å‚îÅ‚ Å‚Å‚îÅ‚ Å‚Å‚
1 x 2
ïÅ‚0 śłïÅ‚ śł
= 1 y 0 s 0śłïÅ‚sin¸ cos¸ 0śłïÅ‚0 1 y
1 y 2
ïÅ‚ śłïÅ‚ śłïÅ‚ śłïÅ‚ śł
ïÅ‚0 0 1 śłïÅ‚ 0 0 1śłïÅ‚ 0 0 1śłïÅ‚0 0 1 śł
ðÅ‚ ûÅ‚ðÅ‚ ûÅ‚ðÅ‚ ûÅ‚ðÅ‚ ûÅ‚
Przypadki przemienności mnożenia macierzy
M1M2 = M2M1
M1 M2
Translacja Translacja
Skalowanie Skalowanie
Obrót Obrót
Skalowanie z sx=sy Obrót
W tych przypadkach nie musimy dbać o kolejność składania macierzy
Własności przekształceń odwrotnych
T-1(x,y) = T(-x,-y)
R-1(¸) = R(-¸)
S-1(sx,sy) = S(1/sx,1/sy )
Przekształcenia 3D
Układy współrzędnych 3D
Prawoskrętny układ współrzędnych (wykorzystywany w OpenGL)
Y
X
Z
Dodatnie kąty obrotów w kierunku przeciwnym do ruchu wskazówek
zegara, gdy patrzymy od strony dodatniej osi w kierunku początku układu.
Lewoskrętny układ współrzędnych
Y
Z
X
Dodatnie kąty obrotów w kierunku zgodnym z ruchem wskazówek zegara,
gdy patrzymy od strony dodatniej osi w kierunku początku układu.
Macierz konwersji:
1 0 0 0
îÅ‚ Å‚Å‚
ïÅ‚0 1 0 0śł
ïÅ‚ śł
M = M =
RL LR
ïÅ‚0 0 -1 0śł
ïÅ‚0 0 0 1śł
ðÅ‚ ûÅ‚
Przekształcenia geometryczne 3D
Operacje obrotu, translacji oraz skalowania można przedstawić za pomocą
macierzy, przez którą należy pomnożyć współrzędne wierzchołka którego
chcemy zmodyfikować. Ogólna postać takiej macierzy to:
M11 M12 M13 M14
îÅ‚ Å‚Å‚
ïÅ‚M M M M śł
21 22 23 24
ïÅ‚ śł
[x' y' z' 1 ]= [x y z 1]Å"
ïÅ‚ śł
M31 M32 M33 M34
ïÅ‚ śł
M M M
ðÅ‚M 41 42 43 44 ûÅ‚
1. Macierz translacji:
1 0 0 0
îÅ‚ Å‚Å‚
ïÅ‚
0 1 0 0śł
ïÅ‚ śł
[x' y' z' 1 ]= [x y z 1]Å"
ïÅ‚ śł
0 0 1 0
ïÅ‚ śł
ïÅ‚T Ty T 1śł
x z
ðÅ‚ ûÅ‚
a więc operację translacji można przedstawić za pomocą wzorów:
x' = x * 1 + y * 0 + z * 0 + 1 * Tx = x + Tx
y' = x * 0 + y * 1 + z * 0 + 1 * Ty = y + Ty
z' = x * 0 + y * 0 + z * 1 + 1 * Tz = z + Tz
gdzie:
- x',y',z' - współrzędne wierzchołka po translacji
- x,y,z - współrzędne wierzchołka przed translacją
- Tx,Ty,Tz - wartości wektora translacji dla kolejnych osi X,Y,Z
[OpenGL: glTranslate* (Tx,Ty,Tz);]
2. Macierz obrotu
a) obrót wokół osi X
1 0 0 0
îÅ‚ Å‚Å‚
ïÅ‚0 cos(¸ ) sin(¸ ) 0śł
ïÅ‚ śł
[x' y' z' 1 ]= [x y z 1]Å"
ïÅ‚ - sin(¸ ) cos(¸ ) 0
śł
0
ïÅ‚0 0
0 1śł
ðÅ‚ ûÅ‚
za pomocą wzorów:
y' = yo + (y - yo)*cos(¸)+(z-zo)*sin(¸);
z' = zo + (z - zo)*cos(¸)-(y-yo)*sin(¸);
x' = xo
gdzie:
- x, y, z - współrzędne punktu przed obrotem
- x', y', z' współrzędne punktu po obrocie
- xo, yo, zo - punkt wokół którego nastąpi obrót
- ¸ - kÄ…t o jaki nastÄ…pi obrót
b) wokół osi Y
cos(¸ ) 0 - sin(¸ ) 0
îÅ‚ Å‚Å‚
ïÅ‚
0 1 0 0śł
ïÅ‚ śł
[x' y' z' 1 ]= [x y z 1]Å"
ïÅ‚ śł
sin(¸ ) 0 cos(¸ ) 0
ïÅ‚ śł
0 0 0 1ûÅ‚
ðÅ‚
za pomocą wzorów:
x' = xo + (x - xo)*cos(¸)-(z-zo)*sin(¸);
z' = zo + (z - zo)*cos(¸)+(x-xo)*sin(¸);
y' = yo
gdzie:
- x, y, z - współrzędne punktu przed obrotem
- x', y', z' współrzędne punktu po obrocie
- xo, yo, zo - punkt wokół którego nastąpi obrót
- ¸ - kÄ…t o jaki nastÄ…pi obrót
c) wokół osi Z
cos(¸ ) sin(¸ ) 0 0
îÅ‚ Å‚Å‚
ïÅ‚
ïÅ‚- sin(¸ ) cos(¸ ) 0 0śł
śł
[x' y' z' 1 ]= [x y z 1]Å"
ïÅ‚ śł
0 0 1 0
ïÅ‚ śł
0 0 0 1ûÅ‚
ðÅ‚
za pomocą wzorów:
x' = xo + (x - xo)*cos(¸)+(y-yo)*sin(¸);
y' = yo + (y - yo)*cos(¸)-(x-xo)*sin(¸);
z' = zo
gdzie:
- x, y, z - współrzędne punktu przed obrotem
- x', y', z' współrzędne punktu po obrocie
- xo, yo, zo - punkt wokół którego nastąpi obrót
- ¸ - kÄ…t o jaki nastÄ…pi obrót
[OpenGL: glRotate* (¸, x, y, z);]
¸ kÄ…t obrotu w stopniach;
( x, y, z) oÅ› obrotu.
( x, y, z) = ( 1, 0, 0) - obrót wokół os X;
( x, y, z) = ( 0, 1, 0) - obrót wokół os Y;
( x, y, z) = ( 0, 0, 1) - obrót wokół os Z;
Przykład: glRotatef(45.0, 0.0, 0.0, 1.0);
3. Macierz skalowania
sx 0 0 0
îÅ‚ Å‚Å‚
ïÅ‚
0 sy 0 0śł
ïÅ‚ śł
[x' y' z' 1 ]= [x y z 1]Å"
ïÅ‚ śł
0 0 sz 0
ïÅ‚
0 0 0 1śł
ðÅ‚ ûÅ‚
za pomocą wzorów:
x' = x * sx
y' = y * sy
z' = z * sz
gdzie:
- x, y, z współrzędne przed skalowaniem
- x', y', z' współrzędne po skalowaniu
- sx , sy , sz współczynniki operacji skalowania
-
[OpenGL: glScale* (sx , sy , sz);]
Przykład: glScalef (2.0, -0.5, 1.0);
- odbicie względem płaszczyzny XZ
- dwukrotne wydłużenie wzdłuż osi X
- dwukrotne zmniejszenie wzdłuż osi Y
Składanie przekształceń
a) obrót + translacja b) translacja + obrót
{ {
glTranslatef (50.0, 0.0, 0.0); glRotatef (45.0, 0.0, 0.0,1.0);
glRotatef (45.0, 0.0, 0.0, 1.0); glTranslatef (50.0, 0.0, 0.0);
draw_object(); draw_object();
} }
Uwaga:
Przekształcenia macierzowe w OpenGL wykonywane są w odwrotnej
kolejności niż wynikałoby to z kodu programu.
Model procesu rzutowania 3D
WEJŚCIE: Modele obiektów 3D (układ współrzędnych obiektu)
1. Macierz modelowania sceny: (układ współrzędnych rzeczywistych -ziemskich)
- translacja
- skalowanie
- obrót
2. Macierz rzutowania: (układ współrzędnych odciętych - płaszczyzny rzutowania )
- rzut perspektywiczny [OpenGL: glFrustum(); glPerspective();]
- rzut ortogonalny [OpenGL: glOrtho();]
3. Dzielenie perspektywiczne - przekształcenie normalizujące:
(układ współrzędnych urządzenia zobrazowania współrzędne znormalizowane)
4. Definiowanie okna zobrazowania [OpenGL: glVievport();]
(układ współrzędnych obszaru zobrazowania - współrzędne ekranowe)
WYJÅšCIE: obraz sceny w oknie zobrazowania
Model procesu rzutowania 3D
Macierz Macierz Definiowanie
Dzielenie
modelowania rzutowania okna
perspektywiczne
M P
zobrazowania
xc xe
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
xo xe xo
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
ïÅ‚ śł ïÅ‚ śł
xd xc / wc
ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
xs
îÅ‚ Å‚Å‚
yc ye
yo ye yo
ïÅ‚ śł śł
ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł ïÅ‚y śł ïÅ‚y / wc śł
= PïÅ‚
ïÅ‚y śł
= M
=
d c
ïÅ‚ śł ïÅ‚ śł
zc ze
ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł s
zo ze zo
ïÅ‚ śł
ïÅ‚ śł ïÅ‚ śł
ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł ïÅ‚ śł
/ wc
ïÅ‚ śł
ðÅ‚zd ûÅ‚ ðÅ‚zc ûÅ‚
ðÅ‚zs ûÅ‚
ðÅ‚wc ûÅ‚ ðÅ‚we ûÅ‚
ðÅ‚ wo ûÅ‚ ðÅ‚we ûÅ‚ ðÅ‚wo ûÅ‚
Współrzędne
Współrzędne w Współrzędne Znormalizowane Współrzędne
obiektu układzie odcięte współrzędne ekranowe
obserwatora urzÄ…dzenia
WEJŚCIE: Modele obiektów 3D (układ współrzędnych obiektu)
1. Macierz modelowania sceny M - (układ współrzędnych rzeczywistych -ziemskich)
- translacja
- skalowanie
- obrót
2. Macierz rzutowania P - (układ współrzędnych odciętych współrzędne płaszczyzny rzutowania )
- rzut perspektywiczny [OpenGL: glFrustum(); glPerspective();]
- rzut ortogonalny [OpenGL: glOrtho();]
3. Dzielenie perspektywiczne - przekształcenie normalizujące:
(układ współrzędnych urządzenia zobrazowania współrzędne znormalizowane <-1;1>)
4. Definiowanie okna zobrazowania [OpenGL: glVievport();]
(układ współrzędnych obszaru zobrazowania - współrzędne ekranowe)
WYJÅšCIE: obraz sceny w oknie zobrazowania
Rzut perspektywiczny
OpenGL: glFrustum(left, right, bottom, top, near, far);
parametry:
- left, bottom, near - współrzędne (x, y, -z) lewego dolnego wierzchołka
- right, top, near - współrzędne (x, y, -z) prawego górnego wierzchołka
- near, far odległość płaszczyzn odcięcia
Funkcja generuje macierz przekształcenia perspektywicznego R:
gdzie:
- l: left, r : right, b: bottom, t: top, n: near, f: far
- l `" r, t `" b, n`" f
h
öÅ‚
fovy = 2 Å" arctgëÅ‚
ìÅ‚ ÷Å‚
2 Å" near
íÅ‚ Å‚Å‚
OpenGL: gluPerspective(fovy, aspect, near, far);
parametry:
- fovy - kąt pola widzenia w płaszczyznie pionowej YZ [0,180ć% ]
- aspect - stosunek szerokości obszaru rzutowania do jego wysokości
- near, far odległość płaszczyzn odcięcia (-z)
Przykład:
Zdefiniować obszar rzutowania obejmujący cały ekran monitora 15
(28 cm x 20 cm). Obserwator znajduje się w odległości 80 cm od monitora,
obiekty znajdujące się w odległości większej niż 5 m nie będą rysowane.
1. glFrustum(-28.0/2, 28.0/2, -20.0/2, 20.0/2, 80.0, 500.0);
2. gluPerspective(14.25, 1.4, 80.0, 500.0);
Rzut ortogonalny (równoległy)
OpenGL: glOrtho(left, right, bottom, top, near, far);
parametry:
- left, bottom - współrzędne (x, y) lewego dolnego wierzchołka
- right, top - współrzędne (x, y) prawego górnego wierzchołka
- near, far odległość płaszczyzn odcięcia
Funkcja generuje macierz przekształcenia ortogonalnego R:
gdzie:
- l: left, r : right, b: bottom, t: top, n: near, f: far
- l `" r, t `" b, n`" f
Definiowanie pozycji obserwatora
OpenGL:
gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz);
Funkcja umiejscawia obserwatora w punkcie o współrzędnych
(eyex, eyey, eyez), punkt (centerx, centery, centerz) definiuje dowolny
punkt leżący na osi widzenia, typowo jest to centralny punkt sceny
(punkt obserwacji). Współrzędne (upx, upy, upz) wyznaczają
kierunek obserwacji (up vector) w oknie zobrazowania typowo
(0,1,0).
Definiowanie okna zobrazowania
OpenGL: glVievport(x, y, width, hight);
Funkcja służy do zdefiniowania prostokątnego obszaru okna
graficznego, w którym odwzorowywany będzie obraz.
parametry:
- x, y - współrzędne (x, y) lewego dolnego wierzchołka okna względem
lewego dolnego wierzchołka okna zobrazowania ekranu
- width, hight - szerokość i wysokość okna
Uwaga:
Wszystkie wartości wyrażone w pikselach
Obszar zobrazowania Okno graficzne
(Viewing Volume) (Viewport)
Odwzorowanie obszaru zobrazowania w okno graficzne
zachowana proporcja brak proporcji
(równe aspekty okien)
Wyszukiwarka
Podobne podstrony:
opengl przeksztalcenia geometrycznePrzekształcenia geometryczne powtórzenieGeometricProbabilityDistribution07 GIMP od podstaw, cz 4 Przekształcenia2 Charakterystyki geometryczne figur płaskich (2)120123 IK wykład 4 WO SŻ kształt ukł geomet3 4 BK Przeksztalcenia gramatykPrzekształcenia liniowe zadania i przykładygeometria zadania powtórzeniowewięcej podobnych podstron