Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Triki najlepszych
programistw gier 3D.
Vademecum profesjonalisty
Autor: Andre LaMothe
Tumaczenie: Adam Bochenek (wstp, rozdz. 1 3),
Jarosaw Dobrzaski (rozdz. 6 9), Sawomir
Dzieniszewski (rozdz. 14 16, dod. A F)
ISBN: 83-7361-267-X
Tytu oryginau: Tricks of the 3D Game Programming Gurus
Format: B5, stron: 1312
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
O autorze:
Andre LaMothe to autor uznanych przez rynek ksiek o programowaniu gier i grafiki
trjwymiarowej. Cig jego sukcesw wydawniczych zapocztkowao pierwsze wydanie
tej ksiki (ustanowio ono swego czasu standardy programowania gier dla systemu
DOS). Andre LaMothe programuje od ponad 25 lat i oprcz niewtpliwej praktyki
posiada stosowne wyksztacenie z zakresu matematyki, informatyki i elektrotechniki.
Znany jest rwnie jako zaoyciel firm Xtreme Games LCC, Nurve Networks i XGDC.
5RKUVTGEK
Wprowadzenie .......................................................................................................................27
Elementy gier 2D/3D .............................................................................................................29
Oglne wskazwki dotyczce programowania gier ..............................................................33
Narzdzia ...............................................................................................................................36
Edytor poziomw 3D.......................................................................................................39
Przygotowanie kompilatora.............................................................................................40
Przykadowa gra 3D: Raiders 3D ..........................................................................................43
Ptla obsugi zdarze .......................................................................................................62
Logika gry 3D..................................................................................................................62
Rzutowanie 3D ................................................................................................................64
Gwiezdne to....................................................................................................................66
Dziao laserowe i wykrywanie kolizji .............................................................................66
Eksplozja .........................................................................................................................66
Zasady gry .......................................................................................................................67
Podsumowanie .......................................................................................................................67
!! "#
$
Model programowania Win32 ...............................................................................................69
Programowanie w Windows absolutne minimum ............................................................70
Wszystko zaczyna si od WinMain() ..............................................................................70
Wzorcowa aplikacja Windows ..............................................................................................75
Klasa okna .......................................................................................................................76
Rejestracja klasy okna .....................................................................................................80
Tworzenie okna ...............................................................................................................80
Obsuga zdarze ..............................................................................................................82
Ptla obsugi komunikatw .............................................................................................87
Ptla obsugi komunikatw pracujca w czasie rzeczywistym .......................................90
DirectX i COM w piguce......................................................................................................91
HEL i HAL ......................................................................................................................93
Komponenty DirectX ......................................................................................................94
Wprowadzenie do COM ........................................................................................................95
Co to jest obiekt COM? ...................................................................................................96
Tworzenie i uywanie interfejsw COM biblioteki DirectX ..........................................98
Dostp do interfejsw......................................................................................................98
Podsumowanie .....................................................................................................................100
%!"&'&!
(
Zaoenia interfejsu abstrakcyjnego komputera ..................................................................101
Budujemy abstrakcyjny komputer .......................................................................................103
System video, bufor ramki.............................................................................................103
Praca z kolorami ............................................................................................................106
Kopiowanie bufora ........................................................................................................108
Kompletny system graficzny abstrakcyjnego komputera..............................................110
Dwik, muzyka, urzdzenia wejcia............................................................................110
Konsola do gier T3DLIB .....................................................................................................111
Podstawowa konsola do gier .........................................................................................111
Biblioteka T3DLIB ..............................................................................................................116
Architektura moduu graficznego..................................................................................117
Podstawowe definicje ....................................................................................................117
Makra.............................................................................................................................119
Typy danych, struktury..................................................................................................119
Funkcje ..........................................................................................................................122
Globalna dominacja.......................................................................................................125
Interfejs DirectDraw ......................................................................................................126
Funkcje operujce na figurach 2D.................................................................................130
Funkcje matematyczne i obsuga bdw......................................................................136
Mapy bitowe ..................................................................................................................138
Obsuga palety w trybie 8-bitowym ..............................................................................142
Funkcje pomocnicze ......................................................................................................145
Obiekty BOB .................................................................................................................146
T3DLIB2 modu obsugi urzdze wejcia ....................................................................154
T3DLIB3 biblioteka obsugi dwiku i muzyki .............................................................159
Definicje ........................................................................................................................160
Typy...............................................................................................................................160
Zmienne globalne ..........................................................................................................161
DirectSound API............................................................................................................161
DirectMusic API............................................................................................................166
Ostateczna posta konsoli T3D............................................................................................168
Przypisanie funkcji graficznych abstrakcyjnemu modelowi .........................................168
Konsola T3DLIB ...........................................................................................................171
Przykadowe aplikacje .........................................................................................................179
Aplikacje okienkowe .....................................................................................................179
Aplikacje penoekranowe ..............................................................................................180
Dwik i muzyka ...........................................................................................................181
Klawiatura, myszka, joystick.........................................................................................181
Podsumowanie .....................................................................................................................184
!"
! #$
)
-
Notacje matematyczne .........................................................................................................187
Dwuwymiarowe ukady wsprzdnych..............................................................................188
Dwuwymiarowy ukad wsprzdnych kartezjaskich .................................................189
Dwuwymiarowy ukad wsprzdnych biegunowych...................................................190
Trjwymiarowe ukady wsprzdnych...............................................................................193
Trjwymiarowe wsprzdne kartezjaskie ..................................................................193
Trjwymiarowe wsprzdne cylindryczne.........................................................................196
Konwersja trjwymiarowych wsprzdnych kartezjaskich
do wsprzdnych cylindrycznych..............................................................................196
Spis treci
.
-
Modu matematyczny przegld.......................................................................................282
Struktura plikw moduu matematycznego...................................................................282
Konwencja nazewnicza .................................................................................................282
Spis treci
$
1!
Filozofia silnika 3D .............................................................................................................377
Struktura silnika gry 3D.......................................................................................................378
Silnik 3D........................................................................................................................378
Silnik gry .......................................................................................................................379
System sterowania gr i gry sieciowej ..........................................................................379
System animacji.............................................................................................................379
Wykrywanie kolizji i system nawigacji.........................................................................384
Modu fizyki ..................................................................................................................384
System sztucznej inteligencji.........................................................................................386
Baza modeli 3D i grafiki ...............................................................................................387
Ukady wsprzdnych trjwymiarowych ...........................................................................388
Wsprzdne modelu (lokalne)......................................................................................389
Wsprzdne wiata gry.................................................................................................392
Wsprzdne kamery .....................................................................................................396
Ostateczna reprezentacja wiata 3D za pomoc wsprzdnych kamery......................404
Usuwanie ukrytych obiektw (powierzchni) i przycinanie...........................................405
Wsprzdne perspektywy.............................................................................................411
Zakoczenie potoku wsprzdne ekranowe............................................................422
Podstawowe struktury danych 3D .......................................................................................430
Reprezentacje danych opisujcych wielokty w grafice 3D .........................................431
Definiowanie wieloktw..............................................................................................433
Definiowanie obiektw..................................................................................................439
Reprezentowanie wiatw .............................................................................................443
Narzdzia 3D .......................................................................................................................443
Animacja i dane o ruchu................................................................................................445
adowanie danych ze rde zewntrznych ........................................................................446
Pliki PLG .......................................................................................................................446
Pliki NFF .......................................................................................................................449
Pliki 3D Studio ..............................................................................................................452
Pliki COB firmy Caligari...............................................................................................459
Pliki .X Microsoft DirectX ............................................................................................461
Formaty plikw 3D podsumowanie .........................................................................461
Proste przeksztacenia i animacja ........................................................................................462
Przesunicie w przestrzeni.............................................................................................462
Obrt w przestrzeni .......................................................................................................463
Zmiana ksztatu..............................................................................................................465
Podsumowanie potoku 3D ...................................................................................................466
Typy silnikw 3D ................................................................................................................467
Silniki przestrzeni kosmicznej.......................................................................................468
Silniki terenu..................................................................................................................468
Silniki pomieszcze zamknitych .................................................................................470
Ray casting i silniki wokselowe ....................................................................................471
Silniki hybrydowe..........................................................................................................472
Integracja caoci w ostateczn posta silnika .....................................................................472
Podsumowanie .....................................................................................................................473
).
Oglna architektura silnika szkieletowego ..........................................................................475
Struktury danych i potok 3D .........................................................................................476
Gwna lista wieloktw ...............................................................................................479
Nowe moduy programowe ...........................................................................................482
Piszemy program adujcy pliki 3D.....................................................................................482
Program adujcy pliki PLG (PLX)...............................................................................485
10
.$
Proste modele owietlenia w grafice komputerowej ...........................................................564
Modele kolorw i materiay ..........................................................................................566
Typy wiate ..................................................................................................................574
Owietlanie i rasteryzacja trjktw....................................................................................582
Przygotowania do implementacji owietlenia ...............................................................586
Definiowanie materiaw ..............................................................................................587
Definiowanie wiate .....................................................................................................591
Cieniowanie w praktyce.......................................................................................................596
Cieniowanie w trybie 16-bitowym ................................................................................596
Cieniowanie w trybie 8-bitowym ..................................................................................597
Sprawny model RGB w trybach 8-bitowych.................................................................597
Model z uproszczonym nateniem dla trybw 8-bitowych .........................................601
Cieniowanie jednorodne ................................................................................................605
Cieniowanie paskie.......................................................................................................607
Cieniowanie paskie w trybie 8-bitowym......................................................................622
Wstp do cieniowania Gourauda...................................................................................624
Wstp do cieniowania Phonga.......................................................................................626
Sortowanie wzgldem gbokoci i algorytm malarza ........................................................627
Praca z nowymi formatami plikw ......................................................................................632
Klasa parsera..................................................................................................................632
Interpretacja funkcji pomocniczych ..............................................................................635
Format ASCII programu 3D Studio Max (.ASC)..........................................................638
Format ASCII programu trueSpace (.COB) ..................................................................641
Przegld formatu binarnego .MD2 z gry Quake II........................................................650
Przegld narzdzi do modelowania 3D ...............................................................................651
Podsumowanie .....................................................................................................................654
Spis treci
11
$..
Nowe funkcje silnika T3D ...................................................................................................655
Ulepszanie struktur danych i budowy silnika T3D..............................................................657
Nowe definicje...............................................................................................................657
Nowe struktury matematyczne ......................................................................................660
Makra pomocnicze ........................................................................................................661
Dodatkowe elementy umoliwiajce reprezentacj danych siatki 3D ..........................662
Aktualizacja struktur obiektw i listy renderowania.....................................................668
Przegld funkcji i prototypw .......................................................................................672
Nowe wersje procedur adujcych obiekty ..........................................................................680
Aktualizacja starego dobrego czytnika .PLG (.PLX) ....................................................680
Aktualizacja czytnika formatu .ASC z 3D Studio Max.................................................691
Aktualizacja czytnika .COB firmy Caligari ..................................................................692
Powtrka z rasteryzacji wieloktw ....................................................................................697
Rasteryzacja trjkta......................................................................................................697
Konwencja wypeniania ................................................................................................702
Przycinanie ....................................................................................................................704
Nowe funkcje krelce trjkty .....................................................................................706
Zabiegi optymalizacyjne................................................................................................710
Implementacja cieniowania Gourauda.................................................................................712
Cieniowanie Gourauda bez owietlenia ........................................................................713
Uzupenianie procedury cieniowania Gourauda o owietlanie wierzchokw..............723
Podstawy teorii prbkowania...............................................................................................732
Prbkowanie w jednym wymiarze ................................................................................733
Interpolacja dwuliniowa ................................................................................................735
Interpolacja u i v ............................................................................................................737
Implementacja afinicznego mapowania tekstur ............................................................739
Uwzgldnienie tekstur w module owietlenia i rasteryzacji................................................742
Dodawanie owietlenia do funkcji renderujcej tekstury w trybie 16-bitowym ...........742
Podsumowanie strategii optymalizacyjnych dla trybw 8- i 16-bitowych..........................748
Tabele wyszukiwania ....................................................................................................748
Spjno wierzchokw siatki .......................................................................................749
Buforowanie ..................................................................................................................749
Instrukcje SIMD ............................................................................................................749
Programy demonstracyjne ...................................................................................................750
Raiders 3D II .................................................................................................................751
Podsumowanie .....................................................................................................................754
(
&" "
..
Przycinanie scen 3D wprowadzenie ...............................................................................755
Przycinanie w przestrzeni obiektu.................................................................................755
Przycinanie w obszarze obrazu sceny ...........................................................................759
Omwienie algorytmw przycinania...................................................................................760
Przycinanie podstawy ...............................................................................................761
Algorytm Cohena-Sutherlanda ......................................................................................766
Algorytm Cyrusa-Becka (Lianga-Barskiego)................................................................768
Algorytm Weilera-Athertona.........................................................................................771
Przycinanie dodatkowe rda informacji ................................................................774
Przycinanie do ostrosupa widzenia przykad implementacji.........................................775
Potok przeksztace geometrycznych i nowe struktury danych....................................776
Dodawanie przycinania do silnika graficznego.............................................................777
Zabawa w terenie .................................................................................................................799
Funkcja generowania terenu..........................................................................................800
Generowanie mapy wysokoci ......................................................................................809
Rajd azikiem terenowym..............................................................................................810
Podsumowanie .....................................................................................................................814
12
51 0 2""26 "3
-.
Bufory odlegoci i identyfikowanie widocznych powierzchni wprowadzenie .............815
Bufor Z.................................................................................................................................818
Trudnoci implementacji bufora Z ................................................................................820
Przykad buforowania odlegoci ..................................................................................820
Obliczanie wartoci Z piksela z rwnania paszczyzny ................................................822
Interpolacja wsprzdnej Z ..........................................................................................824
Problemy buforowania Z i buforowanie odwrotnoci Z ...............................................826
Przykadowa interpolacja Z i odwrotnoci Z.................................................................827
Tworzenie systemu z buforem gbokoci...........................................................................830
Dodawanie obsugi bufora Z do funkcji rasteryzacji.....................................................833
Optymalizacje bufora odlegoci .........................................................................................845
Oszczdzanie pamici....................................................................................................846
Rzadsze czyszczenie bufora ..........................................................................................846
Buforowanie mieszane ..................................................................................................848
Bufory odlegoci problemy ...........................................................................................849
Programy demonstrujce dziaanie buforw Z ....................................................................849
Program 1.: Obrazowanie zawartoci bufora Z .............................................................849
Program 2.: Wodny rajd ................................................................................................851
Podsumowanie .....................................................................................................................857
' (
!)
$*
7 & !
-$
Teksturowanie podejcie drugie .....................................................................................861
Nowe struktury w pliku nagwkowym ........................................................................862
Podstawa funkcji rasteryzacji ..............................................................................................869
Przyjcie formatu staoprzecinkowego..........................................................................870
Nowe funkcje rasteryzacji bez buforowania Z ..............................................................870
Nowe funkcje rasteryzacji z buforowaniem Z...............................................................873
Teksturowanie z cieniowaniem Gourauda...........................................................................875
Przezroczysto i czenie alfa ............................................................................................882
czenie alfa z wykorzystaniem tablic przegldowych ................................................883
Niezalene definiowanie czenia alfa dla poszczeglnych obiektw ..........................895
czenie alfa w module generowania terenu ................................................................901
Teksturowanie z korekt perspektywiczn i buforowanie odwrotnoci Z...........................904
Matematyczne podstawy teksturowania z korekt perspektywiczn ............................905
Dodawanie do rasteryzatorw buforowania odwrotnoci Z..........................................913
Implementacja teksturowania poprawnego perspektywicznie ......................................921
Implementacja teksturowania czciowo poprawnego perspektywicznie.....................925
Aproksymacja kwadratowa w teksturowaniu perspektywicznym.................................931
Optymalizacja teksturowania teksturowanie hybrydowe .........................................936
Dwuliniowe filtrowanie tekstur ...........................................................................................938
Filtrowanie trzyliniowe tekstur i mipmapowanie ................................................................943
Wprowadzenie do analizy Fouriera i efektu aliasingu ..................................................944
Tworzenie szeregu tekstur mipmapowania ...................................................................949
Wybr poziomu teksturowania mip ..............................................................................958
Filtrowanie trzyliniowe..................................................................................................964
Wywietlanie i teksturowanie wieloprzebiegowe................................................................965
Zaawansowane teksturowanie w jednym wywoaniu..........................................................966
Nowy kontekst renderowania ........................................................................................967
Wypenianie struktury kontekstu renderowania ............................................................969
Funkcja zbiorcza rasteryzacji ........................................................................................971
Podsumowanie .....................................................................................................................979
Spis treci
13
&0&&! 20"2"
-
Nowy modu silnika graficznego .........................................................................................981
Podzia przestrzenny i okrelanie widocznoci powierzchni wprowadzenie .................982
Binarny podzia przestrzeni (BSP) ......................................................................................986
Binarny podzia przestrzenny paszczyznami rwnolegymi
do osi ukadu wsprzdnych......................................................................................988
Binarny podzia przestrzenny paszczyznami arbitralnymi...........................................988
Binarny podzia przestrzenny paszczyznami wyznaczanymi
przez paszczyzny wieloktw....................................................................................989
Wywietlanie (odwiedzanie) wzw drzewa BSP .......................................................993
Struktury danych i funkcje obsugujce drzewa BSP....................................................995
Tworzenie drzewa BSP .................................................................................................997
Strategie podziau ........................................................................................................1001
Przegldanie i wywietlanie wzw drzewa BSP ......................................................1010
Wpasowanie drzew BSP do potoku renderowania......................................................1019
Edytor poziomu wykorzystujcy drzewa BSP ............................................................1021
Ograniczenia drzew BSP .............................................................................................1032
Minimalizacja nadmiarowoci odrysowywania z wykorzystaniem drzew BSP .........1033
Wykorzystanie drzew BSP do redukowania sceny .....................................................1035
Wykorzystanie drzew BSP do wykrywania kolizji .....................................................1045
Integracja drzew BSP ze standardowymi funkcjami rasteryzacji ...............................1045
Zbiory powierzchni potencjalnie widocznych ...................................................................1052
Zastosowania zbiorw PVS.........................................................................................1053
Moliwe sposoby kodowania zbiorw potencjalnej widocznoci...............................1055
Wyznaczanie zbiorw PVS .........................................................................................1057
Portale ................................................................................................................................1059
Hierarchie bry otaczajcych i drzewa oktalne ..................................................................1063
Sposb uycia drzewa hierarchii BHV........................................................................1065
Wydajno w czasie rzeczywistym .............................................................................1065
Strategie budowy hierarchii BHV ...............................................................................1067
Implementacja hierarchii BHV....................................................................................1069
Drzewa oktalne ............................................................................................................1076
Eliminowanie powierzchni zasonitych ...........................................................................1078
Bryy zasaniajce........................................................................................................1079
Wybr obiektw zasaniajcych..................................................................................1080
Hybrydowa metoda wyboru obiektw zasaniajcych ................................................1081
Podsumowanie ...................................................................................................................1081
)
8 +2 0 ! &
(-
Nowy modu silnika gry ....................................................................................................1083
Wprowadzenie i plan gry ...................................................................................................1083
Uproszczone zasady fizyki cieni........................................................................................1084
Droga fotonw i wyliczanie intensywnoci wiata ....................................................1085
Symulowanie cieni za pomoc rzutowanych obrazw i billboardw................................1088
Implementowanie rasteryzatorw z obsug przezroczystoci....................................1090
Nowa biblioteka...........................................................................................................1092
Proste cienie.................................................................................................................1094
Skalowanie cieni..........................................................................................................1096
ledzenie pooenia rda wiata..............................................................................1100
Kocowe uwagi na temat tworzenia symulowanych cieni..........................................1105
Tworzenie cieni poprzez rzutowanie na paszczyzn siatki obiektu .................................1105
Wzory przeksztace wektorowych dla potrzeb rzutowania .......................................1106
Optymalizowanie cieni rzutowanych na paszczyzn .................................................1110
14
'
(
"
+
)""! "
##
.
"+ "3&!& !0'
.
Nowy modu silnika gry ....................................................................................................1125
Wprowadzenie do animacji trjwymiarowej .....................................................................1126
Format .MD2 stosowany w grze Quake II.........................................................................1126
Nagwek pliku .MD2 .................................................................................................1129
adowanie plikw .MD2 gry Quake II .......................................................................1138
Animowanie plikw .MD2 ..........................................................................................1147
Proste zasady animacji bez modeli bohaterw ..................................................................1158
Rotacja w ruchu i ruch w wyniku translacji ................................................................1158
Zoone ruchy parametryczne i ruch po krzywej ........................................................1161
Wykorzystywanie skryptw do programowania ruchu ...............................................1162
Wykrywanie kolizji w przestrzeni trjwymiarowej...........................................................1164
Ograniczajce sfery i walce.........................................................................................1165
Wykorzystywanie struktur danych do przypieszania wykrywania kolizji.................1166
Poruszanie si po powierzchni terenu .........................................................................1167
Podsumowanie ...................................................................................................................1168
$
* "3!&0"'!
$
Wprowadzenie do technik optymalizacyjnych ..................................................................1169
Profilowanie kodu za pomoc kompilatora Microsoft Visual C++
i programu VTune Intela ................................................................................................1170
Profilowanie przy pomocy kompilatora Visual C++...................................................1171
Analizowanie danych profilowania .............................................................................1173
Optymalizowanie kodu za pomoc programu VTune.................................................1174
Korzystanie z kompilatora C++ firmy Intel.......................................................................1182
ciganie kompilatora optymalizacyjnego Intela........................................................1182
Korzystanie z kompilatora...........................................................................................1183
Korzystanie z opcji optymalizacyjnych kompilatora ..................................................1184
Rczne wybieranie rnych kompilatorw dla rnych plikw rdowych..............1185
Strategie optymalizacyjne............................................................................................1185
Przykad programowania instrukcji SIMD w mechanizmie SSE ......................................1185
Podstawy architektury SIMD ......................................................................................1187
Jak naprawd wyglda korzystanie z instrukcji SIMD ...............................................1188
Klasa wektorw trjwymiarowych przystosowana do instrukcji SIMD.....................1199
Kilka podstawowych trikw optymalizacyjnych...............................................................1205
Trik 1. Pozbywanie si funkcji _ftol().........................................................................1205
Trik 2. Ustawianie sowa kontrolujcego FPU............................................................1206
Trik 3. Szybkie zerowanie liczb zmiennoprzecinkowych ...........................................1207
Trik 4. Szybkie wyciganie pierwiastkw kwadratowych ..........................................1207
Trik 5. Uproszczone wyliczanie arcustangens ............................................................1207
Spis treci
15
) ###
! 7268949
!5
.
Instalowanie DirectX .........................................................................................................1215
Korzystanie z kompilatora Visual C/C++..........................................................................1216
Kilka praktycznych porad zwizanych z kompilacj.........................................................1216
Trygonometria ...................................................................................................................1219
Wektory .............................................................................................................................1222
Dugo wektora ..........................................................................................................1223
Normalizacja................................................................................................................1223
Mnoenie wektora przez skalar ...................................................................................1223
Dodawanie wektorw ..................................................................................................1224
Odejmowanie wektorw..............................................................................................1225
Iloczyn skalarny wektorw..........................................................................................1225
Iloczyn wektorowy wektorw .....................................................................................1227
Wektor zerowy ............................................................................................................1228
Wektory pozycji ..........................................................................................................1228
Wektory jako liniowe kombinacje wektorw jednostkowych ....................................1229
Czym jzyk C++ rni si od C.........................................................................................1231
Minimum tego co trzeba wiedzie o C++..........................................................................1233
Nowe typy, sowa kluczowe i konwencje..........................................................................1234
Komentarze..................................................................................................................1234
Stae .............................................................................................................................1234
Zmienne referencyjne ..................................................................................................1234
Tworzenie zmiennych w dowolnym miejscu kodu .....................................................1235
Zarzdzanie pamici ........................................................................................................1236
Strumienie wejcia i wyjcia..............................................................................................1236
Klasy ..................................................................................................................................1238
Cakiem nowy typ struktur ..........................................................................................1238
Przykad prostej klasy..................................................................................................1239
Publiczne a prywatne...................................................................................................1240
Funkcje skadowe klasy (metody) ...............................................................................1240
Konstruktory i destruktory...........................................................................................1242
Pisanie konstruktora ....................................................................................................1243
Pisanie destruktora.......................................................................................................1244
Operator ustalania zakresu.................................................................................................1246
Pisanie funkcji skadowych klasy poza zakresem klasy..............................................1246
Przecianie operatorw i funkcji......................................................................................1247
Podstawy korzystania z szablonw....................................................................................1249
Wprowadzenie do obsugi wyjtkw.................................................................................1250
Komponenty skadajce si na obsug wyjtkw ......................................................1251
Podsumowanie ...................................................................................................................1254
16
!=
..
Witryny powicone programowaniu gier i nowinkom programistycznym......................1255
Witryny, z ktrych mona ciga uyteczne materiay i programy .................................1256
Silniki 2D i 3D ...................................................................................................................1256
Ksiki powicone programowaniu gier komputerowych...............................................1257
Strony Microsoftu powicone interfejsowi DirectX ........................................................1257
Grupy dyskusyjne Usenetu ................................................................................................1257
Najnowsze wiadomoci z brany: Blues News .................................................................1258
Magazyny komputerowe powicone projektowaniu gier ................................................1258
Dodatkowe materiay do gry Quake ..................................................................................1258
Darmowe modele i tekstury ...............................................................................................1258
Twrcy witryn powiconych grom komputerowym ........................................................1258
!>
*%0"! ?8//
.
?!
$
Rozdzia 10.
2T\[EKPCPKGUEGP&
Nie bj si, to nie jest groba pod Twoim adresem
Marla, Fight Club
Do dugo udawao si nam unika tematu przycinania scen 3D, przyszed jednak czas na rozwizanie
i tego problemu. Nie da si ju duej omija tematu przycinania. Dlatego w biecym rozdziale omwione zostan podstawy teoretyczne oraz zaprezentowany bdzie praktyczny szkielet moduu przycinania
scen 3D; wskazane zostan te powody, dla ktrych konieczne jest realizowanie przycinania scen oraz
dziaajcy przykad wykorzystania tej techniki. Gwnymi wtkami rozdziau bd:
wprowadzenie do przycinania scen 3D;
podstawy teoretyczne algorytmw przycinania;
implementacja przycinania sceny do ostrosupa widzenia;
zabawa z przycinaniem.
Przycinanie jako jedna z technik przetwarzania sceny w grafice komputerowej wzmiankowane byo w niniejszej ksice ju kilkukrotnie; stosowne omwienia znajduj si rwnie w drugim wydaniu ksiki
Tricks of the Windows Game Programming Gurus. Przycinanie to jedna z najwaniejszych technik grafiki
3D, gdy le przycinane sceny s nie tylko nieprawidowo wywietlane na ekranie, ale rwnie ich rzutowanie w ostrosupie widzenia moe doprowadzi do bdw dzielenia przez zero i niepoprawnych odwoa do pamici. Majc to na uwadze przypomnimy sobie rne techniki przycinania i wskaemy przyczyny ich stosowania.
O przycinaniu w przestrzeni obiektu mwimy wtedy, gdy przycinaniu do wyznaczonego obszaru podlegaj
wsprzdne geometryczne elementw sceny. Obszar przycinania moe by dwu- lub trjwymiarowy
istotne jest to, e przycinanie zachodzi w matematycznej reprezentacji sceny i dotyczy matematycznych
reprezentacji obiektw, trjktw, elementw podstawowych i wszelkich innych czci sceny. Zalet
przycinania w przestrzeni obiektu jest prostota: przy pomocy listy wierzchokw wieloktw tworzcych
scen przycina si ich wsprzdne do wyznaczonego dwu- lub trjwymiarowego obszaru rzutowania. List
przycitych trjktw przekazuje si do nastpnego etapu potoku renderowania.
Wady przycinania w przestrzeni obiektu tkwi, jak zwykle, w szczegach implementacyjnych. W omawianych
w tej ksice mechanizmach obrazowania jako elementy konstrukcyjne wykorzystywane s zawsze trjkty.
Tymczasem w wyniku przycinania, czy to do prostokta rzutu dwuwymiarowego, czy do ostrosupa widzenia, do sceny wprowadzane s wielokty z wicej ni trzema wierzchokami (a wic w wyniku przycinania scena przestaje skada si ju wycznie z trjktw). Tak wic dla kadej paszczyzny przycinania
756
Rzutowanie wierzchokw o wsprzdnej z mniejszej lub rwnej zeru prowadzi do bdw
757
Jeeli mechanizm obrazowania sceny ma sobie radzi z wieloktami o dowolnych rozmiarach i rozmieszczeniu, nie da si w prosty sposb unikn przycinania sceny do bliskiej paszczyzny przycinania (patrz
rysunek 10.2). Najbardziej prymitywnym sposobem uniknicia przycinania jest usuwanie w caoci ze
sceny tych wieloktw, ktrych wierzchoki wystaj poza paszczyzn przycinania, ale wymaga to konstruowania sceny z wieloktw o ograniczonym rozmiarze (patrz rysunek 10.3). Przy tym fragmenty scen
przylegajce do paszczyzn przycinania nie bd waciwie obrazowane.
Zbyt dugie wielokty musz zosta przycite
Niewielkie wielokty mog zosta w caoci usunite bd zaliczone do sceny
758
Warunkiem koniecznym prawidowego obrazowania sceny jest przycinanie wszystkich wieloktw sceny
do bliszej paszczyzny, przy czym uzyskane w wyniku przycicia wielokty mog przesta by trjktami.
Trzeba si wic liczy z koniecznoci ponownego podziau powstaych wieloktw na trjkty i tym
samym przebudowania listy obrazowanych wieloktw. W najgorszym wic przypadku konieczne bdzie
przycicie wszystkich wieloktw do bliskiej paszczyzny przycinania, co sprowadza si do wyliczania
punktw przecicia prostych i paszczyzn. W szczegach problem okazuje si powaniejszy. Wiemy ju
o koniecznoci ponownego podziau sceny na trjkty; dodatkowo naley jeszcze przyci wsprzdne
tekstur, przeliczy dane potrzebne do cieniowania powierzchni i wyliczy nowe wartoci wektorw normalnych wierzchokw wida, e trudnoci jest niemao, ale poradzimy sobie i z nimi.
Z drugiej strony, niebawem okae si, e nie ma potrzeby wykonywania operacji przycinania dla pozostaych
paszczyzn ostrosupa widzenia. Spjrzmy na rysunek 10.4. Okazuje si, e przycinanie wieloktw do
dalekiej paszczyzny przycinania jest zwyk strat czasu. Jaki byby zysk? Praktycznie aden. Co gorsza,
przycinanie to znacznie zwikszyoby czas przetwarzania sceny. Wystarczy wic (zamiast przycina) odrzuca
w caoci te wielokty, ktre znajduj si poza dalek paszczyzn przycinania niezalenie od ich odlegoci od tej paszczyzny. Wielokty, ktre w caoci znajduj si poza t paszczyzn, zostan raczej
usunite z wykorzystaniem sfer otaczajcych ni przycinania.
Nie wszystkie paszczyzny ostrosupa widzenia wymagaj przycinania 3D
Dalej, rwnie przycinanie na paszczyznach tworzcych grn, doln, lew i praw cian ostrosupa
widzenia nie ma sensu. Przycinanie na cianach ostrosupa widzenia zajoby cenny czas, a suyoby tylko
do tego, eby rzut sceny nie wykracza poza obszar dwuwymiarowej paszczyzny widoku sceny. O to
mona za zadba na etapie rasteryzacji, w obszarze bufora ramki ekranu, co jest nieporwnanie szybsze
ni przycinanie w przestrzeni obiektu. Unikajc przycinania na paszczyznach ostrosupa widzenia eliminujemy rwnie ze sceny i potoku renderowania potencjalne dodatkowe wielokty, powstae z podziau
wieloktw na granicach obszaru przycinania.
759
Naturalnie, jeeli Czytelnikowi zaley na elegancji i kompletnoci mechanizmu obrazowania, moe pokusi si o implementacj przycinania dla wszystkich paszczyzn; zostanie to zreszt pokazane w dalszej
czci rozdziau. Gwny nacisk zostanie jednak pooony na nastpujce etapy przycinania i usuwania
wieloktw (patrz rysunek 10.5):
Etapy w potoku
przycinania 3D
Naleaoby jeszcze sprecyzowa, co naley rozumie pod pojciem przycinania w obszarze rzutu ekranu.
Sytuacja wejciowa prezentowana jest na rysunku 10.6: wielokt jest gotowy do odrysowania, ale jego
fragment wystaje poza jedn z prostych wyznaczajcych obszar obrazu sceny. Nie jest to problem, o ile
przycinanie ma nastpi w pionie. Wystarczy rozpocz ptl odrysowywania wielokta od wierzchoka
uzyskanego przez obliczenie punktu przecicia trjkta z obszarem obrazu. Wyliczenie takie to zaledwie
jeden dodatkowy wiersz kodu programu. W przypadku przecicia z lew bd praw krawdzi obrazu
procedura odrysowywania jest nieco inna: przycinane s kolejne linie tworzone w ptli odrysowywania.
Jest to szybsze ni przycinanie kadego wystajcego trjkta do wszystkich czterech paszczyzn ostrosupa widzenia. To ostatnie oznacza bowiem dodanie do sceny potencjalnie wielu nowych wieloktw, a co
za tym idzie, oznacza konieczno wyliczania nowych wsprzdnych teksturowania, przeliczania wektorw normalnych wieloktw i wierzchokw i tak dalej. Tymczasem a nadto obciajce obliczeniowo
jest ju samo przycinanie do bliskiej paszczyzny przycinania.
760
Przycinanie
w obszarze obrazu
sceny, podczas
rysowywania
wieloktw
Z drugiej strony, nie mona dopuci, aby przycinanie w obszarze bufora ramki doprowadzio do utraty jakichkolwiek informacji 3D; bd one jeszcze potrzebne, midzy innymi przy okazji konstruowania bufora Z.
Operacje w obszarze bufora ramki wymagaj ostronoci: gdy dojdzie do interpolacji wartoci wsprzdnych z dla krawdzi wieloktw, konieczne bdzie zachowanie przynajmniej wsprzdnych z wierzchokw. Chodzi o to, e podczas ostatecznej rasteryzacji nie mona bdzie ju realizowa przycinania
wycznie na podstawie wartoci wsprzdnych 2D. Dojdziemy do tego w stosownym czasie.
Przed wkroczeniem w obszar teorii algorytmw przycinania chciabym uprzedzi, e powane nazwy
co niektrych algorytmw niekiedy rozmieszaj, a to dlatego, e kady z nich mona wymyli samemu
wszystkie s po prostu formalizacj tego, co w domu robi kady, kto zajmuje si cho troch algorytmami graficznymi. Nazewnictwo algorytmw jest zreszt nieodcznym problemem grafiki komputerowej: co i raz kto wymyla nowy algorytm i publikuje go; odtd zaczyna on funkcjonowa pod pewn
nazw, niezalenie od innych nazw tego samego algorytmu publikowanego gdzie indziej. Nie zawsze
zreszt nowa nazwa starego algorytmu jest dzieem samego autora publikacji czsto czytelnicy zaczynaj
odwoywa si do nowego algorytmu pod now nazw.
Przycinanie to koncepcja na tyle prosta, e mieszne byoby sdzi, e zostaa odkryta przez jedn konkretn osob. Kady algorytm przycinania jest pewnym wcieleniem zdroworozsdkowego podejcia do
przetwarzania grafiki i opiera si na wyliczaniu punktw przecicia wierzchokw. Algorytmy takie
produkuje si zwykle pod presj pojawiajcych si zada niejednokrotnie wywaa si wtedy otwarte
ju drzwi. Do czego zmierzam? Ot nieco dalej wymienione zostan z nazwy pewne powszechnie przyjte algorytmy przycinania, jednak nie powinnicie na ich podstawie wyrabia sobie pogldu, e s one
jedynymi moliwymi wcieleniami przycinania. Jak Wam zapewne wiadomo, programista niejednokrotnie
spdza cae godziny na rozwizaniu problemu, po czym dowiaduje si, e jego rozwizanie jest bardzo
podobne do ju istniejcych algorytmw. W przypadku algorytmw przycinania byoby prociej, gdyby
ich nazwy byy bardziej opisowe. Istniejce nazwy brzmi przecie jak nazwy kancelarii prawniczych!
761
Wydaje si, e aby algorytm otrzyma nazw, powinien cechowa si pewnym wyrafinowaniem, powodujcym, e opisywana przeze technika nie jest bynajmniej oczywista dla osb rednio tylko zaawansowanych w danej dziedzinie. Zgodnie z takim rozumowaniem uzasadnione jest uhonorowanie wynalazcy
algorytmu drzewa BSP (ang. binary space partitioning) przez nadanie mu jego imienia podzia trjwymiarowej przestrzeni BSP nie jest bowiem algorytmem trywialnym. Kiedy jednak chodzi o przycinanie wielokta do innego wielokta, opracowanie algorytmu wymaga godziny (moe dwch) zastanowienia, spdzonego na kombinowaniu metod przycinania odcinkw, klasyfikacji wierzchokw, kodowania
bitowego czy parametrycznych reprezentacji prostych. I tyle!
Mam zamiar, rzecz jasna, zachci Was do eksperymentw. Co prawda, dziewidziesit
dziewi procent rozwizywanych w ten sposb problemw doczekao si ju rozwizania,
nie oznacza o jednak, e rozwizania te zostay gdziekolwiek opublikowane.
Przycinanie wieloktw sprowadza si do przycinania odcinkw, co z kolei sprowadza si do okrelania,
czy pewne punkty zawieraj si w danym obszarze dwuwymiarowym bd w trjwymiarowej bryle. Ilustracj problemu w jego postaci oglnej jest rysunek 10.7. Ot dany jest zbir odcinkw, tworzcych
wchodzce w skad sceny wielokty, ktre maj zosta pniej poddane rzutowaniu. Naley okreli, czy
elementy te mieszcz si w pewnych zadanych granicach. Da si to sprowadzi do okrelenia, czy w granicach tych mieszcz si pojedyncze punkty charakterystyczne elementw. Innymi sowy, dane trjkty
determinowane s trzema wierzchokami, czonymi trzema odcinkami (krawdziami). Cho to wanie
krawdzie nadaj trjktowi zarys, naprawd wane s jedynie wierzchoki. Std, na najwyszym poziomie oglnoci, problem sprowadza si do sprawdzenia, czy punkt o wsprzdnych (x, y) bd (x, y, z)
znajduje si w zadanym obszarze (bryle), a wic do testu zawierania si punktu.
Test zawierania si
na paszczynie
dwuwymiarowej
762
Dla danego punktu p0(x, y) i prostoktnego obszaru wyznaczanego prostymi xmin, xmax, ymin, ymax
(patrz rysunek 10.7), punkt p0 zawiera si w zadanym obszarze, jeeli spenia nastpujce nierwnoci:
i
Przypadek 1. Zawieranie si punktu w bryle prostopadociennej.
Dla danego punktu p0(x, y, z) i prostopadociennego obszaru wyznaczonego paszczyznami xmin, ymin,
zmin, xmax, ymax, zmax (patrz rysunek 10.8), punkt p0 zawiera si w zadanym obszarze, jeeli spenia
nastpujce nierwnoci:
Testowanie zawierania si punktu w bryle 3D
i
Pojawia si tu wtpliwo, czy warto zawraca sobie gow przycinaniem do bryy prostopadociennej,
jeeli z gry wiadomo, e ostrosup widzenia tak bry nie jest? To prawda, ale wystarczy przypomnie
sobie omwienie rzutowania i dyskutowany przy tej okazji efekt prostowania ostrosupa widzenia wanie do postaci bryy prostopadociennej. W takim przypadku przycinanie sprowadza si do trywialnych
porwna wsprzdnych wierzchokw wieloktw sceny ze wsprzdnymi wierzchokw cian bryy
zawierania. Nikt te nie mwi, e przycinanie realizowane jest wycznie do ostrosupa widzenia
przecie promienie lasera wystrzeliwane w grze warto przyci rwnie do jakiej skoczonej bryy w rozlegym wiecie gry kosmicznej, aby nie przelicza ich pozycji w nieskoczono, gdy dawno opuciy penetrowany ukad planetarny.
763
764
Proste przycinanie
odcinkw
Aby przyci prost (odcinek), wystarczy dokona konwersji jej reprezentacji do postaci parametrycznej i podstawi warto x w punkcie przecicia. Oto sposb rozumowania, ktry prowadzi do takiego wniosku:
W postaci wektorowej pozycja punktu wzdu odcinka to:
!"#
Do sprawdzenia, czy dany odcinek przecina zadan prost pionow, naley podstawi warto x definiujc
t prost (tutaj x = xl) do lewej strony rwnania dla skadowej x, a nastpnie wyliczy z tego rwnania
warto t. Jeeli t naley do przedziau <0, 1>, odcinek przecina zadan prost; dla t spoza tego przedziau
wiadomo, e odcinek nie przecina prostej:
!"#
Std t ma warto:
#
!$
!
Jeeli t ma warto pomidzy 0 a 1, odcinek przecina prost. Naley pamita, e odcinek zdefiniowany
tak, jak w przykadzie, rozciga si pomidzy punktami p0 i p1, przy t zmieniajcym si od 0 do 1. Wartoci t spoza tego zakresu nale co prawda do prostej, nie nale jednak do jej odcinka ograniczanego
punktami p0 i p1. Po wyliczeniu t i stwierdzeniu, e mieci si ona w zakresie od 0 do 1,wystarczy podstawi je do rwnania dla skadowej y:
! "#
765
I otrzymujemy wsprzdne punktu przecicia z danego odcinka z prost pionow x = xl. Wyznaczenie
punktu przecicia z prost poziom jest rwnie proste, tyle, e jako pierwsze rozwizujemy rwnanie dla
skadowej y i uzyskan std warto t podstawiamy do rwnania dla skadowej x. Oto przykad dla prostej
odcicia wyznaczanej wzorem y = yl:
Po podstawieniu yl do odpowiedniego rwnania otrzymujemy:
! "#
Po sprawdzeniu wartoci t otrzymujemy informacj, czy nastpio przecicie danych odcinkw (dla t z zakresu
od 0 do 1). Jeeli tak, podstawiamy otrzyman warto do rwnania skadowej x:
!"#
Niech p0 = (x0, y0, z0) bdzie punktem lecym na paszczynie, a n [nx, ny, nz] wektorem normalnym
tej paszczyzny. Rwnanie paszczyzny przyjmie wtedy posta:
"
! "
!
"
!
766
%!
"#
Pora na wyliczenie punktu przecicia. Ponownie odsyam Was do rozdziau 4., w ktrym zaprezentowano
wzory niezbdne do realizacji obliczenia; objanienie procesu obliczeniowego mona jednak sprowadzi
do stwierdzenia, e wartoci x, y i z prostej parametrycznej podstawiane s do rwnania paszczyzny, po
czym z rwnania tego obliczana jest warto t:
"
! "
!
"
!
Po obliczeniu wartoci t naley podstawi j z powrotem do rwnania prostej w ten sposb wyliczone
zostan odpowiednie wsprzdne punktu przecicia. Jako, e pokazywalimy to ju dla przypadku 2D,
poszczeglne etapy obliczenia zostan tym razem pominite. To ju wszystko na temat przycinania,
sprowadza si on bowiem wanie do umiejtnoci obliczania punktw przecicia prostej z prost i prostej
z paszczyzn. Teraz wiedz t naley wykorzysta w algorytmie, ktry bdzie j efektywnie implementowa. Przejdmy wic do opisu kilku popularnych algorytmw przycinania.
Algorytm Cohena-Sutherlanda to jedna z najpopularniejszych technik przycinania odcinkw do prostoktnych obszarw paskich bd do prostopadociennych bry w przestrzeni trjwymiarowej. Algorytm
dzieli si na dwie fazy.
W fazie klasyfikacji punktw kocowych kady odcinek na paszczynie bd w przestrzeni jest oznaczany
jako lecy wewntrz lub w poza obszarem przycinania; do klasyfikacji wykorzystuje si kodowanie bitowe,
reprezentujce pozycj kadego z punktw kocowych odcinka jako wewntrz (1) lub poza (0) zadanym
obszarem. Schemat kodowania klasyfikujcego dla przypadku 2D ilustrowany jest rysunkiem 10.11.
Kady wierzchoek (x, y) odcinka ograniczonego punktami p0(x0, y0) i p1(x1, y1) wymaga osobnej klasyfikacji. Klasyfikacja punktw kocowych odcinka kodowana jest na czterech (szeciu w przestrzeni
trjwymiarowej) bitach. Kod dla punktu p0 okrela bdziemy symbolem kb0 (analogicznie, dla p1 bdzie
to symbol kb1). Bity reprezentujce poszczeglne obszary klasyfikacji mog by kodowane w dowolny
sposb, dla obszaru prostoktnego ograniczanego punktami (xmin, ymin) i (xmax, ymax) przyjto jednak
kody wymienione w tabeli 10.1.
Kodowanie pooenia wierzchokw odcinkw w algorytmie Cohena-Sutherlanda
Nr bitu
&
767
Schemat kodowania
klasyfikujcego
w algorytmie
Cohena-Sutherlanda
Test 2.
Jeeli (kb > 0), oba punkty kocowe odcinka znajduj si poza jedn wspln krawdzi obszaru przycinania i odcinek mona odrzuci jako w caoci lecy poza tym obszarem (patrz rysunek 10.11).
Jeeli oba dotychczasowe testy nie pozwoliy na przyjcie bd odrzucenie odcinka, naley przyj, e
potencjalnie odcinek ten moe przecina obszar przycinania w dwch punktach i wymaga penego przycinania. Rwnie ten przypadek ilustrowany jest na rysunku 10.11. W takim ukadzie mona postpi na
768
kilka sposobw. Jeden z nich polega na przyciciu odcinka do obu krawdzi przycinania dzielimy w ten
sposb problematyczny odcinek na dwa lub wicej fragmentw i moemy dokona ponownej klasyfikacji
ich punktw kocowych. Do obliczenia punktw przecicia z krawdziami obszaru przycinania mona
zastosowa algorytm typu dziel i rzd, albo nawet posikowa si metod penego przegldu (ang.
brute force). Osobicie zwykem wykorzystywa wycznie faz klasyfikacyjn tego algorytmu; w fazie
przetwarzania, po wykonaniu obu dodatkowych testw, przycicie odcinka mona bowiem zrealizowa
w dowolny sposb.
Kolejny algorytm jest nieco uoglniony i dziaa dla prostych parametrycznych i wypukych (dwu- i trjwymiarowych) obszarw przycinania. Algorytm opiera si na zaoeniu, e najbardziej naturaln reprezentacj
prostej jest reprezentacja parametryczna i do reprezentacji punktw przecicia wykorzystuje, w miejsce
jawnych wartoci wsprzdnych punktu przecicia (x, y) czy (x, y, z), wartoci t. Dziki temu wykrywanie
przeci realizowane jest na podstawie stwierdzenia pokrywania si wartoci t i wielkoci tego pokrycia
(rysunek 10.12).
Ilustracja przycinania algorytmem Cyrusa-Becka (Lianga-Barskiego)
769
Zakadajc, e kada z nierwnoci dana jest w postaci pn t < qn, gdzie n oznacza n-t nierwno (wedug
numeracji wprowadzonej powyej), otrzymujemy nastpujce przypadki:
Przypadek 1. Jeeli (pn = 0), odcinek jest rwnolegy do krawdzi przycinania i nie moe jej
przecina;
Przypadek 2. Jeeli (pn >= 0), odcinek znajduje si wewntrz obszaru przycinania;
Przypadek 3. Jeeli (pn < 0), odcinek znajduje si na zewntrz obszaru przycinania;
Przypadek 4. Jeeli (pn < 0), odcinek rozpoczyna si poza obszarem przycinania i koczy w jego
wntrzu;
Przypadek 5. Jeeli (pn > 0), odcinek rozpoczyna si wewntrz obszaru przycinania i koczy poza nim;
Nieco to skomplikowane, jednak po duszym zastanowieniu si wida, e jedynymi bardziej zajmujcymi przypadkami s przypadki 4. i 5. Tylko w tych przypadkach potrzebne jest faktyczne przycicie odcinka. Dla kadej nierwnoci trzeba wyznaczy t punktu przecicia, pamitajc przy tym, o ktry przypadek (4. czy 5.) chodzi:
"#4
770
Std:
#4$
Obliczenie to realizujemy dla kadej z czterech nierwnoci dla n = 0, 1, 2, 3; wynik kadego z nich
okrelamy jako rn. Tak wic rn jest wartoci t w punkcie przecicia, obliczan na podstawie wyraenia
qn / pn, reprezentujcego jedn z nierwnoci z wzoru numer 10.1.
Na koniec naley dokona klasyfikacji wartoci rn, aby okreli, ktre z tych wartoci oznaczay odcinek
wchodzcy do obszaru przycinania (pn < 0), a ktre odcinek wychodzcy z tego obszaru (pn > 0). Dla
wartoci rn obliczanych dla przypadku (pn < 0) obliczamy warto t1:
#
Dla wartoci rn obliczanych dla przypadku (pn > 0) obliczamy warto t2:
#%
C to oznacza? Jeszcze raz: prbujemy wykona proste testy odrzucenia odcinka; jeeli zawiod, mamy
do czynienia z przypadkiem 4. bd 5. Aby je rozstrzygn, naley obliczy wartoci t przecicia odcinka
z krawdziami obszaru przycinania. Dysponujemy czterema rwnaniami w oglnej postaci pn t < qn,
z ktrych naley obliczy warto t dla wszystkich czterech nierwnoci wymienionych we wzorze 10.1.
Otrzymane wartoci t naley przypisa do symboli rn. Nastpnie wartoci rn poddawane s porzdkowaniu
wedug kryterium wchodzenia bd wychodzenia z obszaru przycinania. Na koniec obliczane s wartoci
t1 i t2, ktre okrelaj punkty przecicia, w ktrych naley uci ten uparty odcinek!
Jeeli (t1 > t2), odcinek prostej znajduje si cakowicie poza obszarem przycinania i mona zakoczy test.
W przeciwnym przypadku konieczne jest przycicie odcinka przez podstawienie wartoci t1 i t2 do parametrycznego rwnania prostej, co zaowocuje obliczeniem wsprzdnych dwch wierzchokw, pp1 i pp2:
%! "#
%
%! "#%
Wyliczone w ten sposb punkty ograniczaj odcinek wewntrz obszaru przycinania. Naley si zgodzi,
e na pierwszy rzut oka algorytm ten jest szalenie skomplikowany, ale jego ledzenie sprawia problem
wycznie ludziom komputery radz sobie z nim znakomicie. Algorytm dziaa doskonale i jest duo
lepszy ni algorytm Cohena-Sutherlanda, a to z racji bazowania na reprezentacji parametrycznej i atwoci
konwersji do przestrzeni trjwymiarowej.
!"
Aby utrwali znajomo algorytmu i upewni si, e zostanie on zapamitany i zrozumiany, sprbujmy
wyliczy prosty przykad. Bdzie si on opiera na konfiguracji prezentowanej na rysunku 10.12, na ktrym gwnie w pierwszym kwadrancie ukadu wsprzdnych widnieje obszar przycinania, nieco
przesunity tak, aby pokrywa rwnie pozostae kwadranty. Konfiguracja przykadu definiuje nastpujce
elementy:
!56
!5 7
!%!7%
5
%! "#
!%
!
!%"#!% %"#
!7
5!
!7"#!7 "#
Std dx wynosi 12, a dy 10. Pora na uruchomienie oblicze dla kadej nierwnoci:
,+!"#
!
+"#
!
-+ "#
!
(.+! "#
!
771
Teraz obliczenia naley rozdzieli na dwa przypadki pierwszy dla (pn < 0); dla tego przypadku obliczamy warto t1:
#
! $7 $8 $8
Dla wartoci t(rn) w przypadku, gdy odcinek skierowany by na zewntrz obszaru (pn > 0), obliczana jest
warto t2:
#%
8$77$88$7
Uff! Teraz trzeba sprawdzi, czy przypadkiem t1 jest wiksze ni t2. Jeeli tak, to odcinek ley w caoci
poza obszarem przycinania. Z samego rysunku wida, e taki przypadek nie mia miejsca, a i wyliczenia
mwi, e t1 jest mniejsze od t2. Trzeba wic jeszcze podstawi obliczone wartoci t1 i t2 do parametrycznych rwna prostej obliczone punkty wyznaczaj now, przycit do obszaru, prost (odcinek)!
Po podstawieniu t1 otrzymujemy:
9!% %"
$8!%%:5:5
9!7 "
$8!7 $7!5:
Uzyskany w efekcie przycinania odcinek prostej rozpity jest pomidzy punktami p0'(0,4; 4,0) i p1'(8,0; 2,3).
Mona to sprawdzi z punktami przycicia na rysunku 10.12 (powinny si zgadza!).
Jeeli zastanowi si przez chwil nad tym algorytmem, okae si, e tak naprawd pomaga on wycznie
w bardziej eleganckiej klasyfikacji i organizowaniu fragmentw informacji o scenie. Jak na ironi, w strukturze kodu wielu moduw przycinajcych pisanych przez osoby nie znajce tego algorytmu znale mona
identyczne przepywy danych, co w sumie oznacza, e algorytm ten jest naprawd dobrze przemylany
i uniwersalny.
W biecym rozdziale nie bdziemy implementowa tego algorytmu, ale moe pniej, kiedy dojdziemy
do optymalizacji przycinania, zastpimy algorytm Cohena-Sutherlanda dla paszczyzn prezentowanym tu
algorytmem Cyrusa-Becka. Tu nasuwa si wtpliwo, czy ten ostatni nadaje si do przycinania w przestrzeni trjwymiarowej? Ot tak. Przystosowanie tego algorytmu do trzech wymiarw nie zmienia zasadniczo procedury obliczeniowej, tyle, e nierwnoci okrelaj wtedy, czy punkt ley w dodatniej, czy
w ujemnej pprzestrzeni paszczyzn przycinania. Algorytm w wersji 3D angauje wic iloczyny skalarne
wektorw i operacj sprawdzania pprzestrzeni.
!
Ostatni z algorytmw omawianych w tej czci rozdziau wykorzystuje fakt, e wielokty sceny zoone
s z wierzchokw; kady wierzchoek moe nalee do przycinanego obszaru bd znajdowa si poza
nim. Algorytm zaprojektowany jest pod ktem przycinania jednego wielokta do innego wielokta. Jeeli
jeden z wierzchokw wielokta znajduje si poza obszarem przycinania, krawdzie prowadzone od tego
772
takiego, dla ktrego ustawiony jest znacznik krawdzi skierowanej do wewntrz wielokta
przycinania. Punkt ten bdzie pierwszym wierzchokiem wielokta wynikowego.
Przeszukanie listy wierzchokw wielokta przycinanego a do znalezienia nastpnego punktu
przecicia krawdzi wielokta przycinania. Kady odwiedzany po drodze punkt dodawany jest
do listy wierzchokw wielokta wynikowego. Drugi odnaleziony punkt przecicia krawdzi
powinien oznacza krawd skierowan na zewntrz obszaru przycinania.
Przeszukanie listy wierzchokw wielokta przycinania w poszukiwaniu punktu przecicia
773
Jeeli znaleziony w kroku 4. punkt przecicia nie identyczny z jest punktem pocztkowym
wynikowego, wielokt ten jest ju zamknity, ale niekoniecznie kompletny. Jeeli wszystkie
punkty przecicia na krawdziach skierowanych do wntrza wielokta przycinania wchodz
w skad wielokta wynikowego, algorytm koczy dziaanie (do stwierdzenia tego faktu mona
wykorzysta licznik albo znacznik); w przeciwnym przypadku naley przej do nastpnego
punktu przecicia do wewntrz wielokta przycinania i przej do kroku 2.
Zaprezentowany algorytm dziaa znakomicie i daje sobie rad z przycinaniem dowolnych wieloktw do
dowolnych innych wieloktw. Przykadowy przebieg algorytmu zastosowanego do prostego przypadku
przycinania ilustruje rysunek 10.14.
Przykad dziaania algorytmu Weilera-Athertona
774
wierzchoek zwracany jest jako jeden z wierzchokw wynikowych trjkta, w drugim nastpuje przejcie
do nastpnego wierzchoka. Jeeli punkty kocowe krawdzi zostan rnie sklasyfikowane (jeden jako
lecy wewntrz, drugi jako znajdujcy si poza obszarem przycinania), wyliczamy punkt przecicia i zwracamy go jako wierzchoek wielokta wynikowego. Zasadniczo wic algorytm polega na przegldaniu kolejnych krawdzi wielokta. Jeeli uda si rozpocz wewntrz obszaru przycinania, sprawa jest prosta: kadorazowo po jego opuszczeniu wyliczamy punkt przecicia, zwracamy go jako wierzchoek wielokta
wynikowego i kontynuujemy przegld krawdzi. Kiedy dojdziemy do krawdzi wracajcej do obszaru
przycinania, znw obliczamy punkt przecicia, zwracamy go jako wierzchoek wielokta wynikowego
i kontynuujemy przegld. To bardzo uproszczona wersja algorytmu Weilera-Athertona, ale za to bardzo
szybka. Osobicie stosuj j w bardziej lub mniej modyfikowanych postaciach w wikszoci projektw, poniewa uwaam, e nie warto wysila si tworzeniem zoonej listy wierzchokw wielokta
przycinania w przypadku, gdy obszar przycinania to zwyky prostokt, ani wielokta przycinanego, gdy
wiadomo, e to zawsze trjkt. Dziaanie wersji uproszczonej algorytmu ilustruje rysunek 10.15.
Uproszczona wersja algorytmu Weilera-Athertona
"#$
%&
To byoby na tyle! Teraz wiecie ju, jak realizowa przycinanie. Doprawdy, nie jest to zbyt skomplikowana
dziedzina korzysta si z gotowego algorytmu bd konstruuje algorytm hybrydowy, dostosowany do
specyficznych potrzeb, a wszystkie one polegaj w zasadzie na wyszukiwaniu punktw przeci z dwuwymiarowymi obszarami bd trjwymiarowymi bryami. Teraz zabierzemy si do implementacji mechanizmu przycinania dla potrzeb naszego silnika graficznego, ale jeeli kto zainteresowany jest pogbieniem
swojej wiedzy o algorytmach przycinania, moe zajrze do jednej z wymienionych poniej ksiek. W pozycjach tych znale mona cae pikno podejcia akademickiego cho nie nadaje si ono do implementowania algorytmw graficznych realizowanych w czasie rzeczywistym, przynajmniej dokadnie zapoznaje
z ich wszelkimi matematycznymi niuansami. Oto one:
Foley, van Dam, Feiner i Hughes, Computer Graphics: Principles and Practice
(wydawnictwo Addison-Wesley).
Foley, van Dam, Feiner i Hughes, Introduction to Computer Graphics (wydawnictwo Addison-Wesley).
Alan H. Watt, 3D Computer Graphics (wydawnictwo Addison-Wesley).
David F. Rogers, Procedural Elements for Computer Graphics (wydawnictwo McGraw-Hill).
Miej lektury!
775
C, pora zabra si za implementacj przycinania w naszym silniku 3D! Zadanie polega bdzie na
utworzeniu dodatkowego etapu potoku przetwarzania, w ktrym wielokty bd przycinane do bryy
ostrosupa widzenia. Jak wiadomo, przycinaniu poddawane bd wielokty reprezentowane w przestrzeni
trjwymiarowej. Modu przycinania powinien minimalizowa liczb koniecznych wtrnych podziaw
wieloktw i przycina wycznie te trjkty, ktre tego koniecznie wymagaj.
Kiedy trjkt musi zosta przycity? Ot jedynie wtedy, kiedy wykracza poza blisk paszczyzn przycinania, albo, co gorsza, przenika przez paszczyzn o wsprzdnej z rwnej 0. Rzutowanie wieloktw
o wsprzdnych z mniejszych lub rwnych zeru powoduje bowiem bdy dzielenia i odwrcenie rzutw
w paszczynie (x, y), a takie bdy s nie do przyjcia.
A do tego momentu oszukiwalimy troch skrzeczc rzeczywisto, umieszczajc blisk paszczyzn
przycinania ostrosupa widzenia na tyle daleko od paszczyzny rzutu i paszczyzny z = 0, aby aden
z trjktw sceny nie mg przez nie przenika, poniewa obiekty byy odrzucane na dugo przedtem, zanim
miay szans przekroczy paszczyzn z = 0. Teraz jednak trzeba zapomnie o usuwaniu caych obiektw
i przestawi si na mylenie o scenie wycznie w kategorii listy wieloktw. Wielokty te bd stanowi
problem, poniewa bd mogy znajdowa si wszdzie.
Waciwie chodzi bdzie wic o zaprogramowanie moduu przycinajcego (usuwajcego) takiego, ktry
przycinaby wielokty z listy obrazowanych wieloktw do bryy citego ostrosupa widzenia tyle, e
rzeczywiste przycinanie wierzchokw wieloktw bdzie zachodzi wycznie na bliszej paszczynie
przycinania. Wielokty, ktre po czci wystawa bd poza grn, doln czy jedn z bocznych paszczyzn
ostrosupa widzenia, bd odrysowywane w caoci, za te, ktre znajd si poza tymi paszczyznami, bd
w caoci usuwane z potoku przetwarzania. Naturalnie wielokty zakwalifikowane do odrysowania mog
przez to wystawa poza obszar rzutu ekranowego, ale zostan do niego przycite w rasteryzatorze. Wiemy
ju, e taka strategia oznacza szybsz i mniej kopotliw implementacj moduu przycinajcego nie
trzeba przycina wieloktw do kadej z szeciu cian bryy ostrosupa widzenia, poniewa w ostatecznym rozrachunku i tak okazuje si to marnotrawstwem czasu. Wymaga przy tym kopotliwych operacji
wtrnego podziau wieloktw, przeliczania wektorw normalnych wierzchokw i paszczyzn oraz wsprzdnych mapowania tekstur. Jeszcze raz: jedynymi wieloktami koniecznie wymagajcymi przycicia s
wielokty przenikajce i wystajce poza blisk paszczyzn przycinania, ktrych dalsze przetwarzanie
moe potencjalnie doprowadzi do zakce obrazowania sceny lub wyjtkw procesora. Zalet przyjtej
strategii jest za nie tylko wyeliminowanie wieloktw zwrconych tyem do obserwatora, ale rwnie usunicie tych, ktre znajduj si w caoci poza bry ostrosupa widzenia. Z potoku renderowania usunita zostanie
wic znaczna cz elementw sceny, co oznacza naturalnie wiksz wydajno silnika! Zaczynamy!
Przycinanie 3D mona umieci w rnych fazach potoku przetwarzania: w przestrzeni sceny, przestrzeni
obserwatora bd przestrzeni rzutu perspektywicznego. W kadej z tych przestrzeni ujawnia ono odmienne
wady i zalety. Przykadowo, przycinanie w przestrzeni sceny pozwala na zaoszczdzenie czasu potrzebnego w innym przypadku na realizacj przeksztace potencjalnie niewidocznych elementw sceny do
wsprzdnych przestrzeni obserwatora, ale wtedy ostrosup widzenia zakotwiczony jest w pozycji obserwatora i posiada ustalon orientacj. Tak wic przycinanie i usuwanie fragmentw sceny powinno by
realizowane na nieco mniej oglnym poziomie. Z drugiej strony, jeli dopucimy wielokty do przeksztacenia z przestrzeni sceny w przestrze kamery, to zachowane zostanie ich pooenie wzgldne wobec kamery,
a paszczyzny ostrosupa widzenia przebiega bd wzdu osi widzenia, co bardzo uproci przycinanie.
Tak wic w drugim przypadku konieczna bdzie kadorazowo pena transformacja wsprzdnych sceny
do wsprzdnych kamery, ale za to proces przycinania (usuwania) bdzie duo prostszy. Dalej, gdyby poczeka z przycinaniem a do fazy rzutu perspektywicznego, caa geometria rzutowanej sceny bdzie znormalizowana do kanonicznej bryy widzenia, ktr stanowi prostopadocian. Innymi sowy, jeeli przed przycinaniem zrealizowane zostan przeksztacenia perspektywiczne, nie trzeba bdzie przycina do ostrosupa,
ale do prostopadocianu wakowalimy to ju kilkukrotnie w rozdziaach o podstawach matematycznych
rzutowania 3D.
776
Potok przetwarzania z nowym etapem przycinania 3D
$ '
Na rysunku 10.16 wida, e geometria sceny jest wczytywana do systemu za porednictwem caych obiektw
(ewentualnie generowana za pomoc pojedynczych wieloktw), po czym obiekty s przeksztacane, ewentualnie usuwane, dzielone na wielokty, nastpnie usuwane s te wielokty, ktre s zwrcone tyem do
obserwatora; dalej znowu mamy nieco przeksztace, przycinanie, usuwanie, znowu przeksztacenia i wreszcie wywietlanie. Strasznie duo tu przeksztace wsprzdnych! Rzecz w tym, e potok rozpoczyna si
od obiektw sprawdza si to w grach bez geometrii wntrz i krajobrazw, jednak w grach rozgrywanych
wewntrz modelowanych pomieszcze ju nie.
777
Trzeba si wic przestawi z podejcia obiektowego i zacz myle kategoriami nowych elementw, bardziej
odpowiednich do reprezentowania podoa terenowego, wntrz budynkw i tym podobnych. Wanie
dlatego dotychczas stosowalimy jak najmniej wywoa moduw owietlenia i usuwania obiektw. Od tego
momentu naley zamieni pojcie obiektu na pojcie zbioru wieloktw, poniewa ju wkrtce do silnika
wprowadzone zostan bardziej zaawansowane struktury danych, obsugujce wielkie obiekty sceny. Nie
chcielibymy jednak, aby te struktury byy po prosu jednym wielkim, bezadnym zbiorowiskiem wieloktw.
Wielokty te maj by uporzdkowane, posortowane, wzajemnie poczone i umieszczone w strukturach
hierarchicznych.
Wemy za przykad rysunek 10.17. Obrazuje on w pewnej grze widok zewntrzny miasta, ktry chcielibymy
modelowa graficznie. Cho dane poziomu mog zosta zebrane w kontenerze obiektowym, przydayby
si rwnie struktury pomocnicze, pozwalajce na szybkie usunicie poszczeglnych grup elementw skadowych sceny. Tu na scen wkraczaj koncepcje drzew BSP, portali, drzew czwrkowych i im podobne.
Widok poziomu gry
Aby jednak efektywnie wykorzysta wszystkie te struktury, musimy dysponowa sposobem zamienienia
ich w pewnym momencie na zbir goych wieloktw. Zmierzamy wic do tego, e przed implementacj
naley podj decyzj co do typu gry czy gier, ktre maj wykorzystywa dany silnik i przyj do wiadomoci, e w przypadku gier z geometri wntrz przycinanie (podobnie, jak usuwanie) wieloktw jest
jednym z waniejszych etapw potoku przetwarzania. Dlatego wanie zdecydowalimy si na wprowadzenie do potoku moduu przycinania i usuwania wieloktw z list wywietlania zamiast realizowa
analogiczne operacje na rzecz obiektw gry. Nie mona z gry zakada, e wszystko uda si umieci
w strukturach obiektowych.
(
%
Zacznijmy od pocztku. Nowy modu biblioteczny, zawierajcy kod przycinania, bdzie nosi nazw
T3DLIB8.CPP (jego plik nagwkowy to T3DLIB8.H). Bdzie bardzo krtki, jako e jego zawarto ograniczona zostanie dosownie do kilku funkcji. Jak zwykle, modu zostanie poddany krtkiej analizie, bez zagbiania si w szczegy i analizowania przyczyn pojawiania si kolejnych funkcji. Przyjrzyjmy si najpierw poszczeglnym czciom pliku nagwkowego.
!
Modu przycinania wykorzystuje zaledwie kilka staych, kontrolujcych jego zachowanie i pooenie paszczyzn przycinania. Oto definicje tych staych:
778
W bibliotece znajduj si jedynie dwie funkcje: funkcja przycinania i funkcja generowania terenu (ta ostatnia
jest pewn niespodziank):
L=? ?MD/(DM,>H5(N%
MD/(DM,>H5(N%?HM?#
$$lista wywietlania do przycicia
=CO5(N ?HM3$$kamera
#3?<P$$znaczniki przycinania
#-#?H?@FGD=H5(N%
@FGD=H5(N%?HM*$$wskanik do obiektu
<###Q$$szeroko terenu we wsprzdnych x sceny
<##QQ#$$wysoko (dugo) terenu we wsprzdnych y sceny
<#L3$$skala pionowa terenu
3Q"QQ#??<$$nazwa pliku mapy wysokoci kodowanej na 256 kolorach
3Q"##2??<$$nazwa pliku tekstury terenu
#3$$kolor terenu (jeeli brak tekstury)
ND=H@M5(?HM$$pocztkowe pooenie
ND=H@M5(?HM#$$pocztkowy kt obrotu
#2?##P$$atrybuty cieniowania
Poniej znajduje si standardowy kod poszczeglnych etapw przetwarzania w biecej postaci potoku
wywietlania:
M#?@FGD=H5(N%
'*P
$$konstrukcja macierzy jednostkowejOCH?>(D/H>HA?5B5
'#P
$$przeksztacenia lokalnego ukadu wsprzdnych
H<?@FGD=H5(N%
'*'#HMC/R@MO?,@=C,?H@?HMC/ P
$$przeksztacenie do wsprzdnych sceny
O?H?S?@FGD=H5(N%
'*HMC/R@MO?HMC/?@/,AP
779
780
Kwalifikacja wieloktw do przycinania
Moemy jednak rzecz nieco uproci, wykorzystujc wiadomy nam fakt, e paszczyzny przycinania s
rwnolege i prostopade do osi ukadu wsprzdnych dysponujc tak wiedz, moemy po prostu do
stwierdzenia, czy punkt znajduje si w ostrosupie widzenia, wykorzysta nachylenie paszczyzn, czyli kt
pola widzenia. Spjrzmy raz jeszcze na rysunek 10.19. Widniejcy na nim wielokt 1 jest sprawdzany
wzgldem prawej paszczyzny przycinania, tworzcej ostrosup widzenia. Moemy na chwil zignorowa
o y ukadu i rozpatrzy ten przypadek wycznie w paszczynie x-z. Pytanie brzmi: czy wierzchoek
V1(x1, y1, z1) znajduje si przed, czy za praw paszczyzn przycinania? Mona to stwierdzi na podstawie
podobiestwa trjktw.
Na rysunku 10.19 kt widzenia zosta okrelony jako 90 stopni, czyli lewa i prawa paszczyzna ostrosupa
widzenia jest nachylona wzgldem paszczyzny z o 45 stopni. Rwnanie tych paszczyzn mona wic
zdefiniowa po prostu jako x = z dla paszczyzny lewej i x = z dla prawej (warto y jest obojtna). Oznacza to, e jeeli wsprzdna x1 badanego wierzchoka jest rwna jego wsprzdnej z1, wierzchoek ten
znajduje si na paszczynie przycinania; jeeli x1 > z1, wierzchoek znajduje si na zewntrz paszczyzny,
a jeeli x1 < z1, wierzchoek pooony jest po jej stronie wewntrznej.
Terminy wewntrz i strona wewntrzna oznaczaj tu przestrze wewntrz ostrosupa widzenia,
inaczej dodatni pprzestrze paszczyzny przycinania. Analogicznie terminy na zewntrz
i po stronie zewntrznej oznaczaj przestrze poza ostrosupem widzenia, a wic w ujemnej
pprzestrzeni paszczyzny przycinania.
Moemy to uoglni do postaci nastpujcego twierdzenia: dla danego wierzchoka v(x, y, z), przy kcie
widzenia rwnym 90 stopni, zachodz nastpujce zalenoci:
jeeli (x > z), v ley na zewntrz prawej paszczyzny przycinania;
jeeli (x < z), v ley po wewntrznej stronie prawej paszczyzny przycinania;
jeeli (x = z), v ley na prawej paszczynie przycinania;
781
Analogiczne wnioski mona wysnu rwnie dla grnej i dolnej paszczyzny przycinania wystarczy
w miejsce x podstawi y. Jest to oczywicie do szczeglny przykad, bo dziaa tylko dla pola widzenia
rwnego 90 stopni, jednak zmiana tego kta powoduje jedynie zmian nachylenia rzutw paszczyzn
przycinania, a do uwzgldnienia takiej zalenoci wystarczy niewielka zmiana powyszych wzorw. Na
rysunku 10.20 prezentowany jest przypadek bardziej oglnej zalenoci klasyfikacji pooenia wierzchoka
od stosunku jego wsprzdnych przy danym kcie widzenia.
Klasyfikacja
wierzchokw
na podstawie
stosunku
wsprzdnych
i kta nachylenia
paszczyzn
przycinania
std:
#
"
782
Przewiczyem ten algorytm co najmniej 500 razy, wic moecie przyj na wiar to, co zostao tu powiedziane. W kadym przypadku, jeeli wszystkie trzy wierzchoki badanego trjkta le wewntrz
ostrosupa widzenia, trjkt jest zaliczany do sceny, a algorytm przechodzi do nastpnego trjkta. Jeeli
za wszystkie trzy wierzchoki badanego trjkta le poza ostrosupem widzenia, cay trjkt jest usuwany
z potoku wywietlania i oznaczany jako obcity:
$$wytnij wielokt lecy w caoci poza ostrosupem widzenia
DH?F>H
32? T##@,A5(N%?HCHD?=,>D(P
Przed zaprezentowaniem kodu warto byoby choby w celu uniknicia powtrze zaczeka do
omwienia przycinania wzgldem paszczyzny z, niemniej jednak naley si Wam cho krtki fragment
kodu, ilustrujcy implementacj zaprojektowanych dotychczas testw. Oto kod sprawdzajcy, czy dany
wierzchoek trjkta znajduje si wewntrz, czy moe poza paszczyznami przycinania:
$$poniewa przycinanie odbywa si wzgldem lewej i prawej paszczyzny przycinania ,
$$test polega na porwnaniu wsprzdnej x wierzchoka z wartoci z paszczyzn;
$$do porwnania wykorzystywana jest funkcja kta widzenia
?<3#
:8"3TL?#Q$3TL?#P
$$wierzchoek 0
?##
?<3#"32? T#L#UV:
P
<
32? T#L#UV:
?##
L#?33UV=,>?=@(D?-BP
<
32? T#L#UV:T
?##
L#?33UV=,>?=@(D?,BP
L#?33UV=,>?=@(D?>BP
Tyle dyskutowania i zaledwie dziesi wierszy kodu! Hm, jak ju wiemy, wystarczy wiedzie, czy wierzchoek znajduje si po wewntrznej, czy po zewntrznej stronie paszczyzny przycinania. W zalenoci
od tego w kodzie wierzchoek otrzymuje znacznik (jak w algorytmie Cohena-Sutherlanda), ktry informuje o pooeniu wzgldem paszczyzny ostrosupa widzenia. Znacznik ten jest pniej wykorzystywany
do prostej eliminacji lub zaliczania wielokta do dalszego przetwarzania. Tymczasem zajmiemy si analiz
algorytmu przycinania wzgldem bliskiej i dalekiej paszczyzny przycinania to nieco bardziej zoona
procedura.
%
& '
Tutaj sprawy nieco si komplikuj. Dyskutowanie o przycinaniu jest przyjemne i proste, ale gdy przychodzi
do implementacji w przestrzeni trjwymiarowej, rzecz okazuje si niebanalna! I to nie ze wzgldu na
skomplikowanie samego algorytmu diabe, jak si okae, tkwi raczej w pozornie niegronych szczegach Zamy wic, e udao si ju wyeliminowa z listy wywietlania wszystkie te wielokty, ktre
znajdoway si w caoci poza ostrosupem widzenia (na zewntrz prawej, lewej, grnej i dolnej paszczyzny
przycinania). Pozostae wielokty musz jeszcze zosta sprawdzone wzgldem bliskiej i dalekiej paszczyzny przycinania. Oba testy s trywialne, poniewa paszczyzny przycinania s prostopade do dodatniej posi z, a kamera jest wyrwnana wanie do tej posi. Std dla kadego wierzchoka vi(xi, yi, zi)
(dla i = 0, 1, 2) badanego trjkta wystarczy porwna wsprzdne zi z wartociami wsprzdnych z obu
paszczyzn przycinania; wsprzdne te definiowane s w strukturze opisujcej kamer jako skadowe
i
.
Przykadowo, aby sprawdzi, czy wielokt znajduje si w caoci za dalek paszczyzn przycinania, naleaoby zrealizowa nastpujcy pseudokod:
*W
L:
??
3
L :
??
L%:
??
#22XY#
LL L%
783
Cakiem proste, prawda? Analogicznie wygldaby test wzgldem bliszej paszczyzny przycinania:
*W
L:
??
3
L :
??
3
L%:
??
3#22XY#
LL L%
Jeli wzi pod uwag przycinanie wzgldem dalekiej paszczyzny, nieistotne s przypadki pooenia
trjktw czciowo wewntrz obszaru przycinania, jednak musz one zosta osobno rozpatrzone wzgldem
bliszej paszczyzny. Tutaj nie da si unikn szczegowej analizy pooenia wierzchoka. Pseudokod takiej
analizy wygldaby nastpujco:
WY#
# 0#
3
*
W
3Q.LWY3Y#
3
*
E)#*
3*)
3Q.L+
:=
LW Y#
#.2
Z
%:=
LW
Y#
*.
3
3Z
&:=
LW
Y#
*.
3
3Z
3
*W
#
3Q.Y#
*2*Y)
Y#
*2*.
3
322X
# 0#3.03
3
784
Przypadek 1. Jeden wierzchoek we wntrzu obszaru przycinania, dwa poza tym obszarem
To prostszy wariant przycinania. Wystarczy tu przyci dwie krawdzie przenikajce przez blisk paszczyzn przycinania i zastpi trjkt przycinany now wersj, z dwoma nowymi wierzchokami. Jeeli do
trjkta przypisana bya tekstura, naley rwnie przeliczy wsprzdne mapowania tekstury. Oczywicie,
naley te ponownie obliczy wektor normalny trjkta zmiana wielkoci trjkta zmienia rwnie jego
wektor normalny. Now dugo wektora normalnego naley zachowa na potrzeby fazy owietlenia, ktra
rwnie musi zosta dla danego trjkta wykonana ponownie.
Przypadek 2. Dwa wierzchoki we wntrzu obszaru przycinania, jeden poza tym obszarem
Ten przypadek jest duo bardziej skomplikowany. Odwoajmy si ponownie do rysunku 10.21 kiedy
dwa wierzchoki trjkta wystaj poza obszar przycinania, rwnie mamy dwa punkty przecicia z blisk
paszczyzn przycinania. Tyle, e w tym przypadku oznacza to, e wynikowy wielokt jest czworoktem,
czego nasz silnik graficzny nie znosi. Naley go podzieli na dwa nowe trjkty! W tym celu najlepiej
utworzy kopi przycinanego trjkta i na niej wykona przycinanie, owocujce powstaniem dwch nowych trjktw: A i B. Nastpnie oryginalny trjkt przycinany mona zastpi trjktem A, a trjkt B
po prostu doda na koniec listy wywietlania.
Przed przejciem do dalszej lektury warto dokadnie zapozna si z procedur postpowania w tym zoonym przypadku. Podsumowujc: kiedy przycinajmy trjkt do paszczyzny, uzyskujemy w wyniku
przycinania jeden lub dwa rne od pierwotnego trjkty. Jeeli bdzie to jeden trjkt, wystarczy zastpi
trjkt przycinany trjktem przycitym, co nie powoduje rewolucji w licie wywietlania. Jeeli jednak
w wyniku przycinania w miejsce trjkta przycinanego powstan dwa nowe trjkty (A i B), nie wystarczy
zastpienie oryginalnego trjkta nowym drugi trjkt naley wstawi do listy wywietlania.
W tym miejscu mona by pomyle: szkoda, e zamiast tablicy wskanikw do wieloktw
nie operujemy powizan list, a to dlatego, e podczas sortowania wieloktw wzgldem
pooenia w osi z wystpi nastpujca sytuacja: wielokt podzielony podczas przycinania
bdzie mia swojego klona, umieszczonego na kocu listy, o ktrym z gry wiadomo,
e ma wsprzdn z sortowania identyczn z tak wsprzdn oryginau; sortowanie zostanie
spowolnione, poniewa algorytm sortowania bdzie musia przenie uzyskany z podziau
wielokt z samego koca listy. Wada ta zostanie wyeliminowania w ramach optymalizacji.
Znamy ju scenariusz implementacji, pora na zgbienie rzeczywistego kodu przycinania. Jak bdzie on implementowany? Ot stworzymy algorytm bdcy hybryd wszystkich zaprezentowanych dotychczas algorytmw przycinania. Mamy ju gotowy etap wstpnej klasyfikacji wierzchokw. Trzeba tylko znale
sposb na wyznaczenie punktw przecicia trjkta przycinanego z blisk paszczyzn przycinania. Wiemy
ju, e przycinanie takie mona podzieli na dwa przypadki (pierwszy z jednym wierzchokiem wewntrz obszaru przycinania, i drugi z dwoma wierzchokami wewntrz tego obszaru) bd one zakodowane osobno. W kadym z tych przypadkw wykorzystane zostan parametryczne definicje prostej dla
dwch wychodzcych poza obszar przycinania krawdzi, w rodzaju:
L
L !L"#
785
Obliczon warto t naley podstawi do pozostaych dwch rwna krawdzi dla skadowych x i y
i prosz mamy wsprzdne punktu przecicia! Wystarczy wykona t procedur jeszcze raz, dla drugiej
krawdzi przecinajcej paszczyzn przycinania. Reszta to ju tylko operacje porzdkujce, a wic midzy
innymi dopilnowanie, aby oryginalny trjkt zosta zastpiony nowym trjktem wynikowym przez zastpienie wsprzdnych wierzchokw wyliczonymi wsprzdnymi punktw przecicia oraz aby wprowadzi ewentualnie nowo powstay trjkt do listy wywietlania.
Obliczanie wsprzdnych mapowania tekstury. Zosta ju tylko szczeg w postaci koniecznoci obliczenia nowych wsprzdnych mapowania tekstury tu zalecana jest ostrono. Jeeli wielokt podlega
teksturowaniu, tekstur naley przyci tak samo, jak przycity zosta sam wielokt; na szczcie mona
do oblicze wykorzysta wyliczon ju warto t. Oto przykad przeliczania wsprzdnych mapowania
tekstury. Niech dany bdzie trjkt, przycinany w przypadku pierwszym wzgldem bliskiej paszczyzny
przycinania, jak na rysunku 10.22; do kadego wierzchoka trjkta przypisane zostay wsprzdne tekstury,
co rwnie zobrazowane jest na rysunku.
Przeliczanie nowych
wsprzdnych
mapowania tekstury
dla przycitego trjkta
Zamy teraz, e obliczono ju punkty przecicia krawdzi trjkta przycinanego z blisk paszczyzn
przycinania i okazao si, e dla jednego z punktw przecicia parametr t ma warto 0,6. Wystarczy teraz skorzysta z tej wartoci do liniowej interpolacji wsprzdnych tekstury i w ten sposb okreli nowe
przypisania tekstury do wierzchokw trjkta. Odwoujc si ponownie do rysunku wida, e wierzchoek 0 posiada wsprzdne mapowania tekstury rwne u0v0(3, 5), a wsprzdne te dla wierzchoka 1 to
u1v1(15, 50). Nowe wartoci wsprzdnych mapowania mona obliczy nastpujco:
2[2
2 !2"#
L[L
L !L"#
786
To dodatkowy narzut obliczeniowy, ale naley si pociesza, e w jednej ramce przycitych do bliskiej
paszczyzny przycinania zostanie najwyej kilkaset wieloktw, a wykorzystanie szybkiej wersji obliczania wektora normalnego narzut ten dodatkowo zmniejsza, cho wyniki tych oblicze s nieco gorsze ni
w wersji penej. Dokadno spada o pi do dziesiciu procent, ale nie naley zbytnio si tym przejmowa,
poniewa fakt, e wielokt przekroczy czciowo blisk paszczyzn przycinania wskazuje, e w najbliszym
czasie zostanie w ogle usunity z pola widzenia.
C, zdaje si, e temat zosta ju dokadnie przewakowany, czas na prezentacj waciwego kodu funkcji
przycinajcej. Oto kod rdowy:
L=? ?MD/(DM,>H5(N%
MD/(DM,>H5(N%?HM?#
=CO5(N ?HM3#3?<
\
$$Funkcja ta przycina wielokty z przekazanej listy wieloktw rend_list
$$wzgldem zadanego obszaru przycinania i ustawia dla wielokta znaczniki
$$przycinania, dziki czemu nie przechodzi on do dalszego przetwarzania.
$$Funkcja realizuje rzeczywiste przycinanie wycznie wzgldem bliszej
$$i dalszej paszczyzny przycinania, dla pozostaych paszczyzn ostrosupa
$$widzenia realizujc proste testy klasyfikujce. Dla tych paszczyzn,
$$jeeli wielokt w caoci ley na zewntrz paszczyzny, zostaje oznaczony
$$jako usunity z obszaru widzenia; test ten nie jest rwnie efektywny dla
$$obiektw, ale w przypadku list wieloktw naprawd duych obiektw, ktrych
$$fragmenty s zawsze widoczne, testowanie poszczeglnych wieloktw jest
$$dostatecznie efektywne. Funkcja zakada, e wsprzdne wieloktw zostay
$$przeksztacone do przestrzeni kamery
$$wewntrzne kody przycinania
;<=,>?=@(D?-E $$z > z_max
;<=,>?=@(D?,E%$$z < z_min
;<=,>?=@(D?>E5$$z_min < z < z_max
;<=,>?=@(D?-B $$x > x_max
;<=,>?=@(D?,B%$$x < x_min
;<=,>?=@(D?>B5$$x_min < x < x_max
;<=,>?=@(D?-A $$y > y_max
;<=,>?=@(D?,A%$$y < y_min
;<=,>?=@(D?>A5$$y_min < y < y_max
;<=,>?=@(D?/I,,
#L#?33U&VP$$przechowuje znaczniki przycinania
#2?L#?P$$liczba wierzchokw wewntrz
#LL L%P$$indeksy wierzchokw
<#
?<3#$$do oblicze przycinania
?##P$$do oblicze przycinania
<# % %$$punkty przecicia
# #%$$wartoci parametru t
2L2 L 2%L%P$$wsprzdne tekstury
##? ?$$ostatni prawidowy wielokt na licie rend_list
#? ?P$$bieca pozycja wstawiania nowych wieloktw
ND=H@M5(2LP$$do oblicze wektorowych
@,AR5(N%#? P$$kopia wielokta wtrnie dzielonego
$$ustawienie indeksw ostatniego i wstawianego wielokta na licie wieloktw
$$nie warto dwukrotnie przycina wieloktw
#? ?#? ??#T2? P
$$przegldanie listy wieloktw i przycinanie (usuwanie)
<
# P #? ?P
\
$$pobierz biecy wielokt
@,AR5(N%?HM32? ?#T ?#U VP
$$czy wielokt nadaje si do przycinania?
$$sprawdzany wielokt nie powinien by przycity, usunity, zwrcony tyem
$$powinien by aktywny i widoczny
$$Sprawdzenie, czy wielokt nie jest zwrcony tyem, zostao zrealizowane
$$w poprzednim wywoaniu, wystarczy wic sprawdzi odpowiedni znacznik
<
32? /I,,JJ]
32? T##'@,A5(N%?HCHD?C=H>NDJJ
32? T##'@,A5(N%?HCHD?=,>D(JJ
32? T##'@,A5(N%?HCHD?FC=^RC=D
3#2P$$przejd do nastpnego wielokta
$$przycinanie (usuwanie) wzgldem paszczyzn x
<
3?<'=,>?@,A?B?,C/D
\
$$przytnij (usu) w oparciu o warto x paszczyzny przycinania
$$dla kadego wierzchoka sprawdzaj, czy znajduje si on wewntrz obszaru
$$przycinania i ustawiaj odpowiednio znacznik przycinania. Nie przycinaj
$$trjktw, najpierw prbuj je odrzuci. Wielokty wystajce czciowo
$$zostan przycite do prostokta rzutu ekranowego na etapie rasteryzacji,
$$tymczasem usunite zostan te wielokty, ktre w caoci znajduj si
$$poza ostrosupem widzenia
$$Podczas przycinania do bocznych paszczyzn przycinania wykorzystywane s
$$rwnania paszczyzn lub parametr kta widzenia; chodzi o okrelenie
$$stosunku wartoci wsprzdnych x i z do okrelenia widocznoci wierzchoka
?<3#
:8"3TL?#Q$3TL?#P
$$wierzchoek 0
?##
?<3#"32? T#L#UV:
P
<
32? T#L#UV:
?##
L#?33UV=,>?=@(D?-BP
<
32? T#L#UV:T
?##
L#?33UV=,>?=@(D?,BP
L#?33UV=,>?=@(D?>BP
$$wierzchoek 1
?##
?<3#"32? T#L#U V:
P
<
32? T#L#U V:
?##
L#?33U V=,>?=@(D?-BP
<
32? T#L#U V:T
?##
L#?33U V=,>?=@(D?,BP
787
788
L#?33U V=,>?=@(D?>BP
$$wierzchoek 2
?##
?<3#"32? T#L#U%V:
P
<
32? T#L#U%V:
?##
L#?33U V=,>?=@(D?-BP
<
32? T#L#U%V:T
?##
L#?33U V=,>?=@(D?,BP
L#?33U%V=,>?=@(D?>BP
$$testy odrzucania;
$$odrzucane s wielokty znajdujce si w caoci poza
$$bocznymi paszczyznami przycinania
<
L#?33UV=,>?=@(D?-B''
L#?33U V=,>?=@(D?-B''
L#?33U%V=,>?=@(D?-BJJ
L#?33UV=,>?=@(D?,B''
L#?33U V=,>?=@(D?,B''
L#?33U%V=,>?=@(D?,B
\
$$oznacz jako przycity - wystajcy w caoci poza ostrosup widzenia
DH?F>H
32? T##@,A5(N%?HCHD?=,>D(P
$$przejd do nastpnego wielokta
3#2P
_$$if
_$$if dla paszczyzn x
$$przycinanie (usuwanie) wzgldem paszczyzn y
<
3?<'=,>?@,A?A?,C/D
\
$$przytnij (usu) w oparciu o warto y paszczyzny przycinania
$$dla kadego wierzchoka sprawdzaj, czy znajduje si on wewntrz obszaru
$$przycinania i ustawiaj odpowiednio znacznik przycinania. Nie przycinaj
$$trjktw, najpierw prbuj je odrzuci. Wielokty wystajce czciowo
$$zostan przycite do prostokta rzutu ekranowego na etapie rasteryzacji,
$$tymczasem usunite zostan te wielokty, ktre w caoci znajduj si
$$poza ostrosupem widzenia
$$Podczas przycinania do grnej i dolnej paszczyzny przycinania
$$wykorzystywane s rwnania paszczyzn lub parametr kta widzenia;
$$chodzi o okrelenie stosunku wartoci wsprzdnych y i z do
$$okrelenia widocznoci wierzchoka;
?<3#
:8"3TL?#Q$3TL?#P
$$wierzchoek 0
?##
?<3#"32? T#L#UV:
P
<
32? T#L#UV:
?##
L#?33UV=,>?=@(D?-AP
<
32? T#L#UV: T
?##
L#?33UV=,>?=@(D?,AP
L#?33UV=,>?=@(D?>AP
$$wierzchoek 1
?##
?<3#"32? T#L#U V:
P
<
32? T#L#U V:
?##
L#?33U V=,>?=@(D?-AP
<
32? T#L#U V: T
?##
L#?33U V=,>?=@(D?,AP
L#?33U V=,>?=@(D?>AP
$$wierzchoek 2
?##
?<3#"32? T#L#U%V:
P
<
32? T#L#U%V:
?##
L#?33U%V=,>?=@(D?-AP
<
32? T#L#U%V: T
?##
L#?33U%V=,>?=@(D?,AP
L#?33U%V=,>?=@(D?>AP
$$testy odrzucania;
$$odrzucane s wielokty znajdujce si w caoci poza
$$bocznymi paszczyznami przycinania
<
L#?33UV=,>?=@(D?-A''
L#?33U V=,>?=@(D?-A''
L#?33U%V=,>?=@(D?-AJJ
L#?33UV=,>?=@(D?,B''
L#?33U V=,>?=@(D?,B''
L#?33U%V=,>?=@(D?,B
\
$$oznacz jako przycity - wystajcy w caoci poza ostrosup widzenia
DH?F>H
32? T##@,A5(N%?HCHD?=,>D(P
$$przejd do nastpnego wielokta
3#2P
_$$if
_$$if dla paszczyzn y
$$przycinanie (usuwanie) wzgldem paszczyzn z
<
3?<'=,>?@,A?E?,C/D
\
$$przytnij (usu) w oparciu o warto z paszczyzny przycinania
$$dla kadego wierzchoka sprawdzaj, czy znajduje si on wewntrz obszaru
$$przycinania i ustawiaj odpowiednio znacznik przycinania; faktyczne
$$przycinanie do bliszej paszczyzny przycinania realizowane bdzie
$$pniej grupowo; przycinanie moe zaowocowa dodaniem do listy
$$rend_list nowego wielokta
$$wyzeruj liczniki wierzchokw
$$- przydadz si podczas klasyfikacji trjkta wynikowego
2?L#?P
$$wierzchoek 0
<
32? T#L#UV:
3T<?3?
\
L#?33UV=,>?=@(D?-EP
_
<
32? T#L#UV:
3T?3?
\
L#?33UV=,>?=@(D?,EP
_
\
L#?33UV=,>?=@(D?>EP
2?L#?P
_
$$wierzchoek 1
<
32? T#L#U V:
3T<?3?
\
L#?33U V=,>?=@(D?-EP
789
790
_
<
32? T#L#U V:
3T?3?
\
L#?33U V=,>?=@(D?,EP
_
\
L#?33U V=,>?=@(D?>EP
2?L#?P
_
$$wierzchoek 2
<
32? T#L#U%V:
3T<?3?
\
L#?33U%V=,>?=@(D?-EP
_
<
32? T#L#U%V:
3T?3?
\
L#?33U%V=,>?=@(D?,EP
_
\
L#?33U%V=,>?=@(D?>EP
2?L#?P
_
$$testy dla przypadkw prostego odrzucania dla wieloktw w caoci
$$znajdujcych si poza blisk paszczyzn przycinania
<
L#?33UV=,>?=@(D?-E''
L#?33U V=,>?=@(D?-E''
L#?33U%V=,>?=@(D?-EJJ
L#?33UV=,>?=@(D?,E''
L#?33U V=,>?=@(D?,E''
L#?33U%V=,>?=@(D?,E
\
$$oznacz jako przycity - wystajcy w caoci poza ostrosup widzenia
DH?F>H
32? T##@,A5(N%?HCHD?=,>D(P
$$przejd do nastpnego wielokta
3#2P
_$$if
$$sprawd, czy ktrykolwiek z wierzchokw wystaje przed
$$blisz paszczyzn przycinania?
<
L#?33UVJL#?33U VJL#?33U%V'=,>?=@(D?,E
\
$$mona przystpi do przycinania wielokta do bliszej paszczyzny
$$przycinania;
$$przycinanie do paszczyzny dalszej mona sobie darowa, gdy nieprzycite
$$wzgldem tej paszczyzny wielokty nie sprawiaj problemw obliczeniowych;
$$przycinanie uwzgldnia dwa przypadki: przypadek 1., gdy jeden wierzchoek
$$trjkta znajduje si po wewntrznej stronie paszczyzny przycinania (dwa
$$wierzchoki po stronie zewntrznej) albo przypadek 2., gdy po stronie
$$wewntrznej paszczyzny przycinania znajduj si dwa wierzchoki trjkta;
$$krok 1. klasyfikacja typu trjkta na podstawie liczby wierzchokw
$$po wewntrznej stronie paszczyzny przycinania
$$przypadek 1. jest przypadkiem prostym
<
2?L#?
\
$$naley przyci trjkt wzgldem bliskiej paszczyzny przycinania;
$$procedura przycinania realizowana jest wzgldem kadej z krawdzi
$$wychodzcych z wierzchoka wewntrznego poza obszar przycinania;
791
792
232? T#L#ULV:2
32? T#L#UL%V:2T32? T#L#ULV:2"#%P
L32? T#L#ULV:L
32? T#L#UL%V:LT32? T#L#ULV:L"#%P
32? T#L#UL%V:22P
32? T#L#UL%V:LLP
_$$if teksturowania
$$na koniec naley wyznaczy now dugo wektora normalnego
$$przycitego trjkta
$$konstruuj u, v
ND=H@M5(?F2
'32? T#L#ULV:L'32? T#L#UL V:L'2P
ND=H@M5(?F2
'32? T#L#ULV:L'32? T#L#UL%V:L'LP
$$oblicz iloczyn wektorowy
ND=H@M5(?=
'2'L'P
$$oblicz szybko dugo wektora normalnego i zapamitaj w polu
$$nlength struktury trjkta
$$pniej warto ta zostanie obliczona dokadniej
32? T#QND=H@M5(?,#Q?R#
'P
_$$if liczby wierzchokw wewntrz obszaru przycinania
<
2?L#?%
\
$$dwa wierzchoki wewntrz obszaru przycinania
$$w tym przypadku rwnie trzeba przyci trjkt do bliszej
$$paszczyzny przycinania; dla kadej krawdzi wychodzcej
$$z wierzchoka wewntrznego obliczany jest punkt przecicia z blisk
$$paszczyzn przycinania, tyle, e w przeciwiestwie do przypadku 1.
$$trjkt zostanie podzielony na dwa nowe trjkty;
$$podczas pierwszego przycinania do listy wywietlania dodany zostanie
$$nowy trjkt, a przy drugim przycinaniu zastpione zostan
$$dotychczasowe wsprzdne oryginalnego trjkta
$$krok 0. utworzenie kopii przycinanego trjkta
3
'#? 32?
<
@,AR5(N%P
$$krok 1. wyszukaj wierzchoek zewntrzny
<
L#?33UV=,>?=@(D?,E
\LPL PL%%P_
<
L#?33U V=,>?=@(D?,E
\L PL %PL%P_
\L%PL PL% P_
$$krok 2. przycinanie krawdzi
$$w skrcie polega to na wygenerowaniu prostej p = v0 + (v1 - v0) * t
$$i wyliczenia t dla skadowej z rwnej z paszczyzny przycinania oraz
$$podstawieniu t do rwnania prostej w celu obliczenia pozostaych
$$wsprzdnych punktu przecicia; aby zaoszczdzi nieco czasu
$$unikamy wywoywania funkcji matematycznych wysokiego poziomu
$$przycicie krawdzi v0->vl
ND=H@M5(?F2
'32? T#L#ULV:L'32? T#L#UL V:L'LP
$$przecicie zachodzi w punkcie z = near_clip_z, wic t =
#
3T?3?
T32? T#L#ULV:
$L:
P
$$podstaw t do skadowych rwnania krawdzi i wylicz wsprzdne
$$ x i y punktu przecicia z paszczyzn z
32? T#L#ULV:L:"# P
32? T#L#ULV: L: "# P
793
794
Czytanie kodw drukowanych w ksikach nie jest szczeglnie popularnym zajciem po pierwsze, kod
taki nie jest zwykle najbardziej czytelny. Ale niekiedy warto przeledzi kod wiersz po wierszu i sprawdzi,
czy dokadnie rozumie si znaczenie kadego kolejnego wywoania. Taka analiza nie moe, co prawda,
zastpi nieco bardziej oglnych wyjanie, wspieranych ewentualnie pseudokodem. Jednak wiele osb
uczy si w dokadnie odwrotny sposb, std decyzja o zamieszczeniu w ksice wydrukw kodw. Tak czy
inaczej, niezalenie od indywidualnego sposobu uczenia si warto sprbowa przeledzi dziaanie prezentowanej funkcji. Mona w niej zaobserwowa wiele podstawowych elementw programowania 3D, przy tym
jej analiza tylko z pozoru jest czasochonna w funkcji powtarzaj si przecie obszerne fragmenty kodu.
Korzystanie z funkcji jest za wprost miesznie proste. Jej wywoanie ma nastpujc posta:
=? ?MD/(DM,>H5(N%
'?#'3=,>?@,A?E?,C/DJ
=,>?@,A?B?,C/DJ
=,>?@,A?A?,C/DP
Wystarczy przekaza do funkcji list wywietlania (
), struktur opisujc kamer () i znaczniki
sterujce przycinaniem, a funkcja zajmie si ca reszt. Zauwamy, e funkcja obsuguje niezalene przycinanie wzgldem paszczyzn x, y i z. Po wczeniu wszystkich trzech z potoku usuwane s wszystkie przeszkadzajce do tej pory trjkty.
"
Jako przykad wykorzystania jeszcze ciepej funkcji przycinania wieloktw w przestrzeni trjwymiarowej
mona wykorzysta doczony do ksiki program demonstracyjny, obrazujcy wirowanie prostego
obiektu w przestrzeni. Kod rdowy programu znajduje si w pliku DEMOII10_1.CPP, a wersja wykonywalna w pliku DEMOII10_1.EXE; oba pliki znajduj si na doczonej do ksiki pycie CD-ROM. Do
skompilowania pliku kodu rdowego potrzebne s pliki od T3DLIB1.CPP do T3DLIB8.CPP wraz z odpowiednimi dla nich plikami nagwkowymi oraz pliki biblioteczne .LIB biblioteki DirectX. Zrzut ekranowy
dziaajcego programu prezentowany jest na rysunku 10.23. Program demonstracyjny wczytuje obiekt do
pamici i wywietla go na ekranie, powoli obracajc. Obiekt mona przysuwa i oddala od paszczyzny
rzutu oraz przesuwa, wymuszajc jego wykroczenie poza obszar widzenia.
795
Zrzut ekranowy
programu
demonstrujcego
dziaanie funkcji
przycinania
796
Nowe pola, modyfikujce dotychczasow posta struktury i wprowadzajce nowe zmienne dla pozycji
i orientacji rda wiata, zostay wyrnione wytuszczeniem. Jedyna rnica w obsudze tych struktur
polega bdzie na tym, e lokalna pozycja i orientacja rda wiata przechowywane bd w polach
i , ale dodatkowo w polach
i zapisane zostan wsprzdne rda wzgldem wsprzdnych
przestrzeni kamery. Pytanie, w jaki sposb dokona przeksztacenia wsprzdnych rda wiata? C,
oto funkcja, ktra si tym zajmie:
LH<?,>-HN%
,>-HN%?HMQ#$$tablica rde wiata
#2?,Q#$$liczba rde wiata w tablicy
OCHM>B5B5?HM#$$macierz przeksztacenia
#3?3#$$wskazanie kierunku transformacji
\
$$funkcja przeksztaca wsprzdne przekazanych rde wiata na podstawie
$$macierzy przeksztacenia; funkcja suy do umieszczenia rde wiata
$$w przestrzeni kamery, tak, aby obliczenia owietlenia daway poprawne wyniki
$$rwnie wtedy, gdy bd wywoywane ju po przeniesieniu wieloktw do
$$przestrzeni kamery; pniej dokonamy pewnych optymalizacji wykorzystujcych
$$informacje o typie rda wiata (i unikniemy niepotrzebnych obrotw),
$$cho przy tysicach wierzchokw przeksztacenie kilku rde wiata nie
$$wpywa na wydajno
$$UWAGA: funkcja ta musi zosta wywoana nawet wtedy, jeeli przeksztacenie
$$wsprzdnych rde wiata nie jest podane, czyli w przypadku
$$realizowania owietlenia w przestrzeni sceny - w takim przypadku funkcja
$$zajmuje si skopiowaniem do pl roboczych lokalnych wartoci wsprzdnych
$$i orientacji; funkcj naley wtedy wywoa ze znacznikiem
$$TRANSFORM_COPY_LOCAL_TO_TRANS, a jako macierz przeksztace przekaza NULL
#32?Q#P$$indeks biecego rda wiata
OCHM>B5B5P$$macierz wykorzystywana do konfigurowania aspektu obrotu
$$wektory orientacji rda wiata musz zosta obrcone, ale przedtem
$$naley wyzerowa w macierzy przeksztacenia wspczynniki przesunicia;
$$w przeciwnym przypadku wynik przeksztacenia bdzie nieprawidowy
<
#]/I,,
\
OCH?=@A?5B5
#'P
$$wyzeruj wspczynniki przesunicia
:O&:O& :O&%P
_
797
798
Wywoanie to powoduje przeksztacenie wsprzdnych czterech rde wiata zebranych w tablicy
wzgldem macierzy przeksztace , przy czym transformacja powinna dokona przeksztacenia
lokalnych wsprzdnych rde wiata do wsprzdnych przestrzeni kamery. Nowe wsprzdne umieszczone zostan w polach wsprzdnych transformowanych. Dysonujc ju nowymi strukturami opisujcymi
rda wiata i sposobem ich wypeniania naleaoby pozmienia w pliku T3DLIB.CPP i T3DLIB.H deklaracje odwoujce si do poprzednich wersji struktury:
,>-HN%Q#%UOCB?,>-HVP$$rda wiata sceny
W pliku nagwkowym trzeba umieci nowe definicje staych dla rde wiata:
$$definicje dla drugiej wersji struktury rda wiata
;<,>-HN%?CHHM?COF>D/H $$proste wiato otaczajce
;<,>-HN%?CHHM?>/R>/>HD%$$nieskoczone rdo wiata
;<,>-HN%?CHHM?(>MD=H>@/C,%$$nieskoczone rdo wiata (alias)
;<,>-HN%?CHHM?@>/H5$$punktowe rdo wiata
;<,>-HN%?CHHM?@H,>-H 6$$stokowe rdo wiata typ 1 (prosty)
;<,>-HN%?CHHM?@H,>-H% $$stokowe rdo wiata typ 2 (zoony)
;<,>-HN%?HCHD?@/ $$wiata wczone
;<,>-HN%?HCHD?@RR$$wiata wyczone
$$znaczniki sterujce kierunkiem transformacji
;<HMC/R@MO?=@A?,@=C,?H@?HMC/&$$kopiowanie bez przeksztacania
Nowe stae maj dokadnie te same wartoci, co analogiczne stae definiowane na potrzeby struktury ,
rnice sprowadzaj si do zmiany jednego znaku w przedrostku nazwy staej. Cakiem nowa jest za to
warto znacznika sterujcego transformacj wsprzdnych rda wiata: !"#$"%&"$" .
Jej przekazanie do funkcji transformacji wsprzdnych rde wiata powoduje proste skopiowanie
wsprzdnych lokalnych do pl wsprzdnych transformowanych.
Czeka nas jeszcze mudna czynno przepisania wszystkich funkcji obliczajcych owietlenie. W adnej
z nich nie bdzie trzeba wprowadza znaczcych zmian. Poza zmian nazwy struktury modyfikacje
sprowadz si do wykorzystywania w obliczeniach nie pl
i , a pl
i . Z racji obszernoci
kodu wymagajcego poprawek nie zostanie tu zamieszczony peny wydruk poprawianych funkcji; wymienione zostan za to ich prototypy:
#,Q#?@FGD=H5(N%?S%? 7
@FGD=H5(N%?HM*$$przetwarzany obiekt
=CO5(N ?HM3$$pooenie kamery
,>-HN%?HMQ#$$lista rde wiata (moe zawiera wiele wiate)
#?Q#P$$maksymalna liczba wiate na licie
#,Q#?@FGD=H5(N%?S%
@FGD=H5(N%?HM*$$przetwarzany obiekt
=CO5(N ?HM3$$pooenie kamery
,>-HN%?HMQ#$$lista rde wiata (moe zawiera wiele wiate)
#?Q#P$$maksymalna liczba wiate na licie
799
Jedyna rnica pomidzy nowymi a poprzednimi wersjami tych funkcji polega na wprowadzeniu do nich
jednego nowego parametru: wskanika do tablicy rde wiata. Dziki temu system owietlenia moe
operowa na wicej ni jednym zestawie wiate systemu.
Nadajc rdu wiata pozycj bd orientacj naley zadba, aby ostatni parametr przekazywanego
punktu POINT4D (przy nadawaniu pozycji) bd wektora VECTOR4D (przy nadawaniu orientacji)
mia warto 1,0. W przeciwnym przypadku przy transformowaniu wsprzdnych rda wiata
wspczynnik przesunicia macierzy przeksztace nie bdzie mia wpywu na wynik przeksztacenia!
W ramach testu nowych wersji funkcji owietlenia wystarczy uruchomi znane Wam ju programy demonstracyjne. Gwnym celem przekonstruowania funkcji owietlenia byo umoliwienie realizacji oblicze zwizanych z owietleniem rwnie w przestrzeni kamery, w celu minimalizacji liczby owietlanych
wieloktw.
Przyczyn implementowania moduw przycinajcych jest wiele, ale motywem gwnym jest ch zminimalizowania liczby wieloktw przekazywanych do dalszych etapw potoku przetwarzania i zagwarantowanie, e aden z wieloktw o wsprzdnej z rwnej 0 nie zostanie przekazany do rzutowania, co
mogoby spowodowa bdy w obliczeniach rzutu perspektywicznego. Jak dotychczas, przycinanie testowalimy w pustych scenach z niewielk liczb obiektw, pozbawionych wielkich wieloktw i geometrii
wntrza (np. pomieszcze), przez co ryzyko, e dojdzie do sytuacji potencjalnie prowokujcych bdy
rzutowania, byo niemal zerowe. Wci nie mamy moliwoci przetestowania przycinania w scenach
z architektur wntrz bd z obszernymi krajobrazami, jak wic moemy ocenia jako i efektywno
przycinania? Ten dotkliwy brak sprowokowa mnie do napisania prostego silnika tworzcego wizualizowany teren z wykorzystaniem techniki kafelkowania terenu, tworzonego na podstawie mapy wysokoci.
Implementacja rodzi dwa problemy. Po pierwsze, nie dysponujemy adn struktur do przechowywania
obiektw poza "'()$*+, ktra raczej nie jest przystosowana do reprezentowania wielkich obszarw,
ale na razie bdzie musiaa wystarczy. Prawdziwym problemem jest jednak fakt, e generowane technik
800
kafelkowania tereny skadaj si w najlepszym razie z tysicy, a w najgorszym nawet z milionw wieloktw. Jednak przy podejciu zdroworozsdkowym i zastosowaniu algorytmu sektoryzacji terenu jest nadzieja, e uda si wyeliminowa nawet 99 procent wieloktw! Dziki podziaowi na sektory czy te aty
mona tworzy olbrzymie tereny, ukadajc ssiadujco kolejne aty terenu i przetwarzajc wycznie te
z nich, ktre znajduj si w danej chwili w polu widzenia. Kada taka ata terenu bdzie pewnym osobnym obiektem, przechowywanym wraz z innymi obiektami at w tablicy terenu patrz rysunek 10.24.
Przykad reprezentowania rozlegego terenu po jego podziale na aty
Do uzyskania rozlegego terenu mona wykorzysta wiele takich obiektw, a nastpnie za pomoc metody
usuwania ze sceny caych obiektw eliminowa te aty terenu, ktre nie s w danej chwili widoczne i nie
musz by przetwarzane. Nie usuwa to jednak wszystkich trudnoci nawet pojedyncza ata moe zawiera
32 na 32, 64 na 64, albo nawet 256 na 256 wartoci wysokoci, a wic skada si z 31 na 31, 63 na 63 bd
nawet 255 na 255 kafelkw (liczba kafelkw jest zawsze o jeden mniejsza od liczby wartoci wysokoci
w danej acie, a to dlatego, e jedna z wartoci wysokoci, leca na graniczy dwch at, jest dla nich
wsplna). Std w pojedynczej acie moe znajdowa si 312 2, 632 2 albo nawet 2552 2 trjktw!
Tak wic, mimo usunicia wikszoci obiektw liczba wieloktw do przetworzenia jest poraajca. Porzdny silnik wizualizujcy trjwymiarowy obraz terenu wymaga realizowanej w czasie rzeczywistym
analizy pewnego poziomu szczegowoci obrazowania terenu, pozwalajcej na zmniejszenie liczby
wieloktw w jednym, a zwikszenie jej w innym miejscu terenu. W efekcie dla obrazowania pojedynczej aty, skadajcej si z 64 na 64 kafli, po dwa trjkty na kafel (razem 8192 trjktw!), mona uzyska redukcj liczby wieloktw do zaledwie kilkuset! Nie bdziemy tu jednak opisywa algorytmw realizujcych tak analiz, gdy nie temu powicony jest biecy rozdzia.
Na razie naleaoby powiedzie, w jaki sposb utworzy prosty teren, ktry mona by wygenerowa za
pomoc pojedynczego wywoania funkcji i reprezentowa w systemie jako standardowy obiekt, ktry
podda si obrbce w znany ju nam sposb.
)&
Trjwymiarowy teren mona wygenerowa na co najmniej kilka sposobw: wylosowa wartoci wysokoci,
wykorzysta dostpne w Internecie dane satelitarne, dokona konwersji z mapy wysokoci kodowanych
kolorami i tak dalej. Tutaj pokaemy, jak wygenerowa teren na podstawie mapy wysokoci kodowanych
801
kolorami. Plan dziaania zakada wczytanie 256-kolorowego obrazka, w ktrym poszczeglne wartoci
kolorw koduj wysokoci w odpowiednich punktach modelowanego terenu oraz wczytanie obrazka
z tekstur, ktra zostanie naoona na szkielet terenu. Przykadowy obrazek (rzecz jasna mocno zmniejszony)
z map wysokoci kodowan kolorami widnieje na rysunku 10.25. Zobaczmy, jak rne kolory pikseli
obrazka mog reprezentowa rnice w wysokoci ssiadujcych ze sob kafli terenu.
Rysunek rastrowy
nadajcy si
do wykorzystania
w roli mapy
wysokoci
802
Generowanie siatki wysokoci sprowadza si, jak pokazuje rysunek 10.26, do skonstruowania (przy zachowaniu ostronoci w obliczaniu zakresu) kilku ptli . Algorytm generujcy tworzy dla kadego
kwadratowego kafla wysokoci dwa trjkty, ktrych wysoko (wartoci wsprzdnych y wierzchokw) definiowana jest indeksem koloru w mapie wysokoci i ewentualnie wspczynnikiem skalowania.
Konieczne jest rwnie okrelenie ziarnistoci siatki, czyli dugoci i szerokoci (albo szerokoci i gbokoci, jak kto woli) kadego z kafli. Siatka wysokoci bdzie bowiem generowana w oparciu o paszczyzn x-z, a wartoci kolorw poszczeglnych pikseli bd definioway wartoci wsprzdnych y (wysokoci) w naronikach odpowiednich kafli. Nastpnie dla kadego kafla utworzone zostan dwa trjkty,
ktrych wierzchoki bd pniej umieszczone na licie wierzchokw obiektu reprezentujcego at.
Jak ju wspomniano, podczas obliczania zakresu ptli naley uwaa na pojawiajce si bdy przekroczenia zakresu. Bdy te czsto popeniane s niejako z rozpdu, bo pierwsza odpowied na pytanie o liczb liczb cakowitych w zakresie od 0 do 10 jest zwykle bdna w zakresie tym mieci si bowiem nie
dziesi, a 11 liczb! A ile potrzeba linii do wyznaczenia na placu piciu miejsc parkingowych? Cztery,
rzecz jasna. Odpowiedzi 10 albo 5 na powysze pytania to wanie bdy przekroczenia zakresu. Poprawne
okrelenie granic dla ptli jest niezwykle istotne podczas operacji takich, jak generowanie siatki, poniewa zbyt duy zakres moe spowodowa wdrwk po pamici i na przykad zakci dziaanie algorytmu
albo przynajmniej wprowadzi do siatki dziwne anomalie. W takich przypadkach do kontroli poprawnoci
przebiegw ptli najlepiej wykorzysta metod rcznego wykonania ptli okrelonej dla maego zakresu,
jak 1 na 1, ewentualnie 4 na 4. Wyniki testu mona spokojnie uoglni na dowolnie due zakresy.
Dalej, rczne konstruowanie struktury obiektu "'()$*+ nie jest szczeglnie skomplikowane. Po prostu
strumie informacji, ktre normalnie s odczytywane z pliku obiektu, naley wygenerowa wasnorcznie. Do tego potrzebna bdzie lista wierzchokw, lista wieloktw, numery wieloktw i ich atrybuty.
Nic z tego nie powinno sprawi wikszych trudnoci, z wyjtkiem moe atrybutw wieloktw, a wic
informacji o teksturowaniu i owietleniu. Informacje te musz zosta przekazane do funkcji generujcej
za porednictwem nastpujcych staych:
$$definicje staych wieloktw, wersja 2.
$$atrybuty wielokta i jego ciany
)*+,"#%-./!!(.-0#𝤙
;<@,A5(N%?CHHM?HMC/CMD/H%
)*+,"#%-./!!(.45!'+(12111"
)*+,"#%-./!!(.(6537121114
;<@,A5(N%?CHHM?M-F%5
)*+,"#%-./!!(.08/#&.9#&.:(&1211-1
)*+,"#%-./!!(.08/#&.9#&.' 0!/ !1211-1;;(alias)
)*+,"#%-./!!(.08/#&.9#&.&900%&1211-1;;(alias)
)*+,"#%-./!!(.08/#&.9#&.<+/!1211"1
)*+,"#%-./!!(.08/#&.9#&.6:(/:#121141
;<@,A5(N%?CHHM?C(D?O@(D?@/-
;<@,A5(N%?CHHM?C(D?O@(D?RCH@/- $$(alias)
;<@,A5(N%?CHHM?C(D?O@(D?HDBHIMD%
$$nowe
;<@,A5(N%?CHHM?D/CF,D?OCHDM>C,6$$owietlanie z materiaem
;<@,A5(N%?CHHM?(>CF,D?OCHDM>C,6$$owietlanie z kolorami podstawowymi
Interesowa bd nas te stae reprezentujce atrybuty, ktre zostay wyrnione wytuszczeniem. Zatrzymajmy
si przy nich przez chwil. Generator terenu moe tworzy paszczyzny terenowe w trybach koloru omiobitowego bd szesnastobitowego, dlatego na pewno konieczne bdzie ustawienie jednego ze znacznikw:
@,A5(N%?CHHM?6F>H=@,@M
@,A5(N%?CHHM?M-F 7
Dalej, funkcja generowania terenu bdzie potrafia tworzy tereny kolorowane jednolicie lub cieniowane
pasko bd metod Gourauda, poniewa cieniowanie to nie jest zbyt wymagajce i sprowadza si do
wyliczenia wektorw normalnych wieloktw. Po utworzeniu siatki wyliczenie wektorw normalnych
sprowadza si za do wywoania nastpujcych funkcji:
803
Gdyby za teren mia zosta oboony tekstur, trzeba by wczy mapowanie tekstury, a wic przekaza
do funkcji generujcej teren sta:
@,A5(N%?CHHM?C(D?O@(D?HDBHIMD
Tyle, e przy wczonym teksturowaniu dostpne tryby cieniowania to cieniowanie paskie i cieniowanie
jednolite, nie mona wic wczy rwnoczenie teksturowania i cieniowania metod Gourauda. No dobrze,
pora na przykad. Aby utworzy cieniowany metod Gourauda, wizualizowany w trybie szesnastobitowego
koloru, pozbawiony tekstury teren, naley wykorzysta nastpujc kombinacj staych:
@,A5(N%?CHHM?M-F 7J@,A5(N%?CHHM?C(D?O@(D?-@IMCI(
Aby za utworzy teren pasko cieniowany i oboony tekstur, naley skomponowa nastpujc warto:
@,A5(N%?CHHM?M-F 7J@,A5(N%?CHHM?C(D?O@(D?R,CHJ@,A5(N%?CHHM?C(D?O@(D?HDBHIMD
Jak wida, atrybuty skada si za porednictwem logicznej sumy odpowiednich staych. W porzdku, zastanwmy si nad obsug teksturowania siatki terenu.
Przyjrzyjmy si rysunkowi 10.27. Jest to rysunek, ktry zostanie wykorzystany do pokrycia terenu tekstur
(zosta wygenerowany przez stosowny program wanie jako tekstura terenowa, std jego odpowiedni wygld).
Rysunek ma rozmiar 256 na 256 pikseli, ale nie jest to wymg sztywny rysunki tekstury mog mie
dowolny rozmiar, byle by on potg liczby 2. Tekstura moe mie nawet 88 pikseli. Rozmiar 256256
to najwikszy rozmiar obsugiwanej przez nasz system pojedynczej tekstury.
Przykadowa
tekstura terenu
Teksturowanie polega tu na obliczeniu wsprzdnych mapowania zadanej tekstury wejciowej przy rozcigniciu jej na siatk terenu. Mapowanie to odbywa si przez przypisanie wsprzdnych tekstury do
poszczeglnych wierzchokw siatki. Mona by, rzecz jasna, wykorzysta duo wiksze tekstury, dopasowujc je do wymaga systemu przez podzielenie na 256-pikselowe bloki przypisanie tych blokw do
poszczeglnych wieloktw, ale na razie wystarczy metoda prostsza, bo przecie nie chodzi nam o pen
804
wierno odwzorowania terenu teren potrzebny jest jedynie do demonstracji dziaania funkcji przycinania. Tak wic, jeeli teren ma zosta pokryty tekstur, konieczne bdzie przekazanie do funkcji tworzcej teren obok nazwy pliku mapy wysokoci kodowanych kolorami nazwy pliku rysunku tekstury.
Funkcja przeliczy wsprzdne mapowania tekstury do oboenia terenu. Cao nie wydaje si skomplikowana, znw bowiem operowa bdziemy szerokoci, dugoci i liczb kafli w siatce terenu.
Podsumowujc: jeeli podczas generowania terenu ma on zosta oboony tekstur, konieczne bdzie
przekazanie do funkcji nazwy pliku zawierajcego szesnastobitow tekstur. Musi ona by, rzecz jasna,
kwadratowa. Funkcja generujca teren dokona odwzorowania wierzchokw kafli w teksturze, obliczajc
wsprzdne mapowania tekstury dla kadego wierzchoka kadego trjkta kadego kafla.
To tyle na temat funkcji generujcej teren. W wikszoci przypadkw przyjmuje ona na wejciu dwa pliki.
Jeden z nich to kodowana na 256 kolorach mapa wysokoci (plik w formacie .BMP), ktra w miar moliwoci powinna by kwadratowa. Zwykle dla mapy wysokoci wystarcza rozmiar 40 na 40 pikseli ju
i tak oznacza to konstruowanie siatki z co najmniej 39 kafli, a wic z 392 * 2, czyli z 3 042 trjktw, co
w zupenoci wystarczy jak na moliwoci prostego, programowego silnika graficznego.
Pora na przegld kodu rdowego samej funkcji; w dalszej czci rozdziau pokazane zostan rwnie
przykady jej wywoania.
#-#?H?@FGD=H5(N%
@FGD=H5(N%?HM*$$wskanik do obiektu
<###Q$$szeroko terenu - warto osi x we wsprzdnych sceny
<##QQ#$$dugo (gboko) terenu
<#L3$$wspczynnik skalowania wartoci wysokoci
3Q"QQ#??<$$nazwa pliku mapy wysokoci kodowanych na 256 kolorach
3Q"##2??<$$nazwa pliku tekstury
#3$$kolor terenu, jeli ten nie jest teksturowany
ND=H@M5(?HM$$pocztkowa pozycja terenu
ND=H@M5(?HM$$pocztkowy kt obrotu
# ?##$$atrybuty cieniowania
\
$$funkcja generuje teren o rozmiarze twidth na theight w paszczynie x-z;
$$teren jest definiowany wartociami wysokoci kodowanymi jako indeksy
$$kolorw w mapie wysokoci, w ktrej kolor o indeksie 0 oznacza poziom
$$minimalny gruntu, a 255 - poziom maksymalny, a wic 1.0. Wysoko moe
$$by skalowana wspczynnikiem vscale; wygenerowana siatka wysokoci
$$zoona bdzie z trjktw, ktrych wierzchoki bd miay wsprzdne
$$okrelone na podstawie mapy wysokoci - dla mapy o rozmiarze 256x256
$$siatka wysokoci bdzie miaa rozmiar (255 - 1)x(255 - 1) wieloktw,
$$pokrywajcych w przestrzeni sceny obszar o rozmiarach twidth na theight;
$$w przypadku okrelenia pliku tekstury zostanie ona naoona na teren przez
$$obliczenie jej wsprzdnych; funkcja generuje tereny w trybach 8- i
$$16-bitowego koloru; dla danego trybu koloru naley dobra odpowiedni
$$gbi koloru tekstury!
3Q2<<U%87VP$$bufor roboczy
<#3?##?##P
<#3?L#?L#P
#32P
#Q#P
F>HOC?R>,DQQ#?#P$$mapa wysokoci
$$krok 1. wyzeruj i zainicjalizuj obiekt
#
*
<
@FGD=H5(N%P
$$ustaw stan obiektu na aktywny i widoczny
*T##@FGD=H5(N%?HCHD?C=H>NDJ@FGD=H5(N%?HCHD?N>>F,DP
$$ustaw pozycj obiektu
*T?:TP
*T?: T P
*T?:
T
P
*T?:TP
805
806
$$wczytaj rysunek tekstury (pniej mona doda obsug rnych gbi koloru)
<
*T##2T 7
,?>?F# 7
*T##2
'# 7#F>HOC?DBHMC=H?O@(D?CFP
\
,?>?F#
*T##2
'# 7#F>HOC?DBHMC=H?O@(D?CFP
_$$else 8 bit
$$oblicz wspczynniki krokowe mapowania wsprzdnych tekstury
3?##
<#
# 7#:#<Q:S#QT $
<#
32T P
?##
<#
# 7#:#<Q:Q#T $
<#
T P
$$oznacz obiekt jako posiadajcy tekstur
DH?F>H
*T##@FGD=H5(N%?CHHM?HDBHIMDP
$$zrobione, zwolnij bitmap
I?F#?R
'# 7#P
_$$if
S#?D
`K32aa`32P
S#?D
`K3?L#a<?L#a<`3?L#?L#P
S#?D
`K3?##a<?##a<`3?##?##P
S#?D
`K2?L#3a2? a`
*T2?L#3*T2? P
$$krok 4. generowanie listy wierzchokw i wsprzdnych tekstury
$$po kolejnych wierszach
<
#32?P32?P32?
\
<
#32?3P32?332P32?3
\
#L#
32?"3232?3P
$$oblicz wsprzdne wierzchoka
*TL#?3UL#V:32?3"3?L#T
##Q$%P
*TL#?3UL#V: L3"
<#QQ#?#:2<<U32?3
32?"32V$%88P
*TL#?3UL#V:
32?"?L#T
#QQ#$%P
*TL#?3UL#V: P
$$kady wierzchoek posiada przynajmniej atrybut punktu
DH?F>H
*TL#?3UL#V:##NDMHDB5(HN ?CHHM?@>/HP
$$czy wierzchoek potrzebuje wsprzdnych tekstury?
<
?##'@,A5(N%?CHHM?C(D?O@(D?HDBHIMD''##2??<
\
$$wsprzdne tekstury
*T##UL#V:32?3"3?##P
*T##UL#V: 32?"?##P
_$$if
S#?D
`KS
3Q.a+NUa<a<a<VHUa<a<V`
L#*TL#?3UL#V:
*TL#?3UL#V:
*TL#?3UL#V:
*T##UL#V:
*T##UL#V: P
_$$for dla curr_col
_$$for dla curr_row
807
808
809
*T#U V:L#U V
*T#U V:L#U%V
*T#U V:##UV
*T#U V:##U V
*T#U V:##U%VP
_$$end
;<
$$oblicz dugoci wektorw normalnych wieloktw
=2#?@FGD=H5(N%? ?/
*P
$$dla wieloktw cieniowanych metod Gourauda oblicz wektory normalne wierzchokw
=2#?@FGD=H5(N%?N#?/
*P
$$zwr kod prawidowego wykonania funkcji
#2
P
_$$Generate_Terrain_OBJECT4DV2
Funkcja zostaa zaimplementowana w oparciu o modu wczytujcy pliki .PLG, a to dlatego, e modu ten
dysponuje moliwoci konstruowania obiektu "'()$*+; proces konstruowania obiektu zosta rozszerzony tylko o procedur generowania terenu. Spjrzmy teraz, w jaki sposb mona korzysta z tak zdefiniowanej funkcji. Ponisze wywoanie generuje teren o rozmiarze 3232, oboony tekstur, ktry zostanie rozcignity na obszarze o rozmiarze 40004000 punktw w przestrzeni sceny. Mapa wysokoci
zapisana jest w pliku EARTHHEIGHTMAP01.BMP, a tekstura rysunek o rozmiarze 256 na 256 pikseli
i 16-bitowej gbi koloru w pliku EARTHCOLORMAP01.BMP:
ND=H@M5(#?\_P
#-#?H?@FGD=H5(N%
'*?#$$wskanik do obiektu
5$$szeroko terenu - warto osi x we wsprzdnych sceny
5$$dugo (gboko) terenu
c$$wspczynnik skalowania wartoci wysokoci
`#QQQ# :`$$nazwa pliku mapy wysokoci kodowanych na 256 kolorach
`#Q3 :`$$nazwa pliku tekstury
M-F 7F#
%88%88%88$$kolor terenu, jeli ten nie jest teksturowany
'#?$$pocztkowa pozycja terenu
/I,,$$pocztkowy obrt
@,A5(N%?CHHM?M-F 7J@,A5(N%?CHHM?C(D?O@(D?R,CHJ
@,A5(N%?CHHM?C(D?O@(D?HDBHIMDP
Znaczenie parametrw przekazywanych do funkcji nie wymaga chyba szerszego komentarza do funkcji przekazywany jest docelowy rozmiar terenu we wsprzdnych przestrzeni sceny, wspczynnik skalowania wysokoci (wszystkie wartoci mapy wysokoci zostan przemnoone przez ten wspczynnik,
wic najwysz wysokoci bdzie 700). Dalej przekazywane s nazwy plikw mapy wysokoci i tekstury
(gdyby teren nie mia by teksturowany, w miejsce nazwy pliku tekstury naleaoby przekaza ,). Nastpny parametr to kolor terenu (przy wczonym teksturowaniu parametr ten jest ignorowany), nastpnie
przekazywana jest pocztkowa pozycja terenu we wsprzdnych sceny (tutaj jest to punkt o wsprzdnych
(0, 0, 0)), pocztkowy obrt i zestaw atrybutw wieloktw (tutaj atrybuty dla paskiego cieniowania
wieloktw i trybu 16-bitowej gbi koloru).
Obiektw reprezentujcych teren mona tworzy dowolnie duo, a przez ich odpowiednie czenie tworzy
rozlege wiaty, na przykad skadajce si z 16 na 16 takich obiektw; taka liczba at wymaga ju usuwania czci obiektw z potoku przetwarzania. Jednake jak ju powiedziano zadaniem tworzonego
programu jest jedynie demonstracja obsugi duych wieloktw wymagajcych przycinania, a to zadanie
spenia on znakomicie.
*
+
Dotychczasowy sposb konstruowania terenu jest wietny, ale moe istnieje sposb samodzielnego jego
wygenerowania, bez podpierania si gotow map wysokoci? C, naturalnie mona sprbowa napisa
specjalny program. Due znaczenie ma te odpowiedni dobr tekstury czapy niene powinny zalega na
szczytach, a nie w depresjach, gdzie powinna krlowa woda. Wikszo ludzi korzysta jednak z gotowych
810
programw generujcych teren. Potrafi one wygenerowa zarwno plik rysunku z map wysokoci, jak
i odpowiedni plik tekstury. Jednym z takich programw jest VistaPro, ktry doczeka si ju bodaj wersji
4.0.1. Licencja tego programu zostaa odsprzedana wielu producentom, wic jeli kto chce go znale,
najlepiej zasign jzyka w jednej z wyszukiwarek internetowych. Innym programem generujcym tereny
jest Bryce autorstwa zespou Metacreations, jednak rwnie ta firma zostaa ju sprzedana, a ich produkty
przej Corel. Nie s to, rzecz jasna, jedyne tego typu programy w sieci s ich dziesitki, w tym wiele
darmowych.
,&
$
W porzdku, wypadaoby wreszcie poczy generator terenu i modu przycinania i sprawdzi, jak to
wszystko dziaa! W tym celu utworzony zosta program demonstracyjny (jego kod rdowy znajduje si
w pliku DEMOII10_2.CPP, a wersja wykonywalna w pliku DEMOII10_2.EXE; wersja dziaajca
w 8-bitowej gbi koloru to odpowiednio pliki DEMOII10_2_8b.CPP i DEMOII10_2_8b.EXE). Demonstracja ma posta symulacji jazdy po pustynnej wyspie patrz rysunki 10.28 i 10.29. Do kompilacji
plikw niezbdny jest gwny plik kodu rdowego, pliki od T3DLIB1.CPP do T3DLIB8.CPP (wraz z odpowiednimi plikami nagwkowymi) oraz pliki .LIB biblioteki DirectX.
Zrzut ekranowy
program
demonstracyjny
dziaajcy w trybie
wizualizacji
szkieletowej
Zrzut ekranowy
program
demonstracyjny
dziaajcy w trybie
wizualizacji
teksturowanej
811
Program jest, jak zwykle w przypadku programw demonstracyjnych, bardzo uproszczony. Za pomoc
pojedynczego wywoania tworzony jest obiekt terenu (parametry wywoania funkcji generujcej s zgodne
z tymi prezentowanymi w poprzednich punktach), po czym nisko nad terenem ustawiana jest kamera, ktrej ruchem mona sterowa tak, jakby obserwator jedzi po wydmach samochodem terenowym. Przed
przystpieniem do zabawy mam jednak jeszcze kilka wyjanie.
Klawisze sterujce wywietlane s w ramach ekranu pomocy wczanego klawiszem H, ale wystarczy
zapamita, e przycinanie 3D wzgldem poszczeglnych paszczyzn wcza si i wycza klawiszami X,
Y i Z. Jedc wok wyspy warto zwrci uwag na jako dziaania przycinania w pobliu dolnej krawdzi ekranu i przyjrze si zmianom w obrazowaniu po wczeniu (i wyczeniu) przycinania wzgldem
poszczeglnych paszczyzn.
Po wyczeniu przycinania wzgldem paszczyzny z (a wic midzy innymi wzgldem bliszej
paszczyzny przycinania) mona doprowadzi do zawieszenia programu w wyniku przetwarzania
i rzutowania duych wieloktw, przenikajcych przez paszczyzn z = 0. Nie trzeba si naturalnie
obawia, e zawieszenie programu czy jego awaryjne zamknicie spowoduje trwae uszkodzenie
komputera! W celu lepszej obserwacji efektw przycinania warto wczy tryb szkieletowy (suy
do tego klawisz W).
*!"
Algorytm wizualizacji terenu i prosty model fizyczny pozwalajcy obserwatorowi prowadzi wirtualny pojazd
poruszajcy si po wydmach teksturowanej wyspy s powizane, dlatego zostan omwione razem. Problem
definiowany jest nastpujco: dana jest kamera, ktra reprezentuje widok z perspektywy prowadzcego
azik (widok jest oczywicie czciowo przesonity desk rozdzielcz azika). Prowadzcy-gracz musi
mie moliwo poruszania si nad terenem bez wjedania we wzniesienia, std konieczno przeliczania
wysokoci terenu pod kamer i odpowiednie przesuwanie w pionie pozycji obserwatora. Ilustracj problemu
jest rysunek 10.30.
Poruszanie si
po terenie
Tak postawione zadanie mona jak zwykle wykona na szereg sposobw. Mona by na przykad zaimplementowa w programie jak najbardziej zbliony do rzeczywistego model fizyczny, uwzgldniajcy nawet
biecy pd azika, ale byaby to przesada w przypadku prostego programu demonstracyjnego. Mona by
rwnie przesadzi w drug stron i ustawia kamer w najwyszym punkcie danego kafla, ale ruch
812
pojazdu byby wtedy bardzo mao rzeczywisty, std decyzja o implementacji rozwizania poredniego,
a wic o uwzgldnieniu w modelu fizycznym prdkoci, grawitacji i chwilowego przyspieszenia kamery
(poniewa kamera jest dla gracza tym samym, co pojazd, pozycja kamery bdzie niekiedy nazywana pozycj azika i odwrotnie). Oto gwne zaoenia modelu fizycznego:
Pojazd posiada wektor prdkoci warto prdkoci i jej kierunek, kontrolowane klawiszami
kursora (podczas naciskania klawiszy strzaki w przd bd w ty na pojazd dziaa stae przyspieszenie).
Na pojazd stale dziaa skierowana w d sia przycigania ziemskiego; wynikiem jej uwzgldnienia
do obliczenia numeru kafla, nad ktrym porusza si pojazd, a nastpnie obliczana jest rednia
wysoko wierzchokw kafla. Obliczona w ten sposb rednia wysoko kafla jest porwnywana
z biec wysokoci pojazdu, a jeeli ta ostatnia jest mniejsza ni wysoko terenu, prdko
wznoszenia pojazdu jest zwikszana z chwilowym przyspieszeniem proporcjonalnym do rnicy
wysokoci. Dodatkowo wysoko pojazdu jest ograniczana tak, aby po wykryciu urwiska o duym
nachyleniu pojazd skokowo zmienia wysoko tak, aby nie wbi si w cian urwiska.
Poza ingerowaniem w wysoko pojazdu poruszajcego si po terenie, wraz ze zmian gradientu
wysokoci terenu zmieniane jest nachylenie kamery. Daje to iluzj podnoszenia i opuszczania
przodu pojazdu zgodnie z nachyleniem zboczy.
Na koniec model fizyczny jest stabilizowany tak, e w przypadku, kiedy zmiany pozycji
To naprawd bardzo prosty model jedynymi danymi wejciowymi s biece wsprzdne kamery.
813
814
To ju koniec opisu tego programu demonstracyjnego. Teraz powinnicie samodzielnie pobawi si zmiennymi
definiujcymi fizyk efektem moe by albo wraenie poruszania si stutonowym czogiem, albo lekkim
skuterem wodnym. Przy odrobinie inwencji wasnej mona te rozszerzy program, dodajc do niego
rne obiekty, by na przykad stworzy proste wycigi samochodowe, wycigi odrzutowcw czy konkurs
zjazdu na desce snowboardowej ograniczeniem jest chyba wycznie wyobrania. Utworzenie programu
demonstracyjnego dla deski snowboardowej byoby naprawd proste. Wystarczy utworzy 16 bd 32
aty terenu, kada po 32 na 32 kafle, kada zajmujca, dajmy na to, 2000 na 2000 punktw przestrzeni
sceny.Nastpnie naleaoby poczy aty tak, aby utworzyy jeden duy stok. Modu usuwajcy obiekty
usuwaby aty znajdujce si poza zasigiem wzroku (poza dalek paszczyzn przycinania), a modu
przycinajcy zajby si reszt; przed kamer wystarczyoby ju tylko umieci wizerunek deski, zmieni
map wysokoci i szusowa!
Dobrze, e rozdzia ten mamy ju za sob cige ustawianie bliszej paszczyzny przycinania w odlegoci roku wietlnego od obserwatora, w celu uniknicia potencjalnych bdw i niedokadnoci rzutowania, byo ju doprawdy mczce. Teraz rzeczy maj si zupenie inaczej. Poza tym zyskalicie pewne
pojcie o algorytmach przycinania i, co najwaniejsze, chyba przekonalicie si, e nie s one tak skomplikowane, jakby si mogo wydawa wystarczy pamita o kilku szczegach. Dodanie mechanizmu
usuwania w caoci wieloktw znajdujcych si poza dalek paszczyzn przycinania lub na zewntrz
bryy citego ostrosupa widzenia naprawd przyspiesza potok, dziki czemu nasz silnik graficzny jest
jeszcze szybszy. Wreszcie jako premi zyskalimy prost gr terenow, ktr mona przerobi na wycigi
terenowe czy wodne nie bd to moe wycigi porwnywalne z V-Rally, ale jak na pocztek chyba
i tak okazae. No i co te ma swoje znaczenie by to ostatni rozdzia, w ktrym zajmowalimy si
jeszcze obsug trybw omiobitowych.