You are on page 1of 73

IDZ DO

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

Swoje triki zdradz Ci prawdziwi guru ze wiata twrcw gier


Tworzenie gier 3D wymaga opanowania nie tylko jzyka programowania, ale take
wielu innych dziedzin wiedzy -- analizy matematycznej, rachunku macierzowego
i wektorowego oraz geometrii. Oczywicie kada z tych nauk zostaa ju opisana
w dziesitkach tomw. Ksika, ktr trzymasz w rce, zawiera wszystkie informacje
niezbdne do stworzenia gry 3D dziaajcej w rodowisku Windows, zebrane w jednym
tomie. Korzystajc z niej, nie bdziesz ju musia przerzuca tysicy stron
w poszukiwaniu potrzebnego Ci wzoru.
Autor ksiki, wykorzystujc ponad dwudziestopicioletnie dowiadczenie
w programowaniu, przedstawi Ci:
algorytmy matematyczne wykorzystywane w grafice 3D,
zasady programowania w Windows i DirectX,
algorytmy wywietlania grafiki 2D i 3D,
techniki animacji i renderingu 3D,
mapowanie tekstur,
techniki symulacji owietlenia i wiele innych informacji.
Korzystajc z tej ksiki, opracujesz doskonay, oparty wycznie na warstwie
oprogramowania silnik 3D dla gry, wykorzystasz w swoich grach modele i postaci
stworzone w programach 3D, stworzysz realistyczn sceneri gry 3D i zoptymalizujesz
kod rdowy programu pod ktem szybkoci jego wykonywania.

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

Triki najlepszych programistw gier 3D. Vademecum profesjonalisty




%!"&'&! 

(
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

Trjwymiarowe wsprzdne sferyczne ..............................................................................197


Podstawy trygonometrii.......................................................................................................198
Trjkt prostoktny........................................................................................................199
Odwrotne funkcje trygonometryczne ............................................................................200
Zalenoci trygonometryczne........................................................................................201
Wektory ...............................................................................................................................202
Dugo wektora ............................................................................................................203
Normalizacja..................................................................................................................204
Mnoenie wektora przez wartoci skalarne...................................................................204
Dodawanie wektorw ....................................................................................................205
Odejmowanie wektorw................................................................................................206
Iloczyn skalarny wektorw............................................................................................206
Iloczyn wektorowy ........................................................................................................209
Wektor zerowy ..............................................................................................................211
Wektory pooenia i wektory przemieszczenia .............................................................211
Wektory jako kombinacje liniowe skadowych.............................................................211
Macierze i algebra liniowa...................................................................................................212
Macierz jednostkowa.....................................................................................................214
Dodawanie macierzy .....................................................................................................214
Transpozycja macierzy ..................................................................................................215
Mnoenie macierzy........................................................................................................215
Reguy mnoenia macierzy ...........................................................................................217
Wyznaczanie macierzy odwrotnej i rozwizywanie ukadw rwna ................................217
Regua Cramera .............................................................................................................219
Przeksztacenia geometryczne z wykorzystaniem macierzy .........................................221
Wsprzdne jednorodne ...............................................................................................222
Przeksztacenia macierzowe ..........................................................................................223
Podstawowe obiekty geometryczne.....................................................................................230
Punkty............................................................................................................................230
Proste .............................................................................................................................230
Proste w przestrzeni trjwymiarowej ............................................................................232
Paszczyzny ...................................................................................................................234
Rwnania parametryczne.....................................................................................................238
Proste parametryczne na paszczynie i w przestrzeni trjwymiarowej .......................238
Parametryczne definicje odcinkw, wykorzystujce zwyky wektor kierunkowy v.....239
Parametryczne definicje odcinkw,
wykorzystujce jednostkowy wektor kierunkowy |v| = 1 ...........................................240
Parametryczne proste w przestrzeni trjwymiarowej....................................................241
Kwaterniony wprowadzenie ...........................................................................................246
Teoria liczb zespolonych ...............................................................................................247
Rozszerzenie liczb zespolonych ....................................................................................252
Zastosowania kwaternionw .........................................................................................257
Wstp do analizy matematycznej ........................................................................................261
Pojcie nieskoczonoci ................................................................................................261
Granice...........................................................................................................................263
Sumy i szeregi liczbowe skoczone ..............................................................................264
Szeregi liczbowe nieskoczone .....................................................................................266
Pochodne .......................................................................................................................267
Caki...............................................................................................................................274
Podsumowanie .....................................................................................................................279

.


/0  "' &" 

-
Modu matematyczny przegld.......................................................................................282
Struktura plikw moduu matematycznego...................................................................282
Konwencja nazewnicza .................................................................................................282

Triki najlepszych programistw gier 3D. Vademecum profesjonalisty

Obsuga bdw .............................................................................................................283


Sowo na temat jzyka C++...........................................................................................284
Struktury i typy danych........................................................................................................284
Wektory i punkty ...........................................................................................................284
Rwnania parametryczne prostych................................................................................286
Paszczyzny w przestrzeni trjwymiarowej ..................................................................287
Macierze ........................................................................................................................287
Kwaterniony ..................................................................................................................290
Obsuga wsprzdnych niekartezjaskich....................................................................291
Dwuwymiarowy ukad wsprzdnych biegunowych...................................................292
Trjwymiarowy ukad wsprzdnych cylindrycznych ................................................293
Trjwymiarowy ukad wsprzdnych sferycznych......................................................293
Liczby staoprzecinkowe ...............................................................................................294
Stae matematyczne .............................................................................................................295
Makrodefinicje i funkcje rozwijane w miejscu wywoania .................................................297
Funkcje uytkowe i funkcje konwersji..........................................................................301
Funkcje manipulujce punktami i wektorami ...............................................................301
Macierze ........................................................................................................................302
Kwaterniony ..................................................................................................................304
Obliczenia staoprzecinkowe.........................................................................................304
Prototypy..............................................................................................................................305
Zmienne globalne ................................................................................................................308
Interfejs programowy moduu matematycznego .................................................................308
Funkcje trygonometryczne ............................................................................................309
Funkcje obsugi rnych ukadw wsprzdnych........................................................310
Funkcje obsugi wektorw.............................................................................................313
Funkcje operujce na macierzach..................................................................................321
Funkcje operujce parametryczn reprezentacj prostych
na paszczynie i w przestrzeni trjwymiarowej ........................................................333
Funkcje obsugi paszczyzn trjwymiarowych..............................................................337
Funkcje obsugi kwaternionw......................................................................................341
Funkcje oblicze staoprzecinkowych...........................................................................350
Funkcje rozwizujce rwnania macierzowe ................................................................355
Elementarz arytmetyki zmiennoprzecinkowej z wykorzystaniem koprocesora..................357
Architektura jednostki zmiennoprzecinkowej ...............................................................358
Stos jednostki zmiennoprzecinkowej ............................................................................359
Zestaw instrukcji jednostki FPU....................................................................................361
Klasyczny tryb adresowania operandw .......................................................................364
Tryb adresowania operandw z odwoaniem do pamici .............................................364
Tryb adresowania operandw z odwoaniem do rejestru ..............................................365
Adresowanie operandw ze zdjciem operandu ze stosu..............................................365
Przykady zastosowania instrukcji jednostki FPU.........................................................366
Instrukcje FLD...............................................................................................................366
Instrukcje FST ...............................................................................................................367
Instrukcje FADD ...........................................................................................................368
Instrukcje FSUB ............................................................................................................371
Instrukcje FMUL ...........................................................................................................372
Instrukcje FDIV.............................................................................................................373
Stosowanie moduu matematycznego uwagi ..................................................................374
Nowy szablon aplikacji .................................................................................................375
Sowo o optymalizacji moduu ............................................................................................375
Podsumowanie .....................................................................................................................376

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




   2 ! 0 &"3

) .
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

Triki najlepszych programistw gier 3D. Vademecum profesjonalisty

Budowanie potoku 3D .........................................................................................................491


Oglne funkcje przeksztacajce ...................................................................................491
Przeksztacenie wsprzdnych lokalnych na wsprzdne wiata 3D .........................497
Eulerowski model kamery .............................................................................................500
Model kamery UVN ......................................................................................................503
Przeksztacenie wsprzdnych wiata na wsprzdne kamery...................................515
Usuwanie obiektw .......................................................................................................519
Usuwanie cian zwrconych tyem ...............................................................................523
Przeksztacenie wsprzdnych kamery na wsprzdne perspektywy.........................526
Przeksztacenie wsprzdnych perspektywy na wsprzdne ekranowe .....................530
Poczone przeksztacenie do wsprzdnych perspektywy
i wsprzdnych ekranowych......................................................................................535
Renderowanie wiata 3D .....................................................................................................538
Rzut oka na potok 3D ....................................................................................................538
Programy demonstracyjne 3D .............................................................................................542
Pojedynczy trjkt 3D DEMOII7_1.CPP|EXE ........................................................542
Szkielet szecianu 3D DEMOII7_2.CPP|EXE .........................................................545
Szkielet szecianu 3D z usuwaniem cian zwrconych tyem
DEMOII7_3.CPP|EXE...........................................................................................548
Czog 3D DEMOII7_4.CPP|EXE.............................................................................550
Czogi 3D i latajca kamera DEMOII7_5.CPP|EXE ...............................................553
Wycieczka po wiecie gry la Battle Zone DEMOII7_6.CPP|EXE........................554
Podsumowanie .....................................................................................................................559

 %  "



  &#
