22
Grafika komputerowa Wykłady M.Badura semestr: zimowy 2005/2006

Grafika komputerowa - Kolos Wikikolos.math.uni.lodz.pl/~archive/Grafika komputerowa/Wyklad wersja 3... · Wyklad 2 – Algorytmy wyświetlania Algorytmy konwersji odcinka Powstanie

  • Upload
    lyanh

  • View
    220

  • Download
    0

Embed Size (px)

Citation preview

Grafika komputerowaWykłady M.Badura

semestr: zimowy 2005/2006

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.1­6.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  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)Z­obcinanie

Z­obcinanie 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ć Z­obcinanie. 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   Z­obcinanie   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ą (Z­buffor)

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.