Podstaw programowania gier 3D Podstaw atematki. Podstaw matematcne programowania grafiki 3D Analię agadnień dotcącch grafiki komputerowej acniem od elementów matematki niebędnch do roumienia omawianch tematów. To matematka daje podstaw do opisu trójwmiarowego świata gier, obiektów wstępującch w tworonch światach ora relacje w nich achodące. W grafice komputerowej użwa się wielu mechanimów matematcnch ponanch w skole średniej a także na wkładach algebr. Omówim astosowanie w grafice macier, wektorów, kwaternionów, jak roumieć układ współrędnch, jak posługiwać się układami współrędnch do identfikowania obiektów w świecie, ora relacji międ nimi. Ze wględu na skomplikowanie omawianch agadnień, niektóre temat omówim pobieżnie, scegółowe wjaśnienie danego agadnienia umieściliśm pr konkretnm astosowaniu.. Wektor (Vectors W grafice trójwmiarowej wektor posiadają wiele astosowań: od predstawiania kierunków po repreentacje punktów w prestreni. Wektor, jakich będiem użwać, składają się trech składowch: [ X Y Z ] się wektorami cterema składowmi [ X Y Z W ]. ożna też spotkać. Ponieważ do operacji w układie współrędnch (prestreni trójwmiarowej wstarcą nam tr składowe, dlatego W będie się równać. ożna w tm momencie adać ptanie, dlacego W ogóle ostało wspomniane o wektorach trójwmiarowch a wektorach cterowmiarowch. Jest to pewna niekonsekwencja towarsąca grafice od dłużsego casu. Tak jak wspominaliśm, wstarcą tlko tr komponent do więksości operacji, dopiero umiejscowienie wektora w tw. układie jednorodnm wmaga użcia współrędnej W. Użcie atem trójwmiarowch wektorów albo cterowmiarowch jest poostawione programiście. prjmiem, że nase wektor są trójwmiarowe, mając w pamięci, że mogą się stać cterowmiarowe pre dodanie składowej W. Łukas igas, http://www.lettique.com
Podstaw programowania gier 3D Podstaw atematki Oto lista operacji na wektorach, które będą nam potrebne: - Dodawanie wektorów (Vector Addition. Prkładow kod najduje się na listingu. CVector operator+ ( CVector& v, CVector& u return CVector( v.m_fx + u.m_fx, v.m_fy + u.m_fy, v.m_fz + u.m_fz ; Listing CVector::operator+, Źródło własne - Odejmowanie wektorów (Vector Subtraction. Prkładow kod najduje się na listingu 2. CVector operator- (CVector& v, CVector& u return CVector( v.m_fx-u.m_fx, v.m_fy-u.m_fy, v.m_fz-u.m_fz ; Listing 2 CVector::operator-, Źródło własne - Ilocn wektorow (Cross product. Prkładow kod najduje się na listingu 3. CVector veccross(cvector &v, CVector &u CVector vectmp; vectmp.m_fx v.m_fy*u.m_fz - v.m_fz*u.m_fy; vectmp.m_fy v.m_fz*u.m_fx - v.m_fx*u.m_fz; vectmp.m_fz v.m_fx*u.m_fy - v.m_fy*u.m_fx; return vectmp; Listing 3 veccross, Źródło własne - Ilocn skalarn (Dot product. Prkładow kod najduje się na listingu 4. float vecdot(cvector &v, CVector &u return (v.m_fx*u.m_fx + v.m_fy*u.m_fy + v.m_fz*u.m_fz; Listing 4 vecdot, Źródło własne Łukas igas, http://www.lettique.com 2
Podstaw programowania gier 3D Podstaw atematki - Interpolacja liniowa (Linear Interpolation, LERP. Prkładow kod najduje się na listingu 5. CVector veclerp(cvector &v, CVector &u, float ft CVector vectmp; float ftemp.f - ft; vectmp.m_fx ftemp*v.m_fx + ft*u.m_fx; vectmp.m_fy ftemp*v.m_fy + ft*u.m_fy; vectmp.m_fz ftemp*v.m_fz + ft*u.m_fz; return vectmp; Listing 5 veclerp, Źródło własne - Oblicanie długości wektora (Vector Length. Prkładow kod najduje się na listingu 6. float CVector::Length( return( (floatsqrtf(m_fx*m_fx + m_fy*m_fy + m_fz*m_fz ; Listing 6 CVector::Length, Źródło własne - Normaliacja wektora (Vector Normaliation. Prkładow kod najduje się na listingu 7. void CVector::Normalie( float flen Length(; if ( flen.f return; flen.f / flen; m_fx * flen; m_fy * flen; m_fz * flen; Listing 7 CVector::Normalie, Źródło własne Istotną kwestią jest apiswanie wektorów. Na wielu wkładach matematcnch wektor jest pionow i umiescan a macierą w operacji mnożenia macier pre wektor. W bibliotece D3D wektor jest leżąc poiom. Co a tm idie, kolejność prekstałceń się mienia. nożm wektor pre macier. Łukas igas, http://www.lettique.com 3
Podstaw programowania gier 3D Podstaw atematki.2 aciere (atri/atrices W grafice komputerowej użwa się rożnch rodajów macier. Najbardiej popularne są maciere o wmiarach 44. Dlatego ajmiem się właśnie macierami 44, 2 3 4 2 22 32 42 3 23 33 43 4 24 34 44 aciere dają nam bardo wgodn w użciu sstem do apiswania prekstałceń. Definicja - translacja. Weźm punkt [ X Y Z ] współrędnch. Chcąc presunąć punkt P o wektor T[ X Y Z ] P leżąc w pocątku układu apisujem tę operacje następująco (prjmując, że P, P, P to wektor P, a T, T, T to wektor T: + + + T T T Ta samą operacje można apisać pr pomoc macier. Zatem wkonajm operacje: T T T P P ( ( + + + 2 ( 3 ( + 2 + ( 22 + ( 32 ( + 3 + ( 23 + ( 33 w ( + 4 + ( 24 + ( 34 4 42 43 44 Łukas igas, http://www.lettique.com 4
Podstaw programowania gier 3D Podstaw atematki Jak widać, potrebna tutaj jest współrędna W. Ponieważ W i najcęściej będie będne atem możem je opuścić. ( + ( + + 2 ( 3 ( + + + 2 ( 22 ( 32 ( + + + 3 ( 23 ( 33 4 42 43 Zatem:,,,,,,,, 2 3 2 33, nastę pnie: 4 T, 42 T, T 43. 22 32 3 23 Stąd: + T + + Ostatecnie dosliśm do apisu wjściowego. Prkładow kod implementując m acier presunięcia najduje się na listingu 8. T T void Catri::Setove(float, float, float LoadIdentit(; matri[3][]; matri[3][]; matri[3][2]; Listing 8 Catri::Setove, Źródło własne Prkładowe astosowanie może bć następujące: Definicja T T T [ ] [ ] 2 - skalowanie. Weźm seścian położon w pocątku układu współrędnch, o długości krawędi równej 2. Tera mniejsam seścian o połowę, tak ab długość krawędi bła. Zatem, jeżeli mam wartości skalowania apisane w Łukas igas, http://www.lettique.com 5
Podstaw programowania gier 3D Podstaw atematki wektore S ( gdie.5 (prjmując że aktualnie prekstałcan punkt ma współrędne P, P, P a wartości skalowania to S, S, S, to: S S S A tera to samo apisujem macierą: S S S Zatem: P P Następnie oblicając: ( + + ( 2 + ( 3 ( + 2 + ( 22 + ( 32 ( + 3 + ( 23 + ( 33 4 42 43 Podstawiając wartości macier dostajem: S + S + S + cli apis, od którego acęliśm. Łukas igas, http://www.lettique.com 6
Podstaw programowania gier 3D Podstaw atematki Prkład: [ ] [ ] S S S Prkładowa implementacja skalowania najduje się na listingu 9. void Catri::SetScale(float,float,float LoadIdentit(; matri[][]; matri[][]; matri[2][2]; Listing 9 Catri::SetScale, Źródło własne Definicja 3 - obrot. Ponieważ obrot nie są tak łatwe do wobrażenia, jak presuwanie c skalowanie, atem wor podane będiem musieli na raie prjąć jako pewniki. Każd nich ostanie w rodiale poświęconm importowaniu geometrii/animacji scegółowo omówion. Definicja 4 - obrót wględem osi X. Oto wór obracając punkt o adan kąt jako parametr: θ cosθ sin + θ sin θ cos A oto macier repreentująca prekstałcenie obrotu wględem osi X: cos sin sin cos θ θ θ θ Prkład: [ ] [ ] cos sin sin cos θ θ θ θ Łukas igas, http://www.lettique.com 7
Podstaw programowania gier 3D Podstaw atematki Dowód, że pierws apis jest taki sam jak apis P P, gdie P to punkt prekstałcan P, P, P, będie analogicne do dwóch poprednich cęści poświęconch presunięciu i skalowaniu. Prkładow kod implementując obrót wględem osi X najduje się na listingu. void Catri::SetRotateX(float rad float cosa(floatcos(rad; float sina(floatsin(rad; LoadIdentit(; matri[][]cosa; matri[2][2]cosa; matri[][2]sina; matri[2][]-sina; Listing Catri::SetRotateX, Źródło własne jako parametr: Definicja 5 - obrót wględem osi Y. Oto wór obracając punkt o adan kąt cosθ + sinθ sinθ + cosθ ora jego repreentacja macierowa: cos θ sin θ sin θ cos θ Prkład: [ ] [ ] cosθ sinθ sinθ cosθ Łukas igas, http://www.lettique.com 8
Podstaw programowania gier 3D Podstaw atematki Implementacja prkładowa obrotu wględem osi Y najduje się na listingu. void Catri::SetRotateY(float rad float cosa(floatcos(rad; float sina(floatsin(rad; LoadIdentit(; matri[][]cosa; matri[2][2]cosa; matri[2][]sina; matri[][2]-sina; Listing Catri::SetRotateY, Źródło własne o adan kąt: Definicja 6 - obrót wględem osi Z. Ten wór obraca punkt wględem osi Z repreentacja macierowa: cosθ sin θ sin θ + cosθ Prkład: cos θ sin θ sin θ cos θ [ ] [ ] cosθ sinθ sinθ cosθ Prkładow kod implementując obrót wględem osi Z najduje się na listingu 2. void Catri::SetRotateZ(float rad float cosa(floatcos(rad; float sina(floatsin(rad; LoadIdentit(; matri[][]cosa; matri[][]cosa; matri[][]sina; matri[][]-sina; Listing 2 Catri::SetRotateZ, Źródło własne Łukas igas, http://www.lettique.com 9
Podstaw programowania gier 3D Podstaw atematki Omówiliśm podstawowe operacje, które można apisać pr pomoc macier. Prjmijm tera, że chcem mniejsć obiekt o [.5.5.5] wględem osi Z, a potem presunąć o wektor [.. ], obrócić o 8 stopni.. Pr astosowaniu wkłch worów uskalibśm całkiem duża licba prekstałceń. Pr prekstałcaniu punkt, pr użciu repreentacji macierowej presunięcia, obrotu c skalowania mielibśm te dużą ilość operacji. Ale jest jesce inna możliwość. Składanie prekstałceń. am następujące operacje: - T macier presunięcia, - R macier obrotu, - S macier skalowania, - P punkt do prekstałcenia. ożem łożć maciere prekstałceń w jedna macier mnożąc kolejno maciere repreentujące prekstałcenia: W S R T Po pomnożeniu punktu P pre macier W dostaniem dokładnie ten sam wnik, jakbśm punkt P najpierw pomnożli pre macier S, potem wnik pre macier R, a potem wnik obu prekstałceń pre macier T. Tera dla każdego obiektu możem prgotować jedną macier, która będie repreentować wsstkie prekstałcenia. Pamiętać należ o tm, że mnożenie macier nie jest premienne. Ilocn A i B nie równa się ilocnowi B i A. Użwając wektorów poiomch składanie macier powinno się acnać od pierwsej operacji do ostatniej. Zatem jeżeli: W S R T Tak więc najpierw wkona się skalo wanie S, potem obrót R a na końcu presunięcie T..3 Kwaternion (Quaternions Kwaternion w apisie są podobne do wektorów. Służą one do apiswania obrotu. [ ] Repreentują oś obrotu i kąt obrotu wokół osi. Zapis [ ] α ] onaca: to oś obrotu, a α to kąt obrotu. Rotację maciero wą wględem trech osi można apisać jako kwaternion i odwrotnie: rotacje apisana pr pomoc kwaternionu możem apisać jako macier. Wiele programów do edcji i animowania obiektów prestrennch użwa kwaternionów do apisu obrotów. wbraliśm repreentacje Łukas igas, http://www.lettique.com
Podstaw programowania gier 3D Podstaw atematki macierową ponieważ interpolacja obrotów pred apisaniem ich w macier jest prostsa do implementacji i roumienia niż interpolacja kwaternionów..4 Układ współrędnch W grafice komputerowej wróżnia się dwa rodaje układów współrędnch: - Lewoskrętn układ współrędnch (Left-handed Cartesian Coordinates któr predstawion jest na rsunku. - Prawoskrętn układ współrędnch (Right-handed Cartesian Coordinates któr predstawion jest na rsunku 2. Rsunek - Left-handed, Rsunek 2 - Right-handed, W więksości sstemów graficnch użwa się lewoskrętnego układu. Cli oś Z jest skierowana od obserwatora. Biblioteka D3D, którą będiem się ajmować w kolejnch rodiałach prac, użwa domślnie lewoskrętnego układu. W grafice każd obiekt ma swój własn układ współrędnch. Zawcaj umiescon jest w jego pocątku co predstawia ilustracja. Łukas igas, http://www.lettique.com
Podstaw programowania gier 3D Podstaw atematki Ilustracja - Obiekt w pocątku układu współrędnch, Źródło własne Obiekt awse obracan jest wględem pocątku układu współrędnch w którm się aktualnie najduje. Prkład obrotu najduje się na ilustracji 2. Ilustracja 2 - Obiekt w pocątku układu współrędnch po obrocie, Źródło własne Ropatrm tera prpadek kied obiekt nie najduje się w pocątku układu współrędnch co predstawia ilustracja 3. Łukas igas, http://www.lettique.com 2
Podstaw programowania gier 3D Podstaw atematki Ilustracja 3 - Obiekt presunięt wględem środka układu współrędnch, Źródło własne Stuacje po obrocie predstawia ilustracja 4. Ilustracja 4 - Obiekt obrócon wględem środka układu współrędnch, Źródło własne Kied budujem świat 3D, każd obiekt jest w pocątku swojego układu współrędnch. Ale kied umiejscowim obiekt w konkretnej prestreni to wted najdują się one w układie współrędnm tej prestreni. Dalej prestreń wra obiektami, źródłami światła, kamerami będiem nawać światem. Prkład świata predstawia ilustracja 5. Łukas igas, http://www.lettique.com 3
Podstaw programowania gier 3D Podstaw atematki Ilustracja 5 - Świat: obiekt, kamera, światło w jednm układie współrędnch, Źródło własne Ilustracja 6 Świat punktu widenia kamer, Źródło własne Łukas igas, http://www.lettique.com 4
Podstaw programowania gier 3D Podstaw atematki Następnm ważnm układem współrędnch jest układ kamer. Kamera repreentuje wida któr patr na nas świat. Pocja kamer to pocja wida. To co widi kamera anacona ielonm kolorem na ilustracji 5 widać na ilustracji 6..5 Kamera W układie współrędnch kamer, kamera obserwator, stoi dokładnie w pocątku układu współrędnch cli w punkcie (,,. Rsunek 3 predstawia układ współrędnch kamer ora ostrosłup widenia. Rsunek 3 Kamera i ostrosłup widenia, Źródło: DirectX9 SDK Kamera widi wsstko co jest awarte w ostrosłupie widenia (Viewing Frustum. Rsunek 4 predstawia kamerę ora opisuje ostrosłup widenia. Rsunek 5 opisuje matematcnie ostrosłup widenia. Łukas igas, http://www.lettique.com 5
Podstaw programowania gier 3D Podstaw atematki Rsunek 4 Kamera i ostrosłup widenia, Źródło: DirectX9 SDK Rsunek 5 atematcn opis ostrosłupa widenia, Źródło DirectX SDK Definiując kamerę podaje się także opróc pocji takie parametr jak: - aspekt, cli stosunek wsokości kamer do serokości (np. dla 6448 będie to 48/64 cli.75, - pole widenia (ang. Field of view FOV, kąt, któr widi kamera, - bliska płascna obcinania (Near clipping plane albo Front clipping plane odległość od kamer po której następuje obcięcie geometrii, Łukas igas, http://www.lettique.com 6
Podstaw programowania gier 3D Podstaw atematki - daleka płascna obcinania (Far clipping plane albo Back clipping plane odległość od kamer pred która następuje obcięcie geometrii. Definiowanie ostrosłupa widenia jest odworowaniem recwistości. Cłowiek nie widi wsstkiego, co się dieje dookoła niego. Zawcaj jest to jakaś cęść horontu np. ogranicona kątem 5 stopni. Definiowanie płascn obcinania ma na celu ustalenie dokładności obliceń wiąanch odległością obiektu od kamer. ała odległość międ płascnami obcinania to duża dokładność. Duża odległość równa się małej dokładności. Dokładniej ten aspekt omówim sobie dalej, analiując algortm najdowania widocnch powierchni..6 Prechodenie międ układami współrędnch Omówiliśm więc układ obiektu, układ świata i układ kamer, a tera powiem jak wsstkie układ raem e sobą współpracują. Jeżeli mam obiekt, któr w jego własnm układie np. w punkcie (,,, a chcem, ab w układie świata najdował się np. w punkcie (-,, i bł obrócon o 8 stopni, to musim sobie budować maciere: [ ] - T presunięcie o, - R obrót o 8 stopni, składam prekstałcenia: W R T najpierw jest obrót a potem presunięcie, inacej obiekt obróciłb się wględem innego punktu, tak jak bło pokaane na ilustracjach wceśniej. acier W prenosi nam obiekt do układu świata. To samo robim kamerą, światłami itd. Tera, kied chcem ab prenieść układ świata do układu kamer, musim odwrócić macier kamer. Zatem macier W musim pomnożć pre macier kamer K tle, że odwróconą: W W K.Invert ( acier W prenosi obiekt układu obiektu do układu kamer. Łukas igas, http://www.lettique.com 7
Podstaw programowania gier 3D Podstaw atematki.7 Układ współrędnch ekranu i układ współrędnch jednorodnch Układ współrędnch ekranu. Ponieważ monitor potrafi wświetlać tlko obra dwuwmiarow, musim nas świat rutować na płaski ekran: Rsunek 6 - Ekran monitora i okno wświetlania, Żródło DirectX SDK Jak widać na rsunku 6 któr predstawia ekran monitora (Displa Screen, miejsce w którm chcem wświetlić nas obra jest definiowane pre prostokąt (Bounding Rectangle opisane pre lew górn punkt (left top i praw doln (right bottom. W bibliotece D3D struktura definiująca obsar wświetlania nawa się Viewport. Układ współrędnch jednorodnch. Casem może się darć, że obiekt wjdie po a ostrosłup widenia. Wted musim dokonać obcięcia obiektu tak, ab mieścił się on w ostrosłupie. Biblioteki graficne awcaj użwają do tego celu układu współrędnch jednorodnch. Operacja polega na prekstałceniu ostrosłupa widenia do prostopadłościanu serokiego od do i wsokiego od do ora głębokiego na. W takim układie można prosto sprawdić, c któraś współrędna wsła poa seścian. Rsunek 7 predstawia prekstałcenie ostrosłupa widenia to układu współrędnch jednorodnch. Łukas igas, http://www.lettique.com 8
Podstaw programowania gier 3D Podstaw atematki Rsunek 7 - Ostrosłup widenia a układ współrędnch jednorodnch, Żródło DirectX SDK Wór macier repreentującej te prekstałcenie ma postać: w h Q QZ n Gdie: w ctg fov w 2 h ctg fov h 2 Q Z f Z f Z n w Z Z 2 2 n n h Vw V h Ora: - FOVw kąt widenia w poiomie, - FOVh kąt widenia w pionie, - Zf daleka płascna obcinania, - Zn bliska płascna obcinania, - Vw serokość widenia kamer (np. 64, - Vh wsokość widenia kamer (np. 48. Łukas igas, http://www.lettique.com 9