Upload
lyanh
View
220
Download
0
Embed Size (px)
Citation preview
Wyklad 1 – Grafika komputerowa
Grafika komputerowa Wejście Wyjście
Przetwarzanie obrazow obraz obrazRozpoznawanie obrazow obraz dane cyfroweGrafika komputerowa dane cyfrowe obraz
Zastosowanie:
• Interfacy graficzne• CAD• Mapy, Wykresy• Medycyna• Symulacje• Rozrywka
Plan wykładów:
1. Algorytmy rysowania prymitywów graficznych• PutPixel(x,y,kolor)• kolor = GetPixel(x,y)
Prymitywy graficze sa to np. odcinki, okregi, elipse i ...
2. Grafika 2D• Wyswietlanie obiektow 2D• Transformacja obiektow 2D
– przesuniecie (translacja)
– obrot
– skalowanie
3. Grafika 3D• Wyswietlanie obiektow 3D• Rzutowanie
rśwnolegle (skośne) perspektywa
• Transformacje obiektow 3D• Algorytmy wykrywania niewidocznych linii i powierzchni• Rzucanie cieni przez obiekty• Oswietlenie
4. Modele barw• RGB
5. Fraktale
6. Funkcje OpenGL
Wyklad 2 – Algorytmy wyświetlania Algorytmy konwersji odcinkaPowstanie efektu schodków – aliasigAby zapobiec aliasing stosuje się rysowanie odcinków w taki sposób by ząbki były koloru jaśniejszego przez co zlewały się z otoczeniem.
0 m≤1x i1= x i1
y i=m∗x iby i1=m∗x i1b=mx i1b=m∗x imb= yim
y i1=y iRound mx i1=x1
Algorytmy rysowania okregów
Obrót wokół początku układów współrzędnych punktu (0,0). Obrót o kąt wokół początku układu współrzednych nazywamy takie przeksztalcenie, ktore P(x,y) przyporzadkuje P'(x',y'), taki, ze|OP| = |OP'| oraz kat POP' = kat (fi) ( czarny przy centrum).
Umowa: Jesli fi > 0 to obracamy w ruchu odwrotnym do rychu wskazuwek zegara. Wspolrzedne P' wyrarzaja się wzorami:
x' = x * cos(fi) – y * sin(fi)y' = x * sin(fi) + y * cos(fi)
Rysowanie okręgu polega na narysowaniu jednejósmej a nastepnie odrysowanie tej części poprzez odbicia.
Uwaga! Więcej na temat wykładu drugiego w skrypcie 'Wykład 2 (Rysowanie odcinków i okręgów) ' M.Badury.
Wyklad 3 – Transformacje 2D
Transformacje (przeksztalcenia geometryczne) obiektow 2D.Transformacja na płaszczyznie nazywamy przekształcenie L: R2 > R2 w postaci:L(x,y) = (ax + by + c,dx + ey + f), gdzie a,b,c,d,e,f nalezace do R
Jesli P=(x,y) to P'=(x',y') nazywamy obrazem przeksztalcenia L.Jesli F nalezy do R2 , to L(F) jest obrazem zbiorem F.
PrzypomnienieDodawanie macierzy A = B + C, AT = BT + CT
Mnozenie macierzy A = B * C, AT = CT * BT | AT = B∗C T = CT * BT
Czasem bedziemy zapisywac punkty jako wektor kolumn (lub wierszy):
P = (x,y), P= [ xy ]Translacja – przesuniecie o wektor, nazywamy takie przeksztalcenie plaszczyzny, gdzie kazdemu punktowi P(x,y) przyporzadkowany jest punkt P'(x',y') taki,ze x'= x + tx, y' = y + ty, gdzie tx, ty to pewne liczby rzeczwiste.
W zapisie macierzowym mamy:
P' = P + T, gdzie T= [ txty ] , czyli [ x 'y ' ] = [ x
y ] + [ txty ]Skalowanie wzgledem poczatku ukladu wspolzednych punktu [0,0] o skalach Sx,Sy. Skalowaniem nazywamy takie przeksztalcenie plaszczyzny, gdzie kazdemu punktowi P(x,y) przyporzadkowany jest punkt P'(x',y') taki, ze:
x' = x * Sxy' = y * Sy, gdzie Sx, Sy naleza do R ∖0
Gdzie Sx,Sy sa wspolczynikami skalowania (skalami) z kierun osi odpowiednio OX, OY. Jezeli Sx = Sy to skalowanie jest jednorodne.Jesli ∣Sx∣≠0 , ∣Sx∣1 , to mamy zmniejszenie w kierunku osi OX, natomiast jesli ∣Sx∣1 , to analogicznie zwiekszenie w kierunku osi OX. Analogicznie do Sy.
Skalowanie w zapisie macierzowym:
P' = S * P, gdzie S jest macierza skalowania: S=[ sx 0 0 Sy ]
[ x 'y ' ]=[S x 0
0 Sy ]∗[ xy ]=[ Sx xy S y]
Przyklad:Rozwazamy trojkat o wierzcholkach A=(1,2), B=(4,1), C=(4,4), Sx=1/2 Sy=2. Wowczas mamy:
[1/2 0 0 2 ]∗[1 4 4
2 1 4 ]=[1/2 2 2 4 2 8 ] , zatem otrzymalismy trojkat o wierzcholkach
A'=(1/2,4) B'=(2,2) C'=(2,8)
Skalowanie wzgledem innego punktu niz punkt [0,0].1 Translacja do punktu [0,0].2 Obrot wokol punktu tak jak powyzej.3 Powrot poprzez odwrotnosc traslacji z punktu pierwszego.
x' = (x – x0) Sx + x0y' = (y – y0) Sy + y0
Wyklad 4 – Transformacje 2D ciag dalszy
PrzypomnienieT t x ,t y – przesunięcie o wektor [tx,ty]
S S x , S y – skalowanie o skalach Sx,Sy wzgledem punktu (0,0)R(fi) – obrot o kat wokol punktu (0,0)
S x0 , y0 S x , S y – skalowanie wzgledem punktu ( x0 , y0 ) o skalach S x , S y
Rx0 , y0 fi – obrot wokol punktu ( x0 , y0 ) o kat (fi)
S x0 , y0 S x , S y * P = S x0 , y0 (P + T( −x0 ,−y0 )) + T( x0 , y0 )
Rx0 , y0 (fi) * P = R(fi)((P + T( −x0 ,−y0 )) + T( x0 , y0 )
Px , y=[ xy1 ]∗[
xy
W ]=[x
Wy
W1]
Transformacje 2D we wspolrzednych jednorodnych:
Przesuniecie (translacja):We wspolrzednych jednorodnych przeksztalcenie przesuniecia ma postac
T tx , ty=[1 0 tx0 1 ty0 0 1 ]
Istotnie, jesli P'(x',y') jest obrazem punktu P(x,y), to
[ x 'y '1 ] = [1
0 0
0 1 0
txty1 ] * [
xy1 ] = [
xtxyty
1 ]W bardziej zwartej formie P' = T(tx,ty) * P , gdzie T(tx,ty) jest macierza tranlacji.
Przyklad 1:Rozwarzmy na plaszczyznie czworokat o wierzcholkach A(1,1), B(5,1), C(4,3), D(1,4). Przesunmy ten czworokat o 3 jednostki osi OY. Wowczas macierz przesuniecia bedzie postaci
T 3,2=[1 0 0
0 1 0
3 2 1 ]
Jesli wspolzedne A,B,C,D zapiszemy w postaci kolumny macierzy
[A , B ,C , D ]=[1 1 1
5 1 1
4 3 1
1 4 1 ] , to obroty tych wierzcholkow
A',B',C',D' wyrarzamy mnozac macierze T(3,2) i [A,B,C,D]
[A' ,B ' ,C ' , D' ]=[1 0 3 0 1 2 0 0 1 ]∗[
1 5 4 1 1 1 3 4 1 1 1 1 ]=[4 2 7 4
3 3 5 6 1 1 1 1 ]
Zatem otrzymamy A'(4,3), B'(8,3), C'(7,5), D'(4,6) (latwo sprawdzic ze sa poprawne).Skalowanie we wspolzednych jednorodnych (wzgledem punktu)
Macierz skalowania we wspolzednych jednorodnych ma mostac S(Sx,Sy) = [Sx0 0
0 Sy0
0 0 1 ]
Jesli P'(x',y') jest obrazem punktu P(x,y), to
[ x 'y '1 ] = [Sx
0 0
0 Sy0
0 0 1 ] * [ xy1 ] = [Sx∗x
Sy∗y1 ]
Inaczej P' = S(Sx,Sy) * P
Obrot we wspolzednych jednorodnych (wzgledem punktu (0,0) o kat fi)Macierz obrotu we wspolrzednych jednorodnych ma postac:
R(fi) = [cos fisin fi
0
−sin ficos fi
0
0 0 1 ]
Obracajac punkt P(x,y) wokol punktu (0,0), o kat fi otrzymammy punkt P'(x',y') to znaczy ze:
[ x 'y '1 ] = [cos fi
sin fi0
−sin ficos fi
0
0 0 1 ] * [ x
y1 ] = [ xcos fi−ysin fi
xsin fiycos fi1 ]
Cwiczenie:Pokazac obrot czworokatu z cwiczenia 1 o kat 30 stopni wokol punktu (0,0)
Skladanie tracformacji we wspolzednych jednorodnych.We wspolzednych jednorodnych skladania transformacji odpowiada mnorzenia odpowiednije macierzy
Skladanie transformacji:T(t1x,t1y) * T(t2x,t2y) = T(t1x+t2x,t1y+t2y) < macierze translacji
Skladanie skalowan:S(Sx,Sy) * S(Kx,Ky) = S(SxKx,SyKy) < macierze skalowania
Skladanie obrotu (wokol punktu (0,0) o kat fi i psi)R(fi) * R(psi) = R(fi+psi) < macierze obrotuSkalowanie wzgledem punktu P0 x0 , y0 o skalach Sx,Sy (!=0). Macierz takiego skalowania jest iloczynem macierzy S xo , yo (Sx,Sy)= T( x0 , y0 ) * S(Sx,Sy) * T( −x0 ,−y0 ):
S xo , yo (Sx,Sy) = [1 0 0
0 1 0
x0y01 ] * [Sx
0 0
0 Sy0
0 0 1 ] * [
1 0 0
0 1 0
−x0−y0
1 ] = [1 0 0
0 1 0
x0y01 ] * [Sx
0 0
0 Sy0
−Sxy0−Syy0
1 ] = = [Sx
0 0
0 Sy0
x0 1−Sxy0 1−Sy
1 ]Wobec tego wspolrzedne obrazu P(x',y') punktu P(x,y) mozemy wyrazic z zaleznosci
P '=S xo , yo Sx , Sy∗Plub inaczej
[ x 'y '1 ] = [Sx
0 0
0 Sy0
x0 1−Sxy0 1−Sy
1 ] * [ xy1 ] * [Sx x−x0 x0Sy y−y0 y0
1 ]Obrot wokol punktu P0 x0 , y0 o kat fi:
Macierza takiego obrotu bedzie iloczyn macierzy T( −x0 ,−y0 ) , R(fi) , T( x0 , y0 )
S xo , yo (fi) = [1 0 0
0 1 0
x0y01 ] * [cos fi
sin fi0
−sin ficos fi
0
0 0 1 ] * [
1 0 0
0 1 0
−x0−y0
1 ] = = [cos fi
sin fi0
−sin ficos fi
0
x0y01 ] * [1
0 0
0 1 0
−x0−y0
1 ] = [−cos fisin fi
0
−sin ficos fi
0
−x0cos fi−y0sin fi−x0 −x0sin fiy0cos fi−y0
1 ]Wobec tego wspolrzedne obrazu P'(x'y') punktu P(x,y) mozemy wyznaczyc zaleznosci P' = Pxo , yo (fi) * Plub inaczej
[ x 'y '1 ] = [cos fi
sin fi0
−sin ficos fi
0
−x0cos fi−y0sin fi−x0−x0sin fiy0cos fi−y0
1 ] * [ xy1 ] = = [x− x0cos fi− y− y0 sin fix0
x− x0 sin fiy−y0 cos fiy01 ]
Uwagi.Zauwaz, ze skladajac pewna liczba trasformacji z punktu 6.16.3 otrzymamy transformacje, ktorej macierzbedzie postaci
M=[r11 r 21 0 r12 r 22 0 x y 0 ] Przyczym podmacierz [r11 r 12
r21 r 22] odpowiada za obroty, skalowanie
natomiast elementy tx,ty odpowiadaja za przesuniecie
Zauwazmy, ze przy przeksztalceniach mozemy zredukowac liczbe dzialn to jest zamiast wykonywac 9 mnozenia i 6 dodawan:
x '=r11∗xr12∗ytx∗1y '=r21∗xr22∗yty∗11 =0 ∗x0 ∗y1 ∗1
mozemy wykonac 4 mnozenia i 4 dodawania
x '=r11∗xr12∗ytxy '=r21∗xr22∗yty
1 =1
Na ogol skladanie (laczenie) transformacji nie jest przemienne (poniewaz mnozenie macierzy nie jest przemienne). Jesli L1,L2 sa dwiema transformacjami , to zlozenie tych transformacji jest przemienne gdy:
L1 L2*translacja *translacja*skalowanie wzgledem (0,0) *skalowanie wzgledem (0,0)*obrot wzgledem (0,0) *obrot wzgledem (0,0)
Wyklad 5 – Transformacje 3D
Transformacja przestrzeni trójwymiarowej nazywamy przekształcenie L : R3R3
postaci:
L x , y , z=a1 xb1 yc1 zd1 , a2 xb2 yc2 zd 2 , a3 xb3 yc3 zd3
Punkt P' = L(P) nazywamy obrazem punktu P w przekształceniu L. Podobnie jak na płaszczyźnie translacji będziemy opisywać za pomocą macierzy podanych we współrzędnych jednorodnych.
Punkt Px , y , z ∈R3 we współrzędnych jednorodnych w reprezentacji (x,y,z,1)
lub (tx,ty,tz,t) dla t≠0
Możemy przyjąć, że punkty x , y , z∈R3
odpowiadają punktowi x , y , z ,1∈R4 lub (x,y,z,w) leżącego w przestrzeni w=1.
Jeśli w≠0 , to punkt (x,y,z,w) reprezentuje punkt x /w , y /w , z /w∈R3 . Zbiór wszystkich współczesnych jednorodnych (x,y,z,w) nazywamy trójwymiarowa przestrzenią rzutową i oznaczamy P3 .
Współrzędnym jednorodnym (x,y,z,0) nie odpowiada żaden punkt przestrzeni R3 . Mówimy, że jest to punkt nieskączoności o kierunku [x,y,z].
PrzykładWspółrzędne jednorodne (2,3,4,5), (4,6,8,10), (6,9,12,15) reprezentują ten sam punkt w R3 (2/5,3/5,4/5). Istotnie (2/5,3/5,4/5,1) = 1/5(2,3,4,5) == 1/10(4,6,8,10) = 1/15(6,9,12,15)
Podobnie jak przekształcenia 2D były reprezentowane we współrzędnych jednorodnych przez macierz 3x3 tak przekształcenia 3D będą reprezentowane przez macierze 4x4. Zatem, jeśli P' = L(P)
[ x 'y 'z '1 ]=[ a1 b1 c1 d1
a2 b2 c2 d2
a3 b3 c3 d3
0 0 0 1 ]∗[xyz1]
Opisując poszczególne transformacje będziemy kożystać z prawoskrętnego układu współrzędnych.Układ prawoskrętny
Kierunek patrzenia, dodatni obrót o 90 stopniX OY na OZY OZ na OXZ OX na OY
Wzory opisujące poszczególne przekształcenia w układzie prawoskrętnym łatwo przekształcić na wzory obowiązujące w
układzie lewoskrętnym. Służą do tego przekształcenia układu współrzędnych, które punktu w drugim układzie.
MP=[1 0 0 0 0 1 0 0 0 0 −1 0 0 0 0 1
]Układ prawoskrętny.
Translacje (przesunięcie)Przesuniecie jest przekształceniem, które punktowi P(x,y,z) przyporządkowuje punkt P'(x',y',z'), gdzie
x' = x + txy' = y + tyz' = z + tz
gdzie tx,ty,tz są pewnymi liczbami rzeczywistymi. Mówimy też, że punkt P jest przekształceniem o wektor [tx,ty,tz]. Przekształcenie jako macierz przesunięcia będziemy oznaczać T(tx,ty,tz).
We współrzednych jednorodnych mamy:
[ x 'y 'z '1]=[1 0 0 tx
0 1 0 ty0 0 −1 tz0 0 0 1
]∗[ xyz1]=[ xtx
ytyztz
1] P' = T(tx,ty,tz) * P
Skalownie względem początku układu współrzednychPodobnie jak na płaszczyżnie w przestrzeni R3 obiekty mogą być zwiększane i zmniejszane w kierunku każdej z osi OX, OY, OZ. Ze współczynnikiem skalowania Sx, Sy, Sz odpowiednio. Skalowanie jest przekształceniem, które przeprowadza punkt P(x,y,z) na punkt P'(x',y',z') taki, że
x' = Sx * xy' = Sy * yy' = Sz * z
gdzie Sx, Sy, Sz (wszystkie nierówne 0) są współczynnikami skalowania. Transformacje skalowania i macierz skalowania będziemy oznaczać przez S(Sx,Sy,Sz).
Macierz skalowania jest postaci:
S Sx , Sy ,Sz=[Sx 0 0 0 0 Sy 0 0 0 0 Sz 0 0 0 0 1
] ,które z założenia P' = S(Sx,Sy,Sz) * P [ x '
y 'z '1]=[Sx 0 0 0
0 Sy 0 0 0 0 Sz 0 0 0 0 1
]∗[ xyz1]=[Sx∗x
Sy∗ySz∗z
1]
Czasem macierz skalowania jest podana w postaci
S Sx , Sy ,Sz , Sw=[Sx 0 0 0 0 Sy 0 0 0 0 Sy 0 0 0 0 Sw
] ,wówczas współczynnikiem skalowania są równe
Sx/Sy w kierunku OX, Sy/Sw w kierunku OY, Sz/Sw w kierunku OZ.
[ x 'y 'z '1]=[Sx 0 0 0
0 Sy 0 0 0 0 Sz 0 0 0 0 Sw
]∗[ xyz1]=[Sx∗x
Sy∗ySz∗zSw
]Skalowanie względem dowolnego punktuAby wykonać skalowanie zwględem punku P0 x0 , y0 , z0 ze współczynnikiem skalowania S x≠0, Sy≠0, Sz≠0 :
• przesuniecie T −x0 ,−y0 ,−z0• skalowanie S S x , S y , Sz• przesuniecie T x0 , y0 , z0
Zatem obrazem punktu P0 x0 , y0 , z0 ze skalowaniem jest punkt P ' 0x '0 , y ' 0 , z ' 0
x '=x−x0∗Sx
y '=y−y0∗S y
z '=z−z0∗S z
P0 x0 , y0 , z0 nazywamy punktem stałym skalowania względem P0 x0 , y0 , z0 o skalach S x≠0, Sy≠0, Sz≠0 oraz macierz tego skalowania będącego S S x , S y , Sz .
Możemy zatem napisać:
P=S x0 , y0 , z0 S x , S y , S z∗P=T x0 , y0 , z0∗S x0 , y0 , z0∗T −x0 ,− y0 ,−z0∗P wobec tego
S x0 , y0 , z0Sx , Sy , Sz jest postaci:
S x0 , y0 , z0Sx , Sy , Sz=[1 0 0 x0
0 1 0 y0
0 0 1 z0
0 0 0 1 ]∗[ Sx 0 0 0
0 S y 0 0 0 0 S z 0 0 0 0 1
]∗[1 0 0 −x0
0 1 0 −y0
0 0 1 −z0
0 0 0 1 ]=[S x 0 0 x01−S x
0 Sy 0 y01−S y0 0 Sz z01−Sz0 0 0 1
]
Obroty wokół osi układu współrzędnychW przestrzeni R3 opisuje obroty wokół prostej zwanej osią obrotów. Obroty wokół osi układu współrzędnych wykonuje się podobnie do obrotów na płaszczyźnie.
Obroty wokół osi OX o kąt (fi)
Obrót ten nie zmienia wartości współrzednej x. Obrazem punktu P(x,y,z) jest punkt P'(x',y',z') to znaczy, że:x' = xy' = y*cos(fi) – z*sin(fi)z' = y*cos(fi) + z*cos(fi)
Obrót wokół osi OX o kąt (fi) macierzą obrotu będącą oznaczoną przez R x fi. Zatem P '=Rx fi∗P .
R x fi=[1 0 0 0 0 cos fi −sin fi 0 0 sin fi cos fi 0 0 0 0 1
]Obroty wokół osi OY o kąt (fi)
Obrót ten nie zmienia wartości współrzednej y. Obrazem punktu P(x,y,z) jest punkt P'(x',y',z') to znaczy, że:x' = x*cos(fi) + z*sin(fi)y' = yz' = x*sin(fi) + z*cos(fi)
Obrót wokół osi OY o kąt (fi) macierzą obrotu będącą oznaczoną przez R y fi. Zatem P '=R y fi∗P .
R y fi=[ cos fi 0 sin fi 0 0 1 0 0
−sin fi 0 cos fi 0 0 0 0 1
]Obroty wokół osi OZ o kąt (fi)
Obrót ten nie zmienia wartości współrzednej z. Obrazem punktu P(x,y,z) jest punkt P'(x',y',z') to znaczy, że:x' = x*cos(fi) z*sin(fi)y' = x*sin(fi) + z*cos(fi)z' = z
Obrót wokół osi OZ o kąt (fi) macierzą obrotu będącą oznaczoną przez R z fi. Zatem P '=R z fi∗P .
R z fi=[ cos fi −sin fi 0 0 sin fi cos fi 0 0
0 0 1 0 0 0 0 1
]Obroty wokół osi równoległej do osi układu współrzednychObroty wokół prostej przechodącej przez punkt P0 x0 , y0 , z0 opisuje się podobnie do obrotu płaszczyzny wokół dowolnego punku. Aby otrzymać obrót o kąt (fi) zdał prostej przechodąccej przez punkt P0 x0 , y0 , z0 równoległej do jednej z osi układu współrzędnych następują kolejne translacje.
• Takie przesunięcie aby prosta l pokryła się z osią układu współrzędnych do której jest równoległa, np T −x0 ,−y0 ,−z0 .
• Obrót o kąt (fi) wokół osi układu współrzędnych na którą l została przesunięta.
• Takie przesunięcie aby prosta l znalazla się w postaci wyjściowej
Rx0 , y0 ,z 0P=T x0 , y0 , z0∗Ry fi∗T −x0 ,−y0 ,−z0
S=T 0, y0 , z0∗Rx fi ∗T 0,− y0 ,−z0
Wykład 6 – Transformacje 3D ciąg dalszy
Obrót wokół osi równoległych do osi OX
P00,0 lOXobrót
0,0P00,0
x=x 0
y=y−y0∗cos fi− z−z0∗sin fiy0
z=y−y0∗sin fiz−z0∗cos fiz0
Rrównoległe X fi=T x 0 , y0 , z0∗R x fi∗T −x 0 ,− y0 ,−z0Oś obrotu przez punkt P0 x0 , y0 , z0 jest równoległa do osi OX. Znajdujemy macierzRrównoległe X fi we współrzędnych jednorodnych.
Rrównoległe X fi=[1 0 0 x0
0 1 0 y0
0 0 1 z0
0 0 0 1 ]∗[1 0 0 0
0 cos fi −sin fi 0 0 sin fi cos fi 0 0 0 0 1
]∗[1 0 0 −x 0
0 1 0 −y0
0 0 1 −z0
0 0 0 1 ]=cdn..
cdn=[1 0 0 0 0 cos fi −sin fi −y0 cos fiz0sin fiy0
0 sin fi cos fi −y0 sin fi−z0 cos fi z0
0 0 0 1 ]
P '=T x0 , y0 , z0∗R x fi∗T −x0 ,−y0 ,−z0∗P=T x0 , y0 , z0∗Rx fi∗T −x0 ,−y0 ,−z0∗P
Obrót wokół osi równoległych do osi OY
P00,0 lOYobrót
0,0P00,0
x=x−x0∗cos fiz−z0∗sin fi x0
y=y0
z=−x− x0∗sin fi z−z0∗cos fiz0
RrównoległeY fi=T x0 , y0 , z0∗Ry fi∗T −x 0 ,−y0 ,−z0Oś obrotu przez punkt P0 x0 , y0 , z0 jest równoległa do osi OY. Znajdujemy macierzRrównoległe Y fi we współrzędnych jednorodnych.
RrównoległeY fi=[1 0 0 x 0
0 1 0 y0
0 0 1 z0
0 0 0 1 ]∗[ cos fi 0 sin fi 0
0 1 0 0 −sin fi 0 cos fi 0
0 0 0 1 ]∗[1 0 0 −x0
0 1 0 −y0
0 0 1 −z0
0 0 0 1 ]=cdn..
cdn=[ cos fi 0 sin fi −x 0∗cos fi−z0∗sin fix0
0 1 0 0 −sin fi 0 cos fi x 0∗sin fi−z0∗cos fiz0
0 0 0 1]
P '=T x0 , y0 , z0∗R y fi∗T −x 0 ,− y0 ,−z0∗P=T x0 , y0 , z0∗Ry fi∗T −x 0 ,− y0 ,−z0∗P
Obrot wokół dowolnej prostej o kąt (fi)Osią obrotu jest prosta przechodąca przez dwa różne punkty P0 x0 , y0 , z0 i
P1x1 , y1 , z1 . Przypomnienie. Dowolna prosta w przestrzeni R3 może być jednoznacznie wyznaczona przez dwa różne punkty, lub przez 1 punkt i kierunek (wektor). Prosta przechodąca przez punkty P0 x0 , y0 , z0 , P1x1 , y1 , z1 ma kierunkt P0 P1 .
Prosta przechodąca przez punkt P0 x0 , y0 , z0 w kierunku V=[x 0 , y0 , z0] przechodzi przez punkt x0V x , y0V y , z0V z .
Aby wykonać obrót wokół prostej l o kąt (fi) należy najwierw wykonać takie przekształcenie, które przeprowadzi prostą l na jedną z osi układu współrzędnych np. OX.
Następnie wykonać obrót wokół osi układu współrzędnych tutaj
Rx fi
Na koniec przeprowadzi transformacje odwrotne do L, które przywrócą prostą l do pozycji początkowej.
Obliczanie katów (alfa i beta):Trójkąt (0,0,0), P'2 i P2 jest prostokątny o kącie prostym w wieżchołku P'2.Krok 1: (przesuwamy prosta i obliczmy punkty P2 i P'2)
P2=T −x0 ,−y0 ,−z0∗P1 P2=x1− x0 , y1−y0 , z1−z0P ' 2=x1−x 0 , y1−y0,0 ;
Niech r=∣OP2∣= x22y2
2z22 , s=∣OP '2∣= x2
2y22 , alfa=kąt P ' 2OX , beta=kąt P2 OP ' 2
Wówczas cos alfa=x2
s=
x2
x22y2
2sin alfa=
x2
s=
y2
y22y2
2
cos beta=sr=
x 22y2
2
x22 y2
2z22
sin beta =z2
r=
z2
x22y2
2z22
W kolejnych krokach wykonamy przekształcenie:Krok 1: T −x0 ,−y0 ,−z0 Krok 2: R z−alfa Krok 3: Ry −beta Krok 4: R x fi Krok 5: R y beta Krok 6: R zalfa Krok 7: T x0 , y0 , z0
Ry beta ∗P=[sr
0 z2
r0
0 1 0 0
−z2
r0
sr
0
0 0 0 1]∗[ xyz1] R y beta∗P=
sr
xz2
rz , y ,−
z2
rx
sr
z
Podobnie możemy wyznaczać macierz: R y −beta , R zalfa ,R z−alfaZatem przekształcenie (transformacja) obrotu wokół osi o kąt (fi) możemy zapisać jako:Ry fi=T −x0 ,−y0 ,−z0∗R z−alfa∗Ry −beta ∗Rx fi∗Ry beta ∗R zalfa ∗T x0 , y0 , z0
Wykład 7 – Symetrie
Symetrie wokół płaszczyzny (odbicia)
Symetria względem płaszczyzny XY
{ x '= xy '= y
z '=−z}SymXY=[1 0 0 0 0 1 0 0 0 0 −1 0 0 0 0 1
]Symetria ta zmienia również układ prawoskrętny na lewoskrętny (patrz – przeksztalca układ współrzędnych).
Symetria względem płaszczyzny YZ
{x '=−xy '=yz '=z }SymYZ=[−1 0 0 0
0 1 0 0 0 0 1 0 0 0 0 1
]Symeria względem płaszczyzny XZ
{ x '=xy '=−yz '=z }SymYZ=[1 0 0 0
0 −1 0 0 0 0 1 0 0 0 0 1
]
Symetria względem dowolnej płaszczyzny (pi)
Równanie płaszczyzny (pi): Ax + By + Cz + D = 0PrzypomninieDowolna płaszczyzna może być wyznaczona jednoznczanie przez 3 różne punkty, lub 1 punkt i dwa różne kierunki, lub przez 2 punkty i 1 kierunek, różne od kierunku prostej przechodzącej przez te punkty.
Wyznaczanie wzoru na P' względem dowolnej płaszczyzny
Podstawiamy P1 , P2 , P3 pod wzór Ax + By + Cz + D = 0;
{A∗x1B∗y1C∗z1D1=0 A∗x2B∗y2C∗z2D2=0 A∗x3B∗y3C∗z3D3=0 } Z tego układu możemy wyznaczyć A,B,C,D.
Wektor n = [A,B,C] jest prostopadły do płaszczyzny. Prosta wyznaczona przez punkt P0 i kierunek v ma równanie P=P0 t∗v ,gdzie t∈R
{x=x 0t∗vx
y=y0t∗v y
z=z0t∗v z}
P0 P1∈l
v=P0 P1
v=[ x1−x0 , y1−y0 , z1−z0]
gdy t∈[0,1] , otrzymujemy odcinek P0 P1Znajdziemy punkt Q nalężący do (pi) taki, że prosta l przechodząca przez P i Q jest prostopadła do (pi). Równanie prostej l:
{X= xt∗nx
Y=yt∗ny
Z=zt∗nz}
gdzie x,y,z są współrzędnymi punktu P, n=[nx , ny , nz]=[A , B ,C ] wektor prostopadły do płaszczyzny (pi) (n jest wektorem normalnym płaszczyny (pi)), t∈R , (X,Y,Z) otrzymane punkty prostej l.
{X= xt∗AY=yt∗BZ=zt∗C }
Sprawdzimy dla jakiego t∈R punkt X ,Y , Z ∈R . Punkt ten musi spełnić równanie płaszczyzny
A xtq∗ABytq∗BC zt q∗CD=0t q A2B2C2=− A∗xB∗yC∗zD
t q=− A∗xB∗yC∗zD
A2B2C2, gdzie A2B2C 2≠0
Zatem mamy Q xt q∗A , yt q∗B , zt q∗C . Ponieważ P mamy równość wektorów
PQ=PQ' , więc otrzymujemy równanie Q – P = P' – Q, czyli P' = 2*Q – Q
{x '=2xt q∗A−xy '=2 yt q∗B− yz '=2 zt q∗C −z }={x '= x2∗t q∗A
y '=y2∗t q∗Bz '=z2∗t q∗C }
1. Funkcja szukająca równania płaszczyzny2. Szukanie t_{q}3. Wyznaczanie P'
Transformacje – przekształcenia układu współrzednychAby przekształcić współrzedne punktu w układzie należy wykonać transformacje odwrotną do transformacji układu. Współrzedne “przesunięcia” będą współrzednymi punktu w “naszym układzie”.
Przesunięcie układu o wektor
{x '= x−t∗xy '=−t∗yz '=z−t∗v }P '=T −t∗x ,−t∗y ,−t∗z ∗P
Skalowanie układem o skalach S_{x},S_{y},S_{z} (nie równe 0)
{x '= x∗xS x
y '= y∗yS y
z '=z∗zS z
}P '=S 1 S x
,1 Sy
,1 Sz
∗P
Obroty układu współrzednych wokół osiObrotem układu współrzędnym o kąt (fi) odpowiada obrót punktu o kąt (fi)
Obrót o kąt (fi) wokół osi OX.
{ x '=xy '=y∗cos fiz∗sin fi
z '=−y∗sin fiz∗cos fi}Rx=Rx − fi
Obrót o kąt (fi) wokół osi OY.
{x '= x∗cos fi−z∗sin fiy '=y
z '= x∗sin fiz∗cos fi}R y=Ry− fi
Obrót o kąt (fi) wokół osi OZ.
{ x '=x∗cos fiy∗sin fiy '=−x∗sin fiy∗cos fi
z '=z }R z=R z− fi
Obrót o kąt (fi) wokół dowolnej osi.Taki obrót należy wykonać podobnie jak obrót punktu wpkół osi l. Patrz Obrot wokół dowolnej prostej o kąt (fi) z tą różnicą, że w kolejnych krokach wykonujemy odwrotne transformacje.
Wykład 8 – Wyświetlanie obiektów 3D
RzutowanieJest podstawowym przekształceniem geometrycznym stsowanym w grafice 3D. Ogólnie rzutowanie jest pewnym przekształceniem punktu z przestrzeni Rn na
przestrzen Rn−1 . W grafice rozwarzamy rzutowanie z R3 w R2 , czasem
z R2 w R . Przy rzutowaniu na płaszczyzne (pi) obrazem P jest P' będący
punktem przecięcia prostej przechodzącej przez punkt P z płaszczyzną (pi) inaczej płaszczyzną rzutowania.
Rzutowanie perspektywiczneW przypadku rzutu perspektywicznego są to proste przechodzące przez punkt P i punkt będący środkiem rzutowania (punkt obserwacji). Proste takie nazywamy promieniami rzutowania. Wszytkie promienie przechodą przez środek , czyli punkt obserwacji. Rzut perspektywiczny stosuje się przez ustalenie środka rzutowania i odległości od środka rzutowania, która to decyduje o deformacji obiektu 3D.
Rzutowanie równoległeW przypadku rzutu równoległego są to proste przechodące przez punkt P i równoległe o kierunku rzutowania k . W tym rzutowaniu proste określone są przez kierunek rzutowania. Rzuty zachowują równoległość odcinków i proporcje odcinków równoległych. Rzut równoległy stosuje się najczęściej w rysunku technicznym (projektowanie).
Równania rzutowaniaWyznaczenie współrzędnych punktu P' na rzutni sprowadza się do obliczenia przecięć promieni rzutowania z rzutnią.
Układ lewoskrętny Układ prawoskrętny
PrzypomnieniePrzejście z jednego układu do drugie uzyskujemy przez transformacje {x' = x; y' = y; z' = z;}
Rzut równoleły – równaniaPrzyjumujemy, że rzut (pi) leży na płaszczyźnie XY. Jednym z rzutów równoległych jest rzut prostopadły, w którym obrazem punktu P(x,y,z), jest punkt P1x , y ,0 . Znjadziemy współrzędne x', y' punktu P'.
Oznaczmy r=P1 P ' .
Wówczas (lewoskrętny):x' = x + r * cos(fi)y' = y + r * sin(fi)Zauważmy, że r = z * ctg(a), zatemx' = x + z * ctg(a) * cos(fi)y' = y + z * ctg(a) * sin(fi)
Wówczas (prawoskrętny):x' = x + r * cos(fi)y' = y – r * sin(fi)r = z * ctg(a)x' = x + z * ctg(a) * cos(fi)y' = y – z * ctg(a) * sin(fi)
Mając dany kierunek k=[k x , k y , k z] (wyznaczony przez prostą P i P') możemy
wyznaczyć mnożnik ctg(a) * cos(fi) i ctg(a) * sin(fi) w praktyce jednak
określając rzut równoległy podajemy miary kątów a i fi. Mając a i fi możemy wyznaczyć kierunek wektora. W zależności od miary kątów a i fi, niektóre rzuty równoległe mają nazwy. np. dla a = arcctg ½ = 63 stopnie mamy rzutkawaleryjski, dla 45 stopni mamy rzut wojskowy (gabinetowy).
(10 linijek tekstu których nie mam, trzeba je wziąć najlepiej od Epiego)
Rzut perspektywiczny
x'd=
xzd
y'd=
yzd
x '=x∗dzd
y '=y∗dzd
x '=x
1 zd
y '=y
1 zd
Widzimy, że odległość 'z' decyduje o wielkośći wyświetlanego obiektu. Im 'z' wieksze tym wyświetlany obiekt jest mniejszy.
Macierz perspektywy (współrzędne jednorodne)
M per=[1 0 0 0 0 1 0 0 0 0 0 0
0 0 1 d
1 ]M per∗P=[1 0 0 0
0 1 0 0 0 0 0 0
0 0 1 d
1 ]∗[ xyz1 ]=[xy0
zd1]
Przyjmijmy teraz, że rzutnia (pi) leży w płaszczyźnie XY oraz obserwator znajduje się w punkcie E x0 , y0 , z0=x 0 , y0 ,−d .
Z podobieństwa trójkątów
x ' x0
−z0
=x− x0
z−z0
y ' y0
−z0
=y−y0
z−z0
x '−x0=x−x0
z−z0
∗−z0 y '−y0=y− y0
z−z0
∗−z0
x '−x0=x−x0
1 −zz0
y '−y0=y− y0
1 −zz0
x '=x−x0
1 −zz0
x0 y '=y−y0
1 −zz0
y0
Zauważmy, że
1 −zz0
=1 zd
T x0 , y0 , z0∗M per∗T −x0 ,− y0 ,0
Ćwiczenie: Znaleźć wzory na rzutowanie perspektywiczne przjmując, że obserwator znajduje się w punkcie (0,0,0) natomiast rzutnia (pi) jest równoległa do punktu XY i przecina oś OZ w punkcie d.
Wykład 9 – Układ obserwatora
Przekształcić układ danych (świata) do układu obserwatora
Patrz przekształcenia układu współrzędnych
Problem:1. Określić kierunki osi w układzie obserwatora2. Przedstawić dane we współrzędnych układu obserwatora
Współrzędne ^O dane są w układzie XYZ. Kierunek ^Z dany jest przez wektorN=[N x , N y , N z]
Niech e1 = [1,0,0], e2 = [0,0,1] będą wersorami w układzie. Oś ^O^Y okreslimy za pomocą wektora U = N * e2 (rzut e2 na płaszczyzne (pi)).
Oś ^O^X określimy za pomocą wektora V=U*N (z dokładnością do prawoskrętnego układu współrzędnych)
Przypomnienie (iloczyn wektorowy)u=[u x , uy ,uz ] v=[v x , vy , vz]
działanie nieprzemienneu∗v=−v∗u
u∗v=[∣uy u z
v y vz∣,∣uz ux
vz vx∣,∣ux uy
v x vy∣]
Odpowiedź na problem 1.
r1=V∣V∣
r2=U∣U∣
r3=N∣N∣
Odpowiedź na problem 2.Wykonajmy kolejno transformacje w układzie danych:
1. T(^0x, ^0y, ^0z) przesunięcie. Wtedy układ ^0 znajduje się w punkcie 0
2. Taki obrót aby osie ^0^X, ^0^Y, ^0^Z zostały przekształcone na osie 0X, 0Y, 0Z. Macierz takiego obrotu we współrzędnych jednorodnych jest równa:
R=[r1x r1y r1z 0 r2x r2y r2z 0 r3x r3y r3z 0 0 0 0 1
]Aby okreslić obiekty w układzie obserwatora należy wykonać transformacje:M = R * T (^0x, ^0y, ^0z)
x '=r1x∗xr 1y∗yr 1z∗zy '=r 2x∗xr 2y∗yr 2z∗zz '=r3x∗xr 3y∗yr 3z∗z
Przekształcenia w polu wizualizacjiObraz rzutowania na rzutnie (pi)
Określmy przekształcenie F odwzorujące obraz na rzut w polu wizualizacji np. prostokąt na ekranie.
Odwzorowanie F jest złożeniem następujących trzech transformacji1. T −Xmin ,−Y min
2. S U max−U min
X max−Xmin
,V max−V min
Y max−Y min
3. T Umin , V min Zatem:
F=T U min ,V min∗S U max−U min
X max−Xmin
,V max−V min
Y max−Y min
∗T −X min ,−Y min
Obcinanie (wykonuje się we współrzędnych obserwatora)Zobcinanie
Zobcinanie jest wyznaczaniem tej części odcinka P0 P1 , która leży przed obserwatorem, tzn przed płaszczyzną z = d. 0 * x + 0 * y + 0 * z = dJeśli współrzędna z końców są większe od d to cały odcinek jest widoczny i
nie obcinamy, jeśli współrzędne z końców odcinka są mniejsze od d to odcinej jest niewidoczny i nie obcinamy go ponieważ nie jest wyświetlany.
Jeśli jeden z końców odcinka ma współrzędne większe od d, a drugi mniejszą od d to należy wykonać Zobcinanie. Przyjmijmy, że współrzędne z punktu
P0 jest większa od d, natomiast P1 jest mniejsza od d.
Odcinek P0 P1 możemy przedstawić za pomocą równań parametrycznych. Jeśli
t∈R to równanie określa prosta przechodząca przez P0 i P1
x= x0t∗x1−x 0y=y0t∗y1−y0z=z0t∗ z1−z0
t∈[0,1]
Znajdujemy współrzędne punktu Q∈P0 P1 , który jest przecięciem odcinka
P0 P1 z płaszczyzną z = d. (Punkt Q spełnia równania odcinka i równania płaszczyzny). Zatem:
−d=z0t∗ z1−z0 t=−d−z0
z1−z0
t=dz0
z0−z1Mamy zatem następujące współrzędne punktu Q:
x=x0dz0
z0−z1
∗ x1−x0
y= y0dz0
z0−z1
∗y1−y0
z=−3 4
d Sprawdzić bo miwyszło z=z0−d
W praktyce Zobcinanie stosuje się w płaszczyźnie przed obserwatorem. Obcinanie do ostosłupa (prostopadłościanu widzenia).
Ćwiczenia. Określić (znaleźć) wzory na obcinanie do ostrosłupa widzenia.
Wykład 10 – Reprezentacja brył w scenie 3D
Wyznaczanie widocznych linii i powierzchni w scenie 3D.Zadanie (problem). Chcemy wyznaczyć te linie i powierzchnie lub ich fragmenty, które widzialne są z kierunku obserwacji. Proces taki określamy jako wyznaczenie linii powierzchni niewidocznych, lub jako eliminowanie linii i powierzchni niewidocznych. W praktyce stosowane są dwa podejścia.
Algorytm z precyzja obrazkową (Zbuffor)
for ( dla każdego piksela ){Wyznaczyć obiekt ściany najbliższej i taki, którego rzut zawiera piksel, a następnie wyświetlić piksel w kolorze tego obiektu.
Nakład obliczeniowy jest rzędu takich algorytmów jak rzędu O(n * p), n – liczba obiektów (ścian) w scenie, p – liczba pikseli.}
Algorytm z precyzją obiektową (malarski)
for ( każda ściana ){Okreslić te fragmenty, które są widoczne i wyświetlić je w kolejności od najdalszych do najbliższych.
Nakład obliczeniowy jest rzędu O(n * n), gdzie n – liczba ścian.}
Rozważmy przypadek, gdy scena zbudowana jest tylko z jednej bryły wypókłej. W takim przypadku ściana bryły albo jest widoczna albo jest nieidoczna, nie ma możliwości aby fragment ściany był widoczny.
(1 rysunek)
Załużmy, że każda ściana jest zorientowana w kierunku przeciwnym do wskazówek zegara. Wystarczy badać kąt jaki tworzy wektor normalny n ściany z wektorem określającym kierunek patrzenia.
W przypadku rzutu równoległego jest to kierunek rzutu, w przypadku rzutu perspektywicznego może to być wektor o początku w punkcie obserwacji E i końcu w dowolnym punkcie ściany.
Mając kąt pomiędzy wektorami k ,n wyznaczymy z iloczynu skalarnego
k∗n=∣k∣∗∣n∣∗cos kąt pomiędzy wektorami k ,n
(1 rysunek)
Zauważmy jednak, że dla kątów a∈−90o,90o ściana odwrócona jest tyłem, czyli jest niewidoczna, natomiast dla pozostałych kątów ściana jest odwrócona przodem, czyli jest widoczna, ponieważ znak iloczynu skalarnego zależy od znaku cos(a) oraz cos(a) > 0 dla a∈−90o,90o , więc aby okreslić widoczność ściany wystarczy badać znak iloczynu skalarnego k∗n=∣k∣∗∣n∣∗cos kąt pomiędzy wektorami k ,n , jesli jest większy od 0 to ściana
jest niewidoczna.