-


4 0 %& 2 0 

.$
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

/ 0"&'  "3!" 1"   !

$..
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

Triki najlepszych programistw gier 3D. Vademecum profesjonalisty


 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

Triki najlepszych programistw gier 3D. Vademecum profesjonalisty

Wprowadzenie do mapowania owietlenia i przechowywania powierzchni


w pamici podrcznej .....................................................................................................1110
Przechowywanie powierzchni w pamici podrcznej .................................................1113
Generowanie map owietlenia.....................................................................................1114
Implementowanie mapera owietlenia ........................................................................1115
Mapowanie ciemnoci .................................................................................................1118
Efekty specjalne z uyciem map owietlenia ..............................................................1120
Optymalizowanie kodu mapowania owietlenia .........................................................1120
czc wszystko w jedn cao........................................................................................1121
Podsumowanie ...................................................................................................................1121

'

(  
"   +
   )""! "   ##

 .
  "+ "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

Trik 6: Zwikszanie wartoci wskanika.....................................................................1208


Trik 7. Wyjmowanie instrukcji if z ptli .....................................................................1209
Trik 8. Rozgazianie potokw instrukcji....................................................................1209
Trik 9. Wyrwnywanie danych ...................................................................................1210
Trik 10. Wywoywanie wszystkich krtkich funkcji w miejscu .................................1210
Literatura............................................................................................................................1210
Podsumowanie ...................................................................................................................1210

  ) ###
 ! 7268949

 
 !5

/0  "#!& !0:08;8<<

 .
Instalowanie DirectX .........................................................................................................1215
Korzystanie z kompilatora Visual C/C++..........................................................................1216
Kilka praktycznych porad zwizanych z kompilacj.........................................................1216

 !8 *&  !&

 
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

 !  ! ! '&!8<<


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

Triki najlepszych programistw gier 3D. Vademecum profesjonalisty

 !=

&  &  

..
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

Cz III  Podstawy renderowania 3D

naley przewidzie potrzeb wprowadzenia dodatkowych wierzchokw przetwarzanych trjktw,


przez co staj si one czworoktami bd wieloktami o jeszcze wikszej liczbie ktw. To pierwsza
trudno. Gdyby silnik graficzny optymalizowany by pod ktem przetwarzania wieloktw o dowolnej
liczbie wierzchokw, nie byoby problemu, ale dotychczas omwione optymalizacje przetwarzania 3D
opieray si zawsze na zaoeniu, e scena skada si wycznie z trjktw. Dalej, przycinanie w dowolnym
systemie przestrzeni obiektu oznacza konieczno przecinania prostych prostymi, prostych paszczyznami
i tak dalej. Z pozoru proste, operacje te okazuj si trudne w wydajnej implementacji, wymagajc rozwizania
wielu problemw.



  
 
Przycinanie 2D w przestrzeni obiektu nie jest nam cakiem obce, poniewa wielokrotnie prezentowalimy je
dla grafiki 2D. Podstawowa koncepcja takiego przycinania zakada, e dysponujemy gotowymi ju rzutami
prostych i wieloktw, ktre naley przyci do prostoktnego obszaru widzenia. Kod implementujcy takie
przycinanie prezentowany by ju zarwno w tym, jak i poprzednim wydaniu ksiki. Przycinanie 2D nie
moe by duej pomocne, poniewa podstawowym problemem jest to, e w przestrzeni trjwymiarowej
rzutowaniu podlegaj wielokty, ktre mog by potencjalnie tak rozlege, e nie tylko przenikaj przez
blisk paszczyzn przycinania, ale rwnie przez paszczyzn o wsprzdnej z rwnej 0, std do rzutowania
przekazywane s wierzchoki o ujemnych wartociach tej wsprzdnej (jak na rysunku 10.1). Wyania si
wic potrzeba opracowania techniki bardziej agresywnego przycinania 3D w przestrzeni obiektu.


Rzutowanie wierzchokw o wsprzdnej z mniejszej lub rwnej zeru prowadzi do bdw

Rozdzia 10.  Przycinanie scen 3D

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

Cz III  Podstawy renderowania 3D

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.

Rozdzia 10.  Przycinanie scen 3D

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

Usunicie wszystkich zbdnych obiektw.


Usunicie wieloktw zwrconych tyem do obserwatora.
Przycicie wszystkich wieloktw do obszaru ostrosupa widzenia. Penego przycinania wymaga

jedynie bliska paszczyzna przycinania w osi Z. Przycinanie na pozostaych piciu paszczyznach


sprowadza si za do prostej kwalifikacji wielokta do sceny w caoci (jeeli trjkt znajduje si
czciowo lub w caoci w obszarze przycinania, zostaje zaliczony do sceny w caoci; trjkty
pozostajce w caoci poza lew, praw, grn i doln paszczyzn ostrosupa widzenia mona
w caoci usun ze sceny).
 Przekazanie wszystkich wieloktw do nastpnych etapw potoku renderowania; wszelkie trjkty

wystajce poza obszar paszczyzny rzutu mona przyci na etapie rasteryzacji.


Taki system przycinania jest atwy w implementacji, dziaa znakomicie, i co najwaniejsze jest
bardzo szybki.



 

 
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

Cz III  Podstawy renderowania 3D



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!

Rozdzia 10.  Przycinanie scen 3D

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.

Dosy narzekania. Do dziea! Przystpimy teraz do omwienia z teoretycznego punktu widzenia


najpopularniejszych algorytmw przycinania, po czym zajmiemy si implementacj takiego algorytmu na
potrzeby naszego silnika graficznego. Prezentowany algorytm, jako e powsta pod presj konkretnego
problemu, bdzie hybryd wielu pomysw. Na pocztek nieco informacji podstawowych.



  
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

Cz III  Podstawy renderowania 3D

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.

Rozdzia 10.  Przycinanie scen 3D

763

Przypadek 2. Przypadek oglny zawierania si punktu w bryle ostrosupa widzenia.


Przypadek ten bdzie interesowa nas najbardziej. To standardowy przypadek w przycinaniu: danych jest
sze paszczyzn tworzcych city ostrosup widzenia, do ktrego naley przyci wszelkie elementy
geometryczne sceny. Ostrosup widzenia mona zdefiniowa na kilka sposobw, na przykad przez okrelenie wsprzdnych z paszczyzn przycinania (bliszej i dalszej) wraz ze wsprzdnymi prostoktnego
obszaru na paszczynie bliszej. Jednak niezalenie od sposobu wyznaczenia zadanych bdzie sze
paszczyzn. Nazwijmy je Pgrna, Pdolna, Pprawa, Plewa, Pdaleka i Pbliska. Dodatkowo zamy, e
paszczyzny zdefiniowano w taki sposb, e ich wektory normalne skierowane s do wewntrz bryy
citego ostrosupa widzenia. Dalej, dla punktu p0(x, y, z) mona wyznaczy pprzestrze, w ktrej si
znajduje. Przynaleno do pprzestrzeni dodatniej oznacza, e punkt znajduje si po wewntrznej stronie
paszczyzny przycinania, przynaleno do pprzestrzeni ujemnej e punkt znajduje si po stronie
zewntrznej, a tym samym poza ostrosupem widzenia. Przypominacie sobie zapewne, e do okrelenia, czy
dany punkt ley na paszczynie, czy te naley do pprzestrzeni dodatniej bd ujemnej, suy rwnanie
paszczyzny, prezentowane w rozdziaach 4. i 5. Zamy wic, e operator HS(p, p) zwraca warto
pprzestrzeni punktu p wzgldem paszczyzny p (dla pprzestrzeni dodatniej wynikiem operatora jest +1,
dla ujemnej 1, a w przypadku, gdy punkt znajduje si dokadnie na paszczynie 0).
Do okrelenia zawierania si punktu w bryle niezbdne jest sprawdzenie, czy wsprzdne punktu speniaj
nastpujce nierwnoci:
 
 
 

Obliczenia te s tylko pozornie skomplikowane.




Znamy ju sposb okrelania, czy dany punkt znajduje si wewntrz, czy na zewntrz wyznaczonego obszaru przycinania, zarwno na paszczynie, jak i w przestrzeni trjwymiarowej. Kolejny krok to przejcie na wyszy poziom abstrakcji i przycinanie odcinkw (krawdzi) wyznaczanych punktami i tym samym przycinanie konturw trjktw. Potrzebujemy tu narzdzia sucego do wykrywania punktw
przeci odcinkw z paszczyznami i innymi odcinkami. Stosowne wzory podane zostay i omwione
w rozdziaach 4. i 5., nie bdziemy wic od nowa ich wyprowadza; konieczne bdzie jednak odwieenie
pamici.
Przycinanie wieloktw to tylko pewne rozszerzenie zagadnienia przycinania odcinkw, wic nie
uprzedzajc omwienia rzecz sprowadza si do wymylenia sposobu przycicia odcinka wzgldem
nieskoczonej prostej (na paszczynie) bd wzgldem paszczyzny (w przestrzeni 3D). Peny algorytm
przycinania sceny to po prostu iteracyjne lub rekurencyjne stosowanie procedury przycinania dla kadego
odcinka wielokta wzgldem kadej paszczyzny przycinania ograniczajcej ostrosup widzenia. Naturalnie,
algorytmy przycinania s odpowiednio optymalizowane, ale sprowadzaj si wanie do powyszej procedury, i to niezalenie od liczby wymiarw sceny.





Skupmy si na zagadnieniu przycinania odcinkw. Na pierwszy ogie pjdzie przypadek przycinania
w przestrzeni dwuwymiarowej. Odwoujc si do rysunku 10.9 wyobraamy sobie odcinek czcy punkty
p0(x0, y0) i p1(x1, y1). Odcinek ten ma zosta przycity wzgldem pionowej prostej wyznaczanej rwnaniem x = xl.
Przycinanie trjktw rzadko bdzie odbywao wzgldem prostych o dowolnym kierunku
zwykle wystarcza analiza przypadkw wzgldem prostych poziomych i pionowych.

764

Cz III  Podstawy renderowania 3D



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:
  !"#

W postaci rozbitej na skadowe:


  !"##
  ! "##

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:
  !"#

Po podstawieniu w miejsce x wartoci xl otrzymujemy:


  !"#

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:
  ! "#

Rozdzia 10.  Przycinanie scen 3D

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:
  ! "#

Std warto t to:


# ! $ ! 

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:
  !"#

I otrzymujemy drug wsprzdn punktu przecicia odcinka z poziom prost y = yl.


Oczywicie, efektywna implementacja takiego przycinania wymaga podejcia zdroworozsdkowego i wprowadzenia stosownych testw odsiewajcych. Przykadowo, jeeli punkty kocowe p0 i p1 maj identyczne
wsprzdne, w ogle nie trzeba przeprowadza testu na przecicie z prost. Podobnie daremna jest prba
obliczenia punktu przecicia odcinka poziomego z poziom prost i tak dalej.





Przypadek przecinania prostych w przestrzeni trjwymiarowej okazuje si rwnie atwy jak na paszczynie cay problem sprowadza si do odpowiedniej reprezentacji paszczyzn. Na razie nie bdziemy
jednak wprowadza adnych sztuczek i przyjrzymy si oglnemu przypadkowi przycinania odcinkw
w przestrzeni 3D przy zadanej parametrycznie prostej i zadanej paszczynie. Problem ilustrowany jest rysunkiem 10.10. Na pierwszy ogie pjdzie rwnanie paszczyzny bdzie ona definiowana w postaci
punktu zaczepienia i wektora normalnego paszczyzny.



Odcinek
przecinajcy
paszczyzn
w przestrzeni
trjwymiarowej

Niech p0 = (x0, y0, z0) bdzie punktem lecym na paszczynie, a n [nx, ny, nz] wektorem normalnym
tej paszczyzny. Rwnanie paszczyzny przyjmie wtedy posta:
" ! " ! 
"
!


Cz III  Podstawy renderowania 3D

766

Odcinek pomidzy punktami p1 i p2 dany bdzie parametrycznie, w zapisie wektorowym:


  %! "##

W postaci rwna skadowych:


  %! "#
  %! "#



%!
"#

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 podstawieniu x, y i z do rwnania paszczyzny otrzymujemy:


"   %! "# "  %! "#
"

%!
"#

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

Znaczenie dla wartoci 1

&

 , powyej grnej krawdzi obszaru przycinania

 , poniej dolnej krawdzi obszaru przycinania


, na prawo od prawej krawdzi obszaru przycinania

, na lewo od lewej krawdzi obszaru przycinania

Rozdzia 10.  Przycinanie scen 3D

767



Schemat kodowania
klasyfikujcego
w algorytmie
Cohena-Sutherlanda

Po dokonaniu klasyfikacji punktw kocowych odcinkw przechodzimy do fazy przetwarzania, w ktrej


realizowana jest analiza pooenia odcinkw i dochodzi do faktycznego ich przycinania.

  
Faza przetwarzania rozpoczyna si od prostego zaliczania bd prostego odrzucania odcinka jako lecego
w caoci wewntrz lub na zewntrz obszaru przycinania. Algorytm ten jest o tyle przyjazny, e sposb
kodowania pooenia punktw kocowych odcinkw eliminuje konieczno konstruowania rozbudowanych instrukcji warunkowych. Dziki odpowiedniemu kodowaniu bitowemu punktw kocowych odcinka na wiele pyta mona odpowiedzie przy pomocy pojedynczej operacji bitow. Zamy, e zachodzi
potrzeba okrelenia, czy dany odcinek nie znajduje si przypadkiem w caoci poza obszarem przycinania. Normalnie naleaoby sprawdzi, czy oba wierzchoki rwnoczenie znajduj si nad, pod, na lewo
bd na prawo krawdzi obszaru przycinania ile to instrukcji ! Dziki kodom klasyfikujcym jedna
operacja bitowa rozwiewa szereg wtpliwoci. Najprostsze przypadki klasyfikacji odcinkw wygldaj
nastpujco:
Test 1.
Jeeli (kb0 = 0) i (kb1 = 0), odcinek p0, p1 znajduje si w caoci wewntrz obszaru przycinania, wic nie
trzeba poddawa go operacji przycinania do krawdzi obszaru (patrz rysunek 10.11).
W innym przypadku naley dokona logicznej koniunkcji poszczeglnych bitw, a jej wynik okreli pooenie odcinka:
 ' 

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

Cz III  Podstawy renderowania 3D

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)

Rozdzia 10.  Przycinanie scen 3D

769

Na powyszym rysunku ilustrowany jest wariant przycinania na paszczynie dwuwymiarowej. Krawdzie


obszaru przycinania definiowane s wartociami xmin, xmax, ymin i ymax. Odcinek dany jest w postaci
parametrycznej:
  %! "##

albo w postaci rwna skadowych, przy dx = (x2 x1) i dy = (y2 y1):


 "#
  "#

Odcinek znajduje si wewntrz obszaru przycinania, jeeli spenione s nastpujce nierwnoci:


()
**+ "#
()
**+   "# 

Co mona uproci do nastpujcej postaci:


,+  "#
+!  "#!
-+!  "#! 
(.+   "#

Kolejne uproszczenie spowoduje umieszczenie wyrae dx t i dy t po tej samej stronie nierwnoci:


,+! "#
+!"#!
-+! "#! 
(.+ !  "#

Po przemnoeniu nierwnoci przez 1 otrzymamy wzr 10.1:



Nierwnoci dla poszczeglnych krawdzi przycinania
/01*)

2
3++!"# !
/01*)

2
3+ +"# !
/01*)

2
3+%+ "#  !
/01*)

2
3+&+! "# ! 






Spdziem naprawd sporo czasu na szukaniu bdw w prezentowanych tu przeksztaceniach.


Doprawdy, nietrudno pomyli si podczas zamieniania zwrotw nierwnoci, dlatego nie naley
si przy tym spieszy. Panuje tu oczywicie znana regua: po przemnoeniu lub podzieleniu obu
stron nierwnoci przez ujemn liczb naley zmieni dotychczasowy zwrot nierwnoci na przeciwny.

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

Cz III  Podstawy renderowania 3D

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:
,+!"# ! 
+"# ! 
-+ "#  ! 
(.+! "# !  

Rozdzia 10.  Przycinanie scen 3D

771

Po podstawieniu znanych wartoci otrzymujemy:


,+! %"# ! !5 !% %
+ %"# 6! !% 
-+ "# 7! !7 %
(.+! "# ! !5 !7 !%

Po wyodrbnieniu pn i qn i obliczeniu dla kadego rwnania wartoci rn:


,+! %"# ! !5 !% %! %4% 4$! $7
+ %"#   %4    4 $ 8$7
-+ "# %% 4% %% 4%$%7$8
(.+! "# !%&! 4&!%& 4&$& $8

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:

a po podstawieniu obliczonego t2:


%9!% %" 8$7!% 6
%9!7 " 8$7!78$7%:&

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

Cz III  Podstawy renderowania 3D

wierzchoka dziel si na dwie kategorie: na wychodzce z obszaru przycinania i do niego wkraczajce.


Na rysunku 10.13 wielokt poddawany operacji przycinania nazywany jest wieloktem przycinanym, a obszar
przycinania wieloktem przycinania.


Konfiguracja
wieloktw ilustrujca
dziaanie algorytmu
Weilera-Athertona

Przygotowanie sceny do przetwarzania algorytmem Weilera-Athertona polega na takim zdefiniowaniu


list bd tablic wierzchokw wieloktw, aby wierzchoki te byy uporzdkowane w pewien okrelony
sposb. Zamy, e wierzchoki wszystkich wieloktw uporzdkowane s zgodnie z kierunkiem ruchu
wskazwek zegara. Algorytm startuje od wierzchoka zerowego wielokta przycinanego i wyznacza przecicia z kad z krawdzi wielokta przycinania. Jeeli uda si znale punkt przecicia, jest on dodawany zarwno do listy wierzchokw wielokta przycinanego, jak i do listy wierzchokw wielokta przycinania (pomidzy wierzchokami tworzcymi przecinan krawd) i opatrywany znacznikiem krawdzi
wychodzcej bd wkraczajcej. Znacznik ten informuje, czy krawd wielokta przycinanego, zawierajca
punkt przecicia, bya skierowana na zewntrz, czy te do wewntrz wielokta przycinania. Po uzupenieniu
listy wierzchokw generowany jest wielokt wynikowy przycinania. Tworzy si go w szeciu krokach:
Wyszukanie pierwszego punktu przecicia na licie wierzchokw wielokta przycinanego

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

identycznego z ostatnio znalezionym punktem na licie wierzchokw wielokta przycinanego


(synchronizacja list wierzchokw).
 Przegldanie wielokta przycinania; kady odwiedzony kolejno wierzchoek tego wielokta

dodawany jest do listy wierzchokw wielokta wynikowego. Przegldanie odbywa si do momentu


odnalezienia kolejnego punktu przecicia. Bdzie to punkt przecicia na krawdzi skierowanej
do wewntrz.

Rozdzia 10.  Przycinanie scen 3D

773

 Jeeli znaleziony w kroku 4. punkt przecicia nie identyczny z jest punktem pocztkowym

wielokta wynikowego, powrt do kroku 2. (prba zamknicia wielokta wynikowego).


 Jeeli punkt przecicia znaleziony w kroku 4. jest identyczny z pierwszym punktem wielokta

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

Algorytm wymagajcy specjalnego przygotowania struktur reprezentujcych scen i zakadajcy wielokrotne


przegldanie list wierzchokw nie jest, co prawda, najdoskonalszy. Co gorsza, operujc na poszczeglnych
trjktach nie moemy pozwoli sobie na zbyt dugie algorytmy. W wikszoci przypadkw potrzebny
bdzie wic algorytm skonstruowany samodzielnie, wykorzystujcy elementy wszystkich prezentowanych
algorytmw i co najwaniejsze zoptymalizowany do konkretnego zadania. Przedtem jednak jeszcze
jedna prezentacja algorytmu wariantu algorytmu Weilera-Athertona.
Zastanwmy si nad sytuacj, w ktrej jeden wielokt (trjkt) ma zosta przycity do pojedynczej prostej
lub paszczyzny (aby wykona pene przycinanie, mona by powtarza procedur dla kolejnych prostych
i kolejnych paszczyzn tworzcych obszar przycinania). Rozpoczynamy od klasyfikacji wierzchoka pocztkowego jako znajdujcego si wewntrz lub na zewntrz obszaru przycinania. W pierwszym przypadku

774

Cz III  Podstawy renderowania 3D

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!

Rozdzia 10.  Przycinanie scen 3D

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

Cz III  Podstawy renderowania 3D

C wic robi? Na pewno zapomnie o wariancie przycinania po przeksztaceniach perspektywicznych


tak dugie odwlekanie przycinania to nie jest najlepszy pomys. W takim wariancie nie tylko bdziemy
przelicza owietlenie dla wieloktw niewidocznych; najgorsze, e potok przetwarzania wypeniony bdzie dwukrotnie wiksz ni potrzebna liczb wieloktw, z ktrych wikszo nie zostanie w ogle wywietlona. Mona by wic przycina w przestrzeni sceny, ale osobicie nie podoba mi si konieczno
cigego przeksztacania geometrii ostrosupa widzenia. Ponadto, w takim scenariuszu przeksztacane do
przestrzeni kamery bd rwnie wszystkie te dodatkowe wielokty, ktre powstan z podziau na granicach
przycinania. Przypumy, e scena zawiera 1 000 wieloktw. Po przyciciu moe si okaza, e jest ich
1 200 (to, rzecz jasna, wycznie szacunki). Do przestrzeni kamery (obserwatora) trzeba wic bdzie
przeksztaci 1 200 wieloktw! Co gorsza, sprawdzanie pod ktem przycinania kadego wielokta sceny
jest nieco bardziej skomplikowane, ni to samo sprawdzanie realizowane wzgldem wsprzdnych kamery,
kiedy obserwator znajduje si w centrum ukadu wsprzdnych, a ostrosup widzenia jest wyrwnany wzdu
dodatnich osi ukadu.
Dla odmiany przypumy jednak, e po przycinaniu w przestrzeni sceny udao si z niej usun mniej wicej
poow wieloktw. Wtedy do przeksztacenia do przestrzeni kamery zostanie tylko 500 wieloktw
jak wida, decyzja jest trudna. Zdecydowaem jednak o dokonywaniu przycinania po przeksztaceniu sceny do wsprzdnych kamery, poniewa taki schemat atwo zrozumie i przeledzi, a jako nie przekonuje
mnie wizja zaoszczdzenia wikszoci przeksztace w przestrzeni sceny. Decyzj t bdzie mona zreszt
podda rewizji na kocu niniejszej ksiki, gdy przyjdzie do optymalizowania silnika graficznego.
Podsumowujc: bdziemy przeprowadza przycinanie po przeksztaceniu wiata sceny do wsprzdnych
obserwatora, usuwajc ze sceny wszystkie te wielokty, ktre znajd si w caoci poza ostrosupem widzenia i przycinajc te ktre, znajd si na bliskiej paszczynie przycinania. Czciowe wykraczanie poza
doln, grn, lew bd praw cian ostrosupa widzenia bdzie tolerowane, poniewa wystajce trjkty
zostan przycite na etapie rasteryzacji. Nowa wersja potoku przetwarzania widnieje na rysunku 10.16.


 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.

Rozdzia 10.  Przycinanie scen 3D

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

Cz III  Podstawy renderowania 3D

$$oglne stae dla przycinania wieloktw


;<=,>?@,A?B?,C/D $$usuwanie osi x paszczyzny przycinania
;<=,>?@,A?A?,C/D%$$usuwanie osi y paszczyzny przycinania
;<=,>?@,A?E?,C/D5$$usuwanie osi z paszczyzny przycinania
;<=,>?@FGD=H?BAE?,C/D  =I,,?@FGD=H?B?,C/DJ=I,,?@FGD=H?A?,C/DJK
=I,,?@FGD=H?E?,C/D

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

Nic tu skomplikowanego; przejdmy wic do omwienia dziaania funkcji przycinania.


# 
" 

Funkcja przycinania musi operowa na licie wywietlania we wsprzdnych kamery, co oznacza, e
ostrosup widzenia bdzie zakotwiczony w pocztku ukadu wsprzdnych, a paszczyzny przycinania bd
prostopade do dodatniej posi z (patrz rysunek 10.18).


Przycinanie
w przestrzeni kamery

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

Rozdzia 10.  Przycinanie scen 3D

779

$$wstawienie obiektu do listy wywietlania


>#?@FGD=H5(N%?MD/(DM,> H5(N% '?#'*P
$$usunicie wieloktw zwrconych tyem do obserwatora
ML?F3<3?MD/(DM,> H5(N% '?#'3P
$$przeksztacenie do wsprzdnych kamery
S?H?=?MD/(DM,> H5(N% '?#'3P
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$W tym miejscu naleaoby przyci wielokty do bryy ostrosupa widzenia
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$owietlenie sceny
,Q#?MD/(DM,> H5(N%?S 7 '?#'3Q#5P
$$sortowanie listy wieloktw
#?MD/(DM,> H5(N%?S 7 '?# @MH?@,A,> H?CN-EP
$$przeksztacenie perspektywiczne
3#L?H? 3?MD/(DM,> H5(N% '?#'3P
$$zablokowanie bufora ekranu
((?,3?F3? 2<3 P
$$rysowywanie wieloktw
(?MD/(DM,> H5(N%?  7 '?#3?2<<3?#3QP
$$zwolnienie bufora ekranu
((?I3?F3? 2<3 P

Na wydruku wyrniono komentarzem miejsce, w ktrym naleaoby przeprowadzi operacj przycinania:


po przeksztacaniu wsprzdnych sceny do przestrzeni kamery, ale jeszcze przed obliczeniami owietlenia.
Ten moment jest idealny, poniewa po przyciciu wieloktw dziki mniejszej ich liczbie zaoszczdzi si
na obliczeniach owietlenia tych z nich, ktre i tak nie zostayby narysowane w buforze ramki obrazu.
Zastanwmy si teraz nad tym, co bdzie potrzebne do przycicia wieloktw z listy wywietlania. Lista
wywietlania skada si z dwch struktur danych: z tablicy wieloktw i z tablicy wskanikw do wieloktw. Tablica wskanikw wykorzystywana jest, rzecz jasna, do szybkiego sortowania tablicy z pominiciem czasochonnych operacji zwalniania i ponownego przydziau pamici.


! $
 


 

Zgodzilimy si ju, e nie warto przycina wieloktw wystajcych czciowo poza grn, doln, lew
bd praw paszczyzn ostrosupa widzenia. Naley jednak sprawdzi, czy badany wielokt nie znajduje
si przypadkiem w caoci poza tymi paszczyznami, albo te czy w caoci znajduje si wewntrz ostrosupa
widzenia. W tym drugim przypadku wielokt jest kwalifikowany do dalszego przetwarzania w potoku.
Wielokty znajdujce si w caoci poza ostrosupem widzenia s za w caoci usuwane z listy wywietlania
(bez przycinania), jak to pokazano na rysunku 10.19.
Aby zrealizowa powysze zaoenia, musimy jedynie zna wierzchoki trjkta testowanego pod ktem
przenikania przez grn, doln lub jedn z bocznych paszczyzn przycinania oraz pozycj i orientacj
owych paszczyzn. Gdybymy zdecydowali si na przycinanie w przestrzeni sceny, najlepiej byoby wykorzysta do tego celu rwnania paszczyzn w postaci wektorowej i wykonywa iloczyn skalarny z kadym
wierzchokiem w celu obliczenia wartoci pprzestrzeni wierzchoka wzgldem paszczyzny. Jeeli wszystkie trzy wierzchoki miayby identyczn warto pprzestrzeni (czyli trjkt znajdowaby si w caoci po
jednej ze stron paszczyzny), trjkt mona by w caoci przyj bd w caoci odrzuci.

780

Cz III  Podstawy renderowania 3D


 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;

Analogiczne testy mona przeprowadzi dla lewej paszczyzny przycinania:


 jeeli (x > z), v ley po wewntrznej stronie lewej paszczyzny przycinania;
 jeeli (x < z), v ley na zewntrz lewej paszczyzny przycinania;
 jeeli (x = z), v ley na lewej paszczynie przycinania;

Rozdzia 10.  Przycinanie scen 3D

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

Wykorzystujemy tam wzr:


# $

std:
# "

Mona na tej podstawie wytypowa trzy przypadki pooenia wierzchoka:


 jeeli x = tan() z, testowany wierzchoek ley na paszczynie przycinania;
 jeeli x < tan() z, testowany wierzchoek znajduje si w dodatniej pprzestrzeni paszczyzny

przycinania, a wic wewntrz bryy ostrosupa widzenia;


 jeeli x > tan() z, testowany wierzchoek znajduje si w ujemnej pprzestrzeni paszczyzny

przycinania, a wic ley poza bry ostrosupa widzenia;


Jak wida, cay problem klasyfikacji wierzchokw jako znajdujcych si wewntrz i poza bry ostrosupa widzenia sprowadza si do porwnania wsprzdnych (x, y) kadego wierzchoka v(x, y, z) z jego
wsprzdn z, z uwzgldnieniem kta nachylenia paszczyzn przycinania jako tangensa kta widzenia
bd wielkoci pochodnej (przykadowo, wielkociami takimi s wysoko i szeroko pola widzenia,
gdy jest ono uzalenione od dystansu i kta widzenia).

782

Cz III  Podstawy renderowania 3D

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%

Rozdzia 10.  Przycinanie scen 3D

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

Wytuszczony fragment pseudokodu oznacza problem do implementacji. Problem ten sprowadza si do


tego, e konieczne jest okrelenie sposobu przycicia wielokta do paszczyzny przycinania, co z grubsza
oznacza konieczno przycicia kadej krawdzi wielokta wychodzcej poza obszar bryy ostrosupa
widzenia przez blisk paszczyzn przycinania. Dwa moliwe przypadki takiego przycinania, jeeli wieloktami s trjkty, ilustruje rysunek 10.21.


Dwa przypadki
przycinania wzgldem
bliskiej paszczyzny
przycinania

784

Cz III  Podstawy renderowania 3D

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"#

gdzie v0 jest wierzchokiem pocztkowym krawdzi, a v1 jej wierzchokiem kocowym.


Teraz naley podstawi do parametrycznego rwnania skadowej z krawdzi wsprzdn z bliskiej paszczyzny przycinania i wyznaczy z niego t:
L L !L"#
L: L :!L:"#
L:  L : !L: "#
L:
 L :
!L:
"#

Po podstawieniu wartoci  


 w miejsce skadowej z:
?3?
L:
 L :
!L:
"#
#?3?
!L:
$ L :
!L:


Rozdzia 10.  Przycinanie scen 3D

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

Cz III  Podstawy renderowania 3D

Po podstawieniu wartoci parametru t otrzymujemy:


2[& 8!&" :7 :%
L[8 8!8" :7&%

I to byoby ju wszystko w kwestii przycinania wzgldem bliskiej paszczyzny przycinania, z ewentualnym


wtrnym podziaem przycinanego wielokta i ponownym mapowaniem wsprzdnych tekstury wcznie.
Na koniec naleaoby przeliczy dugoci wektorw normalnych wszystkich przycitych i nowo powstaych wieloktw, poniewa dugoci te bd potrzebne na etapie owietlania sceny. Dla wszystkich przycitych wieloktw, niezalenie od tego, czy zostay one wtrnie podzielone, czy nie, naley wic wykona
nastpujcy kod:
$$oblicz 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 dugo wektora normalnego i zapamitaj j w polu nlength struktury wielokta
32? T#QND=H@M5(?,#Q?R# 'P

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

Rozdzia 10.  Przycinanie scen 3D

<#
?<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

Cz III  Podstawy renderowania 3D


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

Rozdzia 10.  Przycinanie scen 3D


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

Cz III  Podstawy renderowania 3D

_

< 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;

Rozdzia 10.  Przycinanie scen 3D

$$konieczne jest obliczenie z parametrycznej postaci rwnania krawdzi


$$punktu przecicia krawdzi z blisk paszczyzn przycinania;
$$po obliczeniu punktu przecicia jest on wprowadzany na miejsce
$$dotychczasowego punktu kocowego krawdzi, przeliczane s ewentualne
$$wsprzdne mapowania tekstury; przycinanie w tym przypadku nie wprowadza
$$dodatkowych trjktw - w przypadku 2. konieczne jest dodanie do listy
$$rend_list jednego nowego trjkta
$$krok 1. wyszuka wierzchoek znajdujcy si po wewntrznej
$$stronie paszczyzny przycinania
< L#?33UV=,>?=@(D?>E
\LPL  PL%%P_

< L#?33U V=,>?=@(D?>E
\L PL %PL%P_

\L%PL PL% P_
$$krok 2. przycicie 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, naley
$$unika wywoywania funkcji matematycznych wysokiego poziomu
$$przytnij krawd v0 - v1
ND=H@M5(?F2 '32? T#L#ULV:L'32? T#L#UL V:L'LP
$$przecicie zachodzi dla 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
$$zastp dotychczasowe wsprzdne wierzchoka kocowego krawdzi
32? T#L#UL V:P
32? T#L#UL V:  P
32? T#L#UL V:
3T?3?
P
$$przytnij krawd v0 - v2
ND=H@M5(?F2 '32? T#L#ULV:L'32? T#L#UL%V:L'LP
$$przecicie zachodzi dla 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
$$zastp dotychczasowe wsprzdne wierzchoka kocowego krawdzi
32? T#L#UL V:P
32? T#L#UL V:  P
32? T#L#UL V:
3T?3?
P
$$majc t1 i t2 mona sprawdzi, czy wielokt jest teksturowany
$$i jeeli tak, przyci wsprzdne mapowania tekstury
< 32? T##'@,A5(N%?CHHM? C(D?O@(D?HDBHIMD
\
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

791

792

Cz III  Podstawy renderowania 3D

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

Rozdzia 10.  Przycinanie scen 3D

$$przycicie krawdzi v0->v2


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
$$po wyznaczeniu obu punktw przecicia trzeba nadpisa
$$wierzchoek 0 wielokta punktem przecicia - powstanie
$$pierwszy z dwch trjktw wynikowych podziau;
32? T#L#ULV: P
32? T#L#ULV:   P
32? T#L#ULV:
3T?3?
P
$$teraz najtrudniejsze - trzeba utworzy nowy wielokt, rozpity
$$pomidzy dwoma punktami przecicia i wierzchokiem v2, po czym
$$doda nowy trjkt na koniec listy rend_list; na razie trjkt bdzie
$$konstruowany na kopii tymczasowej; wierzchoek v2 zostanie bez zmian,
$$ale v1 trzeba nadpisa wierzchokiem v01 a v0 wierzchokiem v02.
#? :#L#UL V: P
#? :#L#UL V:   P
#? :#L#UL V:
3T?3?
P
#? :#L#ULV:%P
#? :#L#ULV:  %P
#? :#L#ULV:
3T?3?
P
$$majc t1 i t2 mona sprawdzi, czy wielokt jest teksturowany
$$i jeeli tak, przyci wsprzdne mapowania tekstury
< 32? T##'@,A5(N%?CHHM? C(D?O@(D?HDBHIMD
\
$$oblicz nowe wsprzdne teksturowania pierwszego wielokta
2 32? T#L#ULV:2
 32? T#L#UL V:2T32? T#L#ULV:2"# P
L 32? T#L#ULV:L
 32? T#L#UL V:LT32? T#L#ULV:L"# P
$$oblicz nowe wsprzdne teksturowania drugiego wielokta
2%32? T#L#ULV:2
 32? T#L#UL%V:2T32? T#L#ULV:2"#%P
L%32? T#L#ULV:L
 32? T#L#UL%V:LT32? T#L#ULV:L"#%P
$$zapamitaj oba trjkty
$$trjkt 1
32? T#L#ULV:22 P
32? T#L#ULV:LL P
$$trjkt 2
#? :#L#ULV:22%P
#? :#L#ULV:LL%P
#? :#L#UL V:22 P
#? :#L#UL V:LL P
_$$if obliczania wsprzdnych teksturowania
$$na koniec naley wyznaczy now dugo wektora normalnego
$$przycitego trjkta;
$$najpierw trjkt 1
$$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

793

794

Cz III  Podstawy renderowania 3D

$$oblicz iloczyn wektorowy


ND=H@M5(?= '2'L'P
$$oblicz szybko now dugo wektora normalnego i zapamitaj j w polu
$$nlength struktury trjkta
32? T#QND=H@M5(?,#Q?R# 'P
$$trjkt 2 (temp_poly)
$$konstruuj u, v
ND=H@M5(?F2 '#? :#L#ULV:L'#? :#L#UL V:L'2P
ND=H@M5(?F2 '#? :#L#ULV:L'#? :#L#UL%V:L'LP
$$oblicz iloczyn wektorowy
ND=H@M5(?= '2'L'P
$$oblicz szybko now dugo wektora normalnego i zapamitaj j w polu
$$nlength struktury trjkta
#? :#QND=H@M5(?,#Q?R# 'P
$$prawie gotowe - trzeba jeszcze wstawi trjkt do listy rend_list
$$jeeli wielokt nie zmieci si, funkcja zwrci 0
>#?@,AR5(N%?MD/(DM,> H5(N% ?#'#? P
_$$else
_$$if dla przycinania wzgldem bliskiej paszczyzny przycinania
_$$if dla przycinania w paszczyznach z
_$$for
_$$end Clip_Polys_RENDERLIST4DV2

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.

Rozdzia 10.  Przycinanie scen 3D

795



Zrzut ekranowy
programu
demonstrujcego
dziaanie funkcji
przycinania

Program ma dwojakie zastosowanie. Po pierwsze uwidacznia, e usuwanie caych obiektw ma si nijak do


usuwania i przycinania pojedynczych skadajcych si na obiekt wieloktw dotychczas, jeeli cho
fragment obiektu znajdowa si wewntrz bryy ostrosupa widzenia, obiekt podlega dalszym transformacjom (w tym owietlaniu), co niekiedy prowadzio do bdw wywietlania i wyjtkw procesora. Teraz
przycinanie realizowane jest na poziomie poszczeglnych wieloktw. Warto zwrci uwag na informacje
statystyczne, wywietlane w u dou ekranu. Wywietlana na ekranie pomoc zawiera pen list klawiszy
sterujcych demonstracj, ale wystarczy wiedzie, e klawiszami kursorw zmienia si pooenie obiektu, nastpny obiekt wybiera si klawiszem O, a przycinanie wzgldem paszczyzn x, y i z mona wcza i wycza klawiszami odpowiednio: X, Y oraz Z.
("

 "
)   
Zanim przejdziemy dalej, naleaoby jeszcze podj kwesti zwizan z wpywem przycinania na system
owietlenia. Dotychczas obliczenia zwizane z owietleniem obiektw realizowane byy w przestrzeni
sceny, a wic dla wsprzdnych wiata sceny. Teraz jednak okazuje si, e takie umiejscowienie moduu
owietlenia w potoku przetwarzania jest ogromnym marnotrawstwem mocy obliczeniowej. Ot owietlanie wieloktw naley wstrzyma a do momentu, w ktrym zawarto sceny zostanie przycita po co
owietla co, czego i tak nie bdzie wida? Tyle, e aby zaoszczdzi na obliczeniach owietlenia, trzeba
dokona transformacji wsprzdnych wiate z przestrzeni sceny do przestrzeni kamery (dopiero w tej
przestrzeni potok jest oczyszczany ze zbdnych wieloktw). Mona to zrealizowa na kilka sposobw.
Jednym z nich jest przepisanie funkcji obliczajcych owietlenie i przeksztacanie wsprzdnych i orientacji
rde wiata do przestrzeni kamery. Problem z owietlaniem w locie tkwi jednak w tym, e funkcje owietlajce wywoywane s na rzecz poszczeglnych obiektw, wic pojawiby si narzut zwizany z cigym
przeksztacaniem wsprzdnych rde wiata. Lepiej byoby na stae przenie rda wiata do wsprzdnych kamery.
Pojawia si jednak problem zachowania oryginalnych wsprzdnych owietlenia. C, trzeba bdzie dokona aktualizacji struktur opisujcych rda wiata nowa wersja stosownej struktury nosi bdzie
nazw  i bdzie zawiera dodatkowe pola dla wsprzdnych owietlenia przeniesionych do przestrzeni kamery. Trzeba te bdzie przepisa kad funkcj operujc na strukturach opisujcych rda
wiata tak, aby korzystay z nowego typu struktury. Dobra wiadomo jest za taka, e w samych funkcjach owietlajcych nie bdzie trzeba wprowadza adnych zmian poza zmian napisw  na 
. Spjrzmy na budow nowej wersji struktury opisujcej rdo wiata:

796

Cz III  Podstawy renderowania 3D

$$druga wersja struktury rda wiata


# <#23#,>- HN%?HA
\
###P$$stan rda
#P$$identyfikator rda
###P$$atrybuty rda
M-FCN 3?#P$$intensywno rda otaczajcego
M-FCN 3?<<2P$$intensywno rda rozproszonego
M-FCN 3?32P$$intensywno rda zwierciadlanego
@>/H5(P$$pozycja rda wiata
 !"#  $
ND=H@M5(P$$orientacja rda wiata
%&'!("#  $
<#34P$$wspczynniki tumienia
<##?P$$wewntrzny kt wiata stokowego
<##?2#P$$zewntrzny kt wiata stokowego
<#<P$$wspczynnik wzmocnienia (zaniku) wiata stokowego
#2 2%P$$pola pomocnicze dla kolejnych rozszerze
<#<2 <2%P
L"#P
_,>- HN%",>- HN%?HMP

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<?,>- H N% ,>- 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
_

Rozdzia 10.  Przycinanie scen 3D

$$jakie wsprzdne powinny zosta poddane przeksztaceniom?


#3Q 3?3#
\
3HMC/ R@MO?=@A?,@=C,?H@?HMC/ +
\
$$dla wszystkich rde wiata w tablicy:
< 32?Q#P32?Q#2?Q#P32?Q#
\
Q#U32?Q#V:#Q#U32?Q#V:P
Q#U32?Q#V:#Q#U32?Q#V:P
_$$ptla for
_P
3HMC/ R@MO?,@=C,?@/,A+
\
$$dla wszystkich rde wiata w tablicy:
< 32?Q#P32?Q#2?Q#P32?Q#
\
$$przekszta wsprzdne lokalne (sceny)
@>/H5(2#P$$przechowuje wynik kolejnych transformacji
$$przekszta pozycj kadego rda wiata
O#?O2?ND=H@M5(?5B5 'Q#U32?Q#V:#'2#P
$$zapisz wynik
ND=H@M5(?=@A 'Q#U32?Q#V:'2#P
$$przekszta wektory orientacji rda wiata
O#?O2?ND=H@M5(?5B5 'Q#U32?Q#V:''2#P
$$zapisz wynik
ND=H@M5(?=@A 'Q#U32?Q#V:'2#P
_$$ptla for
_P
3HMC/ R@MO?HMC/ ?@/,A+
\
$$dla wszystkich rde wiata w tablicy:
< 32?Q#P32?Q#2?Q#P32?Q#
\
$$przekszta kade z przeksztaconych rde wiata
@>/H5(2#P$$przechowuje wynik kolejnych transformacji
$$przekszta wsprzdne pozycji rda wiata
O#?O2?ND=H@M5(?5B5 'Q#U32?Q#V:##'2#P
$$zapisz wynik
ND=H@M5(?=@A 'Q#U32?Q#V:#'2#P
$$przekszta wektory orientacji rda wiata
O#?O2?ND=H@M5(?5B5 'Q#U32?Q#V:#''2#P
$$zapisz wynik
ND=H@M5(?=@A 'Q#U32?Q#V:#'2#P
_$$ptla for
_P
3HMC/ R@MO?,@=C,?H@?HMC/ +
\
$$dla wszystkich rde wiata w tablicy:
< 32?Q#P32?Q#2?Q#P32?Q#
\
$$przekszta kade rdo wiata i umie wyniki przeksztacenia
$$w polach wsprzdnych przeksztaconych - funkcja bdzie najczciej
$$wywoywana wanie w tym trybie
@>/H5(2#P$$przechowuje wynik kolejnych transformacji
$$przekszta wsprzdne pozycji rda wiata
O#?O2?ND=H@M5(?5B5 'Q#U32?Q#V:#'Q#U32?Q#V:#P

797

798

Cz III  Podstawy renderowania 3D

$$przekszta wektor orientacji rda wiata


O#?O2?ND=H@M5(?5B5 'Q#U32?Q#V:''Q#U32?Q#V:#P
_$$ptla for
_P
<2#+P
_$$konstrukcja switch
_$$Transform_LIQHTSV2

Korzystanie z funkcji sprowadza si do jej wywoania i przekazania za porednictwem argumentw tablicy


rde wiata, liczby wiate w tablicy, macierzy przeksztace i wyboru rodzaju przeksztacania. Funkcja
ta jest typow funkcj realizujc przeksztacenia na obiektach, a jej dziaanie nie rni si od dziaania
innych tego typu funkcji. W dziewidziesiciu dziewiciu wywoaniach na sto skadnia wywoania bdzie
nastpujca:
H<?,>- H N% Q#%5'3:3HMC/ R@MO?,@=C,?H@?HMC/ P

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?,>- H VP$$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

Rozdzia 10.  Przycinanie scen 3D

799

#,Q#?MD/(DM,> H5(N%?S% MD/(DM,> H5(N%?HM?#$$lista wieloktw


=CO5(L ?HM3$$pooenie kamery
,>- HN%?HMQ#$$lista rde wiata (moe zawiera wiele wiate)
#?Q#P$$maksymalna liczba wiate na licie
#,Q#?MD/(DM,> H5(N%?S%? 7 MD/(DM,> H5(N%?HM?#$$lista wieloktw
=CO5(N ?HM3$$pooenie kamery
,>- HN%?HMQ#$$lista rde wiata (moe zawiera wiele wiate)
#?Q#P$$maksymalna liczba wiate na licie
$$system owietlenia
#>#?,Q#?,>- HN% ,>- HN%?HMQ#$$tablica rde wiata
#$$indeks tworzonego rda wiata (0 .. MAX_LIGHTS - 1)
#?##$$stan rda wiata
#?##$$typ rda wiata, z dodatkowymi kwalifikatorami
M-FCN ?3?#$$intensywno rda otaczajcego
M-FCN ?3?<<2$$intensywno rda rozproszonego
M-FCN ?3?32$$intensywno rda zwierciadlanego
@>/H5(?HM?$$pozycja rda wiata
ND=H@M5(?HM?$$orientacja rda wiata
<#?3$$wspczynniki tumienia
<#?
<#?4
<#?#?$$wewntrzny kt stoka
<#?#?2#$$zewntrzny kt stoka
<#?<P$$wspczynnik wzmocnienia (zaniku) stoka
#M#?,Q#?,>- HN% ,>- HN%?HMQ#$$tablica rde wiata
#?Q#P$$liczba wiate w systemie

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

Cz III  Podstawy renderowania 3D

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

Rozdzia 10.  Przycinanie scen 3D

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

Mapa wysokoci powinna by interpretowana w sposb nastpujcy: wygenerowana zostanie regularna


siatka, ze rodkiem w pocztku ukadu wsprzdnych sceny, po czym na siatk t naoona zostanie macierz
wartoci wysokoci; kada warto wysokoci bdzie proporcjonalna do wartoci koloru odpowiedniego
piksela mapy wysokoci. Dla przykadu, kolor o indeksie 0 oznacza najnisz moliw wysoko punktu
terenu, kolor o indeksie 255 oznacza za najwyszy z punktw terenu. Przez odpowiednie przeskalowanie
wartoci indeksw koloru mona dowolnie zwiksza zakres wysokoci. Graficzn ilustracj mapy wysokoci o rozmiarze 4 na 4 piksele i sposb generowania na jej podstawie macierzy wysokoci przedstawia
rysunek 10.26.


Sposb
konstruowania
siatki wysokoci
na podstawie
mapy wysokoci
kodowanych kolorami

802

Cz III  Podstawy renderowania 3D

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#&#121113
;<@,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?RC H @/- $$(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:

Rozdzia 10.  Przycinanie scen 3D

803

$$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

Wywoania te wystarcz do obliczenia wszelkich wielkoci potrzebnych do cieniowania metod Gourauda


(konkretnie wektorw normalnych wierzchokw), jak rwnie wyposa obiekt w dane potrzebne do realizacji algorytmw usuwania niewidocznych, bo zwrconych tyem do obserwatora, cian, jak i do owietlenia
wieloktw.
W celu ustawienia trybu cieniowania naley wskaza jedn z nastpujcych staych:
@,A5(N%?CHHM? C(D?O@(D?DO> >ND
@,A5(N%?CHHM? C(D?O@(D?R,CH
@,A5(N%?CHHM? C(D?O@(D?-@IMCI(

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

Cz III  Podstawy renderowania 3D

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

Rozdzia 10.  Przycinanie scen 3D

$$utwrz odpowiednie sowo koloru, uwzgldniajc wskazan gbi koloru terenu


$$sowo rgbcolor zapisuje si zawsze w formacie rgb5.6.5, wic dla terenu
$$8-bitowego wystarczy je zredukowa
<  ?##'@,A5(N ?CHHM?6F>H=@,@M
\
32U3VP
Q#2UM-F 7F# %88%88%88VP
_$$if

\
Q#M-F 7F# %88%88%88P
_$$else
$$ustaw liczb ramek
*T2?< P
*T32?<P
*T##@FGD=H5(N%?CHHM? >/-,D?RMCODP
$$wyzeruj bitmap
# 'QQ#?#
< F>HOC?R>,DP
# '# 7#
< F>HOC?R>,DP
$$krok 2. wczytaj map wysokoci
,?F#?R 'QQ#?#QQ#??<P
$$przelicz podstawowe dane o bitmapie
32QQ#?#:#<Q:S#QP
QQ#?#:#<Q: Q#P
3?L###Q$ <# 32T P
?L##QQ#$ <# T P
#< *T`H+aa`QQ#??<##2??<P
*T2?L#332"P
*T2?  32T " T "%P
$$zapisz niektre informacje potrzebne przy wizualizacji
$$- skorzystaj ze zmiennych pomocniczych obiektu!
*TL 32P
*TL%P
*T<L 3?L#P
*T<L%?L#P
$$przydziel pami dla wierzchokw i liczby wieloktw
$$parametry wywoania s tu nadmiarowe, ale to nic
< ]>#?@FGD=H5(N% *$$obiekt przydziau
*T2?L#3
*T2? 
*T2?<
\
S#?D `KF.Y##2 W

1)3:`P
_$$if
$$zaaduj tekstur (jeli przekazano)
<   ?##'@,A5(N%?CHHM? C(D?O@(D?HDBHIMD''##2??<
\
$$wczytaj plik tekstury
,?F#?R '# 7###2??<P
$$utwrz struktur mapy bitowej o odpowiedniej gbi koloru i rozmiarze
*T##2 F>HOC?>OC-D?HM3 
< F>HOC?>OC-DP
=#?F# *T##2
F# 7#:#<Q:S#Q
# 7#:#<Q: Q#
# 7#:#<Q:F#=2#P

805

806

Cz III  Podstawy renderowania 3D

$$wczytaj rysunek tekstury (pniej mona doda obsug rnych gbi koloru)
< *T##2T 7
,?>?F# 7 *T##2
'# 7#F>HOC?DBHMC=H?O@(D?CF P

\
,?>?F# *T##2
'# 7#F>HOC?DBHMC=H?O@(D?CF P
_$$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?HDBHIMD P
$$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

Rozdzia 10.  Przycinanie scen 3D

$$obliczy transformacj obrotu?


$$oblicz redni i maksymalny promie obiektu
=2#?@FGD=H5(N%?M2 *P
S#?D `KbX#2a<  a<`
*TL?2UV*T?2UVP
$$krok 5. utwrz list wieloktw
< # P *T2? $%P 
\
$$po dwa wielokty na kafel, tworzone wierszami;
$$wyszukiwanie odpowiednich indeksw wierzchokw wieloktw to mudna
$$procedura: dla danej tablicy wierzchokw m na n naley utworzy list
$$wieloktw o rozmiarach (m-1) na (n-1), po dwa wielokty na kafel i to
$$w odpowiedniej kolejnoci wierzchokw w wielokcie... mona
$$wykorzysta indeksy albo wykona podwjn ptl...
#? ?  a 32T 
 32"  $ 32T P
$$lewy grny wielokt kafla
*T#U "%V:L#UV? ?P
*T#U "%V:L#U V? ?32P
*T#U "%V:L#U%V? ?32 P
$$dolny prawy wielokt kafla
*T#U "% V:L#UV? ?P
*T#U "% V:L#U V? ?32 P
*T#U "% V:L#U%V? ? P
$$lista wierzchokw jest nadmiarowa, gdy taka lista zawarta jest
$$w strukturze obiektu - do uytkownika naley wybr, czy do konstruowania
$$wsprzdnych wielokta wykorzysta wierzchoki lokalne, czy po
$$transformacji; by moe dobrze byoby ustawi list na NULL
*T#U "%V:L#*TL#?3P
*T#U "% V:L#*TL#?3P
$$ustaw atrybuty wielokta zgodnie z przekazanymi atrybutami
*T#U "%V:## ?##P
*T#U "% V:## ?##P
$$testy upewniajce o zgodnoci drugorzdnych elementw danych
$$ustawienie koloru wielokta
*T#U "%V:33P
*T#U "% V:33P
$$sprawd, czy wczono cieniowanie - jeeli tak, trzeba obliczy
$$wektory normalne
<  *T#U "%V:##'@,A5(N%?CHHM? C(D?O@(D?-@IMCI(JJ
 *T#U "%V:##'@,A5(N%?CHHM? C(D?O@(D? @/-
\
$$wierzchoki tego wielokta wymagaj obliczenia wektorw normalnych
$$- naley je odpowiednio oznaczy
 DH?F>H *TL#?3U*T#U "%V:L#UVV:##
NDMHDB5(HN ?CHHM?/@MOC,P
 DH?F>H *TL#?3U*T#U "%V:L#U VV:##
NDMHDB5(HN ?CHHM?/@MOC,P
 DH?F>H *TL#?3U*T#U "%V:L#U%VV:##
NDMHDB5(HN ?CHHM?/@MOC,P
 DH?F>H *TL#?3U*T#U "% V:L#UVV:##
NDMHDB5(HN ?CHHM?/@MOC,P
 DH?F>H *TL#?3U*T#U "% V:L#U VV:##
NDMHDB5(HN ?CHHM?/@MOC,P

807

808

Cz III  Podstawy renderowania 3D

 DH?F>H *TL#?3U*T#U "% V:L#U%VV:##


NDMHDB5(HN ?CHHM?/@MOC,P
_$$if
$$jeeli wczono teksturowanie, wcz znacznik teksturowania
<  ?##'@,A5(N%?CHHM? C(D?O@(D?HDBHIMD
\
$$ob wielokt tekstur
*T#U "%V:##2*T##2P
*T#U "% V:##2*T##2P
$$przypisz wsprzdne tekstury
$$lewy grny wielokt
*T#U "%V:##UV? ?P
*T#U "%V:##U V? ?32P
*T#U "%V:##U%V? ?32 P
$$prawy dolny wielokt
*T#U "% V:##UV? ?P
*T#U "% V:##U V? ?32 P
*T#U "% V:##U%V? ? P
$$zastp kolor bazowy wielokta bardziej refleksyjnym
*T#U "%V:3Q#P
*T#U "% V:3Q#P
$$ustaw atrybuty wsprzdnych tekstury
 DH?F>H *TL#?3U*T#U "%V:L#UVV:##
NDMHDB5(HN ?CHHM?HDBHIMDP
 DH?F>H *TL#?3U*T#U "%V:L#U VV:##
NDMHDB5(HN ?CHHM?HDBHIMDP
 DH?F>H *TL#?3U*T#U "%V:L#U%VV:##
NDMHDB5(HN ?CHHM?HDBHIMDP
 DH?F>H *TL#?3U*T#U "% V:L#UVV:##
NDMHDB5(HN ?CHHM?HDBHIMDP
 DH?F>H *TL#?3U*T#U "% V:L#U VV:##
NDMHDB5(HN ?CHHM?HDBHIMDP
 DH?F>H *TL#?3U*T#U "% V:L#U%VV:##
NDMHDB5(HN ?CHHM?HDBHIMDP
_$$if
$$ustaw rodzaj materiau do emulacji wersji 1.0
 DH?F>H *T#U "%V:##@,A5(N%?CHHM?(> CF,D?OCHDM>C,P
 DH?F>H *T#U "% V:##@,A5(N%?CHHM?(> CF,D?OCHDM>C,P
$$oznacz wielokt jako aktywny
*T#U "%V:##@,A5(N%? HCHD?C=H>NDP
*T#U "% V:##@,A5(N%? HCHD?C=H>NDP
$$lista wierzchokw jest nadmiarowa, gdy taka lista zawarta jest
$$w strukturze obiektu - do uytkownika naley wybr, czy do konstruowania
$$wsprzdnych wielokta wykorzysta wierzchoki lokalne, czy po
$$transformacji; by moe dobrze byoby ustawi list na NULL
*T#U "%V:L#*TL#?3P
*T#U "% V:L#*TL#?3P
$$ustaw list wsprzdnych tekstury
*T#U "%V:##*T##P
*T#U "% V:##*T##P
_$$for poly
;<
<  P *T2? P 
\
S#?D `KSY#a+NUaaaVHUaaaV` 
*T#U V:L#UV

Rozdzia 10.  Przycinanie scen 3D

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

Cz III  Podstawy renderowania 3D

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

Rozdzia 10.  Przycinanie scen 3D

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

Cz III  Podstawy renderowania 3D

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

jest nadanie pojazdowi przyspieszenia opadania, zwikszajcego si w funkcji czasu.


 Na pojazd dziaa skierowana w gr sia wynoszca go na poziom gruntu; jeeli pojazd kiedykolwiek

przekroczy poziom morza, zostanie wypchnity w gr.


 W kadym momencie bieca pozycja pojazdu w przestrzeni sceny jest wykorzystywana

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

lub orientacji s niewielkie i oscylujce, drgania s wygaszane.


Do uwzgldnienia tych zaoe trzeba bdzie zdefiniowa kilka staych fizycznych symulacji:
$$definicje dla terenu
;<HDMMC>/?S>(H 5
;<HDMMC>/? D>- H5
;<HDMMC>/? =C,Dc
;<OCB? DD(%
$$definicje dla modelu fizycznego
$$- ich zmiana zmienia charakterystyk jezdn pojazdu
<#L# T:5P$$cienie powszechne
<#L? P$$prdko pionowa kamery
<#3?P$$prdko kamery
<#?L8P$$poziom morza symulacji
<#33c8P$$odstp kamery od gruntu
<#2#?#3QT P$$neutralne nachylenie kamery

A oto kod realizujcy cao symulacji poruszania si po terenie:


$$sekcja ruchu pojazdu$$
$$ledzenie pozycji w terenie polega na okreleniu biecego kafla i indeksw
$$do listy wierzchokw w celu odnalezienia czterech wierzchokw kafla, nad
$$ktrym znajduje si pojazd; po obliczeniu redniej wartoci wysokoci kafla,
$$w zalenoci od biecej wysokoci pojazdu i terenu pojazd jest podnoszony
$$podczas generowania terenu w strukturze obiektu terenu zapisane zostay
$$przydatne informacje dodatkowe:
$$ivar1 = columns;
$$ivar2 = rows;
$$fvar1 - col_vstep;
$$fvar2 = row_vstep;
#3? 3::HDMMC>/?S>(H $%$*?#:<L P
#3?  3::
HDMMC>/? D>- H$%$*?#:<L P
##3<##?QQ##P

Rozdzia 10.  Przycinanie scen 3D

$$sprawd, czy pojazd znajduje si w granicach terenu


<  3?'' 3?*?#:L ''
 3? '' 3? *?#:L%
\
$$wyznacz indeksy wierzchokw tworzcych kafel
#L3?3? "*?#:L%P
#L L P
#L%L *?#:L%P
#L&L*?#:L%P
$$oblicz redni wysoko kafla
#?QQ#:%8" *?#:L#?#ULV: 
*?#:L#?# L V: 
*?#:L#?#UL%V: 
*?#:L#?#UL&V: P
$$oblicz rnic wysokoci kafla i pojazdu
##?QQ#T 3:: T33P
$$test wbicia pojazdu w grunt
< #
\
$$natychmiastowe zadziaanie na kamer
L?  #" :%8P
$$pojazd wbity w grunt, trzeba go podnie
3::  #":&P
$$to ju raczej magia ni model fizyczny :) podnie lub opu przd pojazdu
$$w zalenoci od prdkoci pojazdu i nachylenia zbocza
3::T #": 8P
_$$if
_$$if
$$hamowanie kamery
< 3? :%83?T:%8P

< 3? T:%83?:%8P

3?P
$$dwiki
( 2? #?R4 3?2?6< 3?"%8P
$$stabilizacja orientacji kamery
< 3:: 2#?#3Q:&3::T :&P

< 3:: 2#?#3QT:&3:: :&P

3::2#?#3QP
$$uwzgldnij grawitacj
L? L# P
$$test pooenia poniej poziomu morza
< 3:: ?L
\
L? P
3:: ?LP
_
$$przesu kamer
3::3?"R#?  3:: P
3::
3?"R#?  3:: P
3:: L? P

To naprawd bardzo prosty model jedynymi danymi wejciowymi s biece wsprzdne kamery.

813

814

Cz III  Podstawy renderowania 3D

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.

You might also like