Triki najlepszych programistów gier 3D. Vademecum profesjonalisty



Podobne dokumenty
Animowana grafika 3D. Opracowanie: J. Kęsik.

Julia 4D - raytracing

Grafika Komputerowa Wykład 4. Synteza grafiki 3D. mgr inż. Michał Chwesiuk 1/30

Grafika Komputerowa Wykład 5. Potok Renderowania Oświetlenie. mgr inż. Michał Chwesiuk 1/38

LUBELSKA PRÓBA PRZED MATURĄ 09 MARCA Kartoteka testu. Maksymalna liczba punktów. Nr zad. Matematyka dla klasy 3 poziom podstawowy

Ćwiczenia nr 7. TEMATYKA: Krzywe Bézier a

PRZEWODNIK PO PRZEDMIOCIE

Smarty PHP. Leksykon kieszonkowy

9. Podstawowe narzędzia matematyczne analiz przestrzennych

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

WYKŁAD 3 WYPEŁNIANIE OBSZARÓW. Plan wykładu: 1. Wypełnianie wieloboku

0. OpenGL ma układ współrzędnych taki, że oś y jest skierowana (względem monitora) a) w dół b) w górę c) w lewo d) w prawo e) w kierunku do

3. Macierze i Układy Równań Liniowych

MATEMATYKA Z PLUSEM DLA KLASY VII W KONTEKŚCIE WYMAGAŃ PODSTAWY PROGRAMOWEJ. programowej dla klas IV-VI. programowej dla klas IV-VI.

5. Rozwiązywanie układów równań liniowych

OpenGL i wprowadzenie do programowania gier

V. WYMAGANIA EGZAMINACYJNE

PRZEWODNIK PO PRZEDMIOCIE

Bartosz Bazyluk SYNTEZA GRAFIKI 3D Grafika realistyczna i czasu rzeczywistego. Pojęcie sceny i kamery. Grafika Komputerowa, Informatyka, I Rok

Próbny egzamin z matematyki dla uczniów klas II LO i III Technikum. w roku szkolnym 2012/2013

Plan wykładu. Akcelerator 3D Potok graficzny

Egzamin gimnazjalny z matematyki 2016 analiza

Śledzenie promieni w grafice komputerowej

Praktyczny Excel. 50 praktycznych formuł na każdą okazję

Załącznik KARTA PRZEDMIOTU. KARTA PRZEDMIOTU Wydział Automatyki, Elektroniki i Informatyki, Rok akademicki: 2009/2010 KOMPUTEROWA

Mgr Kornelia Uczeń. WYMAGANIA na poszczególne oceny-klasa VII-Szkoła Podstawowa

WYMAGANIA EDUKACYJNE Z MATEMATYKI 2016/2017 (zakres podstawowy) klasa 3abc

w jednym kwadrat ziemia powietrze równoboczny pięciobok

Rozkład materiału z matematyki dla II klasy technikum zakres podstawowy I wariant (38 tyg. 2 godz. = 76 godz.)

WYMAGANIA EDUKACYJNE Z MATEMATYKI DLA KLASY 7SP. V. Obliczenia procentowe. Uczeń: 1) przedstawia część wielkości jako procent tej wielkości;

Wymagania edukacyjne z matematyki w klasie III gimnazjum

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

SIMR 2016/2017, Analiza 2, wykład 1, Przestrzeń wektorowa

Geometria w R 3. Iloczyn skalarny wektorów

Wprowadzenie do rysowania w 3D. Praca w środowisku 3D

WYMAGANIA na poszczególne oceny-klasa I Gimnazjum

2 Przygotował: mgr inż. Maciej Lasota

WYMAGANIA EDUKACYJNE

Następnie przypominamy (dla części studentów wprowadzamy) podstawowe pojęcia opisujące funkcje na poziomie rysunków i objaśnień.

I. Potęgi. Logarytmy. Funkcja wykładnicza.

Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres rozszerzony. Część 1.

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

ROZKŁAD MATERIAŁU NAUCZANIA KLASA 1, ZAKRES PODSTAWOWY

WYMAGANIA EDUKACYJN KRYTERIA OCENY Z MATEMATYKI W KLASIE II GIMNAZJUM

Matematyka z komputerem dla gimnazjum

2) R stosuje w obliczeniach wzór na logarytm potęgi oraz wzór na zamianę podstawy logarytmu.

Układy równań i nierówności liniowych

Kryteria oceniania z matematyki Klasa III poziom podstawowy

Programowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop Spis treści

Zad. 3: Układ równań liniowych

Metody numeryczne Wykład 4

EGZAMIN W KLASIE TRZECIEJ GIMNAZJUM W ROKU SZKOLNYM 2017/2018 CZĘŚĆ 2. ZASADY OCENIANIA ROZWIĄZAŃ ZADAŃ

1 Wstęp teoretyczny. Temat: Obcinanie odcinków do prostokąta. Grafika komputerowa 2D. Instrukcja laboratoryjna Prostokąt obcinający

SCENARIUSZ LEKCJI. Streszczenie. Czas realizacji. Podstawa programowa

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

1. Potęgi. Logarytmy. Funkcja wykładnicza

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Co należy zauważyć Rzuty punktu leżą na jednej prostej do osi rzutów x 12, którą nazywamy prostą odnoszącą Wysokość punktu jest odległością rzutu

MATEMATYKA DLA KLASY VII W KONTEKŚCIE WYMAGAŃ PODSTAWY PROGRAMOWEJ

KRYTERIA OCEN Z MATEMATYKI DLA KLASY VII

Trójwymiarowa grafika komputerowa rzutowanie

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C

Oświetlenie. Modelowanie oświetlenia sceny 3D. Algorytmy cieniowania.

Modelowanie i wstęp do druku 3D Wykład 1. Robert Banasiak

I semestr WYMAGANIA EDUKACYJNE Z MATEMATYKI KLASA VI. Wymagania na ocenę dopuszczającą. Dział programu: Liczby naturalne

Kodowanie i kompresja Tomasz Jurdziński Studia Wieczorowe Wykład Kody liniowe - kodowanie w oparciu o macierz parzystości

FUNKCJA LINIOWA - WYKRES

Tomasz Tobiasz PLAN WYNIKOWY (zakres podstawowy)

WYMAGANIE EDUKACYJNE Z MATEMATYKI W KLASIE II GIMNAZJUM. dopuszczającą dostateczną dobrą bardzo dobrą celującą

WYMAGANIA EDUKACYJNE Z MATEMATYKI KLASA I GIMNAZJUM Małgorzata Janik

PRZEWODNIK PO PRZEDMIOCIE

Algebra liniowa z geometrią

str 1 WYMAGANIA EDUKACYJNE ( ) - matematyka - poziom podstawowy Dariusz Drabczyk

STEREOMETRIA CZYLI GEOMETRIA W 3 WYMIARACH

LUBELSKA PRÓBA PRZED MATURĄ 2017 poziom podstawowy

Podstawa programowa przedmiotu MATEMATYKA. III etap edukacyjny (klasy I - III gimnazjum)

Rok akademicki: 2017/2018 Kod: JFM s Punkty ECTS: 7. Poziom studiów: Studia I stopnia Forma i tryb studiów: Stacjonarne

Programowanie gier komputerowych Tomasz Martyn Wykład 6. Materiały informacje podstawowe

Dodawanie grafiki i obiektów

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Klasa 1 technikum. Poniżej przedstawiony został podział wymagań na poszczególne oceny szkolne:

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

Wymagania szczegółowe z matematyki klasa 7

WYMAGANIA EDUKACYJNE Z MATEMATYKI KLASA II GIMNAZJUM Małgorzata Janik

ZAGADNIENIA PROGRAMOWE I WYMAGANIA EDUKACYJNE DO TESTU PRZYROSTU KOMPETENCJI Z MATEMATYKI DLA UCZNIA KLASY II

Zad. 3: Rotacje 2D. Demonstracja przykładu problemu skończonej reprezentacji binarnej liczb

MATEMATYKA WYKAZ UMIEJĘTNOŚCI WYMAGANYCH NA POSZCZEGÓLNE OCENY DLA KLASY DRUGIEJ

Grafika Komputerowa Wykład 6. Teksturowanie. mgr inż. Michał Chwesiuk 1/23

Ćwiczenie nr 8 - Modyfikacje części, tworzenie brył złożonych

SPIS TREŚCI WSTĘP LICZBY RZECZYWISTE 2. WYRAŻENIA ALGEBRAICZNE 3. RÓWNANIA I NIERÓWNOŚCI

Definicja i własności wartości bezwzględnej.

ROZKŁAD MATERIAŁU DO II KLASY LICEUM (ZAKRES ROZSZERZONY) A WYMAGANIA PODSTAWY PROGRAMOWEJ.

Animowana grafika 3D. Opracowanie: J. Kęsik.

PRZEDMIOTOWY SYSTEM OCENIANIA- MATEMATYKA KLASA 6. Rok szkolny 2012/2013. Tamara Kostencka

Standardy wymagań maturalnych z matematyki - matura

3. FUNKCJA LINIOWA. gdzie ; ół,.

Kod doskonały : jak tworzyć oprogramowanie pozbawione błędów / Steve McConnell. Gliwice, cop Spis treści. Wstęp 15.

KRYTERIUM OCENY Z MATEMATYKI DLA KLASY 6

ZESTAWIENIE TEMATÓW Z MATEMATYKI Z PLUSEM DLA KLASY VIII Z WYMAGANIAMI PODSTAWY PROGRAMOWEJ WYMAGANIA SZCZEGÓŁOWE Z PODSTAWY PROGRAMOWEJ

Matematyka z kluczem. Układ treści w klasach 4 8 szkoły podstawowej. KLASA 4 (126 h) część 1 (59 h) część 2 (67 h)

Transkrypt:

PRZYK ADOWY ROZDZIA Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl IDZ DO KATALOG KSI EK ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWO CIACH ZAMÓW CENNIK CZYTELNIA SPIS TRE CI KATALOG ONLINE DODAJ DO KOSZYKA FRAGMENTY KSI EK ONLINE Triki najlepszych programistów gier 3D. Vademecum profesjonalisty Autor: Andre LaMothe T³umaczenie: Adam Bochenek (wstêp, rozdz. 1 3), Jaros³aw Dobrzañski (rozdz. 6 9), S³awomir Dzieniszewski (rozdz. 14 16, dod. A F) ISBN: 83-7361-267-X Tytu³ orygina³u: Tricks of the 3D Game Programming Gurus Format: B5, stron: 1312 Swoje triki zdradz¹ Ci prawdziwi guru ze wiata twórców gier Tworzenie gier 3D wymaga opanowania nie tylko jêzyka programowania, ale tak e wielu innych dziedzin wiedzy -- analizy matematycznej, rachunku macierzowego i wektorowego oraz geometrii. Oczywi cie ka da z tych nauk zosta³a ju opisana w dziesi¹tkach tomów. Ksi¹ ka, któr¹ trzymasz w rêce, zawiera wszystkie informacje niezbêdne do stworzenia gry 3D dzia³aj¹cej w rodowisku Windows, zebrane w jednym tomie. Korzystaj¹c z niej, nie bêdziesz ju musia³ przerzucaæ tysiêcy stron w poszukiwaniu potrzebnego Ci wzoru. Autor ksi¹ ki, wykorzystuj¹c ponad dwudziestopiêcioletnie do wiadczenie w programowaniu, przedstawi Ci: algorytmy matematyczne wykorzystywane w grafice 3D, zasady programowania w Windows i DirectX, algorytmy wy wietlania grafiki 2D i 3D, techniki animacji i renderingu 3D, mapowanie tekstur, techniki symulacji o wietlenia i wiele innych informacji. Korzystaj¹c z tej ksi¹ ki, opracujesz doskona³y, oparty wy³¹cznie 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 ród³owy programu pod k¹tem szybko ci jego wykonywania. O autorze: Andre LaMothe to autor uznanych przez rynek ksi¹ ek o programowaniu gier i grafiki trójwymiarowej. Ci¹g jego sukcesów wydawniczych zapocz¹tkowa³o pierwsze wydanie tej ksi¹ ki (ustanowi³o ono swego czasu standardy programowania gier dla systemu DOS). Andre LaMothe programuje od ponad 25 lat i oprócz niew¹tpliwej praktyki posiada stosowne wykszta³cenie z zakresu matematyki, informatyki i elektrotechniki. Znany jest równie jako za³o yciel firm Xtreme Games LCC, Nurve Networks i XGDC.

Wprowadzenie...n...n...27 Elementy gier 2D/3D...n...n....29 Ogólne wskazówki dotyczące programowania gier...n...33 Narzędzia...n...n...36 Edytor poziomów 3D...n...n.39 Przygotowanie kompilatora...n...40 Przykładowa gra 3D: Raiders 3D...n...43 Pętla obsługi zdarzeń...n...n.62 Logika gry 3D...n...n... 62 Rzutowanie 3D...n...n...64 Gwiezdne tło...n...n....66 Działo laserowe i wykrywanie kolizji...n...66 Eksplozja...n...n......66 Zasady gry...n...n.....67 Podsumowanie...n...n...67 Model programowania Win32...n...69 Programowanie w Windows absolutne minimum...n...70 Wszystko zaczyna się od WinMain()...n...70 Wzorcowa aplikacja Windows...n...75 Klasa okna...n...n.....76 Rejestracja klasy okna...n...80 Tworzenie okna...n...n...80 Obsługa zdarzeń...n...n...82 Pętla obsługi komunikatów...n...87 Pętla obsługi komunikatów pracująca w czasie rzeczywistym...90 DirectX i COM w pigułce...n...n91 HEL i HAL...n...n... 93 Komponenty DirectX...n...n94 Wprowadzenie do COM...n...n..95 Co to jest obiekt COM?...n...96 Tworzenie i używanie interfejsów COM biblioteki DirectX...98 Dostęp do interfejsów...n...n98 Podsumowanie...n...n.....100

6 Triki najlepszych programistów gier 3D. Vademecum profesjonalisty Założenia interfejsu abstrakcyjnego komputera...n...101 Budujemy abstrakcyjny komputer...n...103 System video, bufor ramki...n...103 Praca z kolorami...n...n...106 Kopiowanie bufora...n...n..108 Kompletny system graficzny abstrakcyjnego komputera...110 Dźwięk, muzyka, urządzenia wejścia...n...110 Konsola do gier T3DLIB...n...111 Podstawowa konsola do gier...n...111 Biblioteka T3DLIB...n...n... 116 Architektura modułu graficznego...n...117 Podstawowe definicje...n...117 Makra...n...n......119 Typy danych, struktury...n...119 Funkcje...n...n.....122 Globalna dominacja...n...n.125 Interfejs DirectDraw...n...n126 Funkcje operujące na figurach 2D...n...130 Funkcje matematyczne i obsługa błędów...n...136 Mapy bitowe...n...n...13 8 Obsługa palety w trybie 8-bitowym...n...142 Funkcje pomocnicze...n...n145 Obiekty BOB...n...n...146 T3DLIB2 moduł obsługi urządzeń wejścia...n...154 T3DLIB3 biblioteka obsługi dźwięku i muzyki...n...159 Definicje...n...n.....160 Typy...n...n......160 Zmienne globalne...n...n...161 DirectSound API...n...n...161 DirectMusic API...n...n...166 Ostateczna postać konsoli T3D...n...168 Przypisanie funkcji graficznych abstrakcyjnemu modelowi...168 Konsola T3DLIB...n...n...171 Przykładowe aplikacje...n...n...1 79 Aplikacje okienkowe...n...179 Aplikacje pełnoekranowe...n...180 Dźwięk i muzyka...n...n...181 Klawiatura, myszka, joystick...n...181 Podsumowanie...n...n.....184 Notacje matematyczne...n...n...18 7 Dwuwymiarowe układy współrzędnych...n...188 Dwuwymiarowy układ współrzędnych kartezjańskich...189 Dwuwymiarowy układ współrzędnych biegunowych...n190 Trójwymiarowe układy współrzędnych...n...193 Trójwymiarowe współrzędne kartezjańskie...n...193 Trójwymiarowe współrzędne cylindryczne...n...196 Konwersja trójwymiarowych współrzędnych kartezjańskich do współrzędnych cylindrycznych...n...196

Spis treści 7 Trójwymiarowe współrzędne sferyczne...n...197 Podstawy trygonometrii...n...n.19 8 Trójkąt prostokątny...n...n..199 Odwrotne funkcje trygonometryczne...n...200 Zależności trygonometryczne...n...201 Wektory...n...n...202 Długość wektora...n...n...203 Normalizacja...n...n...2 04 Mnożenie wektora przez wartości skalarne...n...204 Dodawanie wektorów...n...205 Odejmowanie wektorów...n...206 Iloczyn skalarny wektorów...n...206 Iloczyn wektorowy...n...n..209 Wektor zerowy...n...n...211 Wektory położenia i wektory przemieszczenia...n...211 Wektory jako kombinacje liniowe składowych...n...211 Macierze i algebra liniowa...n...212 Macierz jednostkowa...n...214 Dodawanie macierzy...n...214 Transpozycja macierzy...n...215 Mnożenie macierzy...n...n..215 Reguły mnożenia macierzy...n...217 Wyznaczanie macierzy odwrotnej i rozwiązywanie układów równań...217 Reguła Cramera...n...n...219 Przekształcenia geometryczne z wykorzystaniem macierzy...221 Współrzędne jednorodne...n...222 Przekształcenia macierzowe...n...223 Podstawowe obiekty geometryczne...n...230 Punkty...n...n......230 Proste...n...n...230 Proste w przestrzeni trójwymiarowej...n...232 Płaszczyzny...n...n...2 34 Równania parametryczne...n...238 Proste parametryczne na płaszczyźnie i w przestrzeni trójwymiarowej...238 Parametryczne definicje odcinków, wykorzystujące zwykły wektor kierunkowy v...239 Parametryczne definicje odcinków, wykorzystujące jednostkowy wektor kierunkowy v = 1...240 Parametryczne proste w przestrzeni trójwymiarowej...n.241 Kwaterniony wprowadzenie...n...246 Teoria liczb zespolonych...n...247 Rozszerzenie liczb zespolonych...n...252 Zastosowania kwaternionów...n...257 Wstęp do analizy matematycznej...n...261 Pojęcie nieskończoności...n...261 Granice...n...n......263 Sumy i szeregi liczbowe skończone...n...264 Szeregi liczbowe nieskończone...n...266 Pochodne...n...n... 267 Całki...n...n......274 Podsumowanie...n...n.....279 Moduł matematyczny przegląd...n...282 Struktura plików modułu matematycznego...n...282 Konwencja nazewnicza...n...282

8 Triki najlepszych programistów gier 3D. Vademecum profesjonalisty Obsługa błędów...n...n...283 Słowo na temat języka C++...n...284 Struktury i typy danych...n...n.. 284 Wektory i punkty...n...n...284 Równania parametryczne prostych...n...286 Płaszczyzny w przestrzeni trójwymiarowej...n...287 Macierze...n...n....287 Kwaterniony...n...n...29 0 Obsługa współrzędnych niekartezjańskich...n...291 Dwuwymiarowy układ współrzędnych biegunowych...n292 Trójwymiarowy układ współrzędnych cylindrycznych...293 Trójwymiarowy układ współrzędnych sferycznych...n...293 Liczby stałoprzecinkowe...n...294 Stałe matematyczne...n...n... 295 Makrodefinicje i funkcje rozwijane w miejscu wywołania...297 Funkcje użytkowe i funkcje konwersji...n...301 Funkcje manipulujące punktami i wektorami...n...301 Macierze...n...n....302 Kwaterniony...n...n...30 4 Obliczenia stałoprzecinkowe...n...304 Prototypy...n...n......305 Zmienne globalne...n...n....308 Interfejs programowy modułu matematycznego...n...308 Funkcje trygonometryczne...n...309 Funkcje obsługi różnych układów współrzędnych...n...310 Funkcje obsługi wektorów...n...313 Funkcje operujące na macierzach...n...321 Funkcje operujące parametryczną reprezentacją prostych na płaszczyźnie i w przestrzeni trójwymiarowej...n...333 Funkcje obsługi płaszczyzn trójwymiarowych...n...337 Funkcje obsługi kwaternionów...n...341 Funkcje obliczeń stałoprzecinkowych...n...350 Funkcje rozwiązujące równania macierzowe...n...355 Elementarz arytmetyki zmiennoprzecinkowej z wykorzystaniem koprocesora...357 Architektura jednostki zmiennoprzecinkowej...n...358 Stos jednostki zmiennoprzecinkowej...n...359 Zestaw instrukcji jednostki FPU...n...361 Klasyczny tryb adresowania operandów...n...364 Tryb adresowania operandów z odwołaniem do pamięci...364 Tryb adresowania operandów z odwołaniem do rejestru...365 Adresowanie operandów ze zdjęciem operandu ze stosu...365 Przykłady zastosowania instrukcji jednostki FPU...n...366 Instrukcje FLD...n...n...36 6 Instrukcje FST...n...n...36 7 Instrukcje FADD...n...n...368 Instrukcje FSUB...n...n...371 Instrukcje FMUL...n...n...372 Instrukcje FDIV...n...n...373 Stosowanie modułu matematycznego uwagi...n...374 Nowy szablon aplikacji...n...375 Słowo o optymalizacji modułu...n...375 Podsumowanie...n...n.....376

Spis treści 9 Filozofia silnika 3D...n...n.....377 Struktura silnika gry 3D...n...n. 378 Silnik 3D...n...n.....378 Silnik gry...n...n.....379 System sterowania grą i gry sieciowej...n...379 System animacji...n...n...379 Wykrywanie kolizji i system nawigacji...n...384 Moduł fizyki...n...n...3 84 System sztucznej inteligencji...n...386 Baza modeli 3D i grafiki...n...387 Układy współrzędnych trójwymiarowych...n...388 Współrzędne modelu (lokalne)...n...389 Współrzędne świata gry...n...392 Współrzędne kamery...n...396 Ostateczna reprezentacja świata 3D za pomocą współrzędnych kamery...404 Usuwanie ukrytych obiektów (powierzchni) i przycinanie...405 Współrzędne perspektywy...n...411 Zakończenie potoku współrzędne ekranowe...n...422 Podstawowe struktury danych 3D...n...430 Reprezentacje danych opisujących wielokąty w grafice 3D...431 Definiowanie wielokątów...n...433 Definiowanie obiektów...n...439 Reprezentowanie światów...n...443 Narzędzia 3D...n...n...443 Animacja i dane o ruchu...n...445 Ładowanie danych ze źródeł zewnętrznych...n...446 Pliki PLG...n...n....446 Pliki NFF...n...n....449 Pliki 3D Studio...n...n...45 2 Pliki COB firmy Caligari...n...459 Pliki.X Microsoft DirectX...n...461 Formaty plików 3D podsumowanie...n...461 Proste przekształcenia i animacja...n...462 Przesunięcie w przestrzeni...n...462 Obrót w przestrzeni...n...n.463 Zmiana kształtu...n...n...46 5 Podsumowanie potoku 3D...n...466 Typy silników 3D...n...n....467 Silniki przestrzeni kosmicznej...n...468 Silniki terenu...n...n....468 Silniki pomieszczeń zamkniętych...n...470 Ray casting i silniki wokselowe...n...471 Silniki hybrydowe...n...n...472 Integracja całości w ostateczną postać silnika...n...472 Podsumowanie...n...n.....473 Ogólna architektura silnika szkieletowego...n...475 Struktury danych i potok 3D...n...476 Główna lista wielokątów...n...479 Nowe moduły programowe...n...482 Piszemy program ładujący pliki 3D...n...482 Program ładujący pliki PLG (PLX)...n...485

10 Triki najlepszych programistów gier 3D. Vademecum profesjonalisty Budowanie potoku 3D...n...n...491 Ogólne funkcje przekształcające...n...491 Przekształcenie współrzędnych lokalnych na współrzędne świata 3D...497 Eulerowski model kamery...n...500 Model kamery UVN...n...n503 Przekształcenie współrzędnych świata na współrzędne kamery...515 Usuwanie obiektów...n...n.519 Usuwanie ścian zwróconych tyłem...n...523 Przekształcenie współrzędnych kamery na współrzędne perspektywy...526 Przekształcenie współrzędnych perspektywy na współrzędne ekranowe...530 Połączone przekształcenie do współrzędnych perspektywy i współrzędnych ekranowych...n...535 Renderowanie świata 3D...n...538 Rzut oka na potok 3D...n...538 Programy demonstracyjne 3D...n...542 Pojedynczy trójkąt 3D DEMOII7_1.CPP EXE...n...542 Szkielet sześcianu 3D DEMOII7_2.CPP EXE...n...545 Szkielet sześcianu 3D z usuwaniem ścian zwróconych tyłem DEMOII7_3.CPP EXE...n...548 Czołg 3D DEMOII7_4.CPP EXE...n...550 Czołgi 3D i latająca kamera DEMOII7_5.CPP EXE...553 Wycieczka po świecie gry à la Battle Zone DEMOII7_6.CPP EXE...554 Podsumowanie...n...n.....559 Proste modele oświetlenia w grafice komputerowej...n...564 Modele kolorów i materiały...n...566 Typy świateł...n...n...5 74 Oświetlanie i rasteryzacja trójkątów...n...582 Przygotowania do implementacji oświetlenia...n...586 Definiowanie materiałów...n...587 Definiowanie świateł...n...591 Cieniowanie w praktyce...n...n.59 6 Cieniowanie w trybie 16-bitowym...n...596 Cieniowanie w trybie 8-bitowym...n...597 Sprawny model RGB w trybach 8-bitowych...n...597 Model z uproszczonym natężeniem dla trybów 8-bitowych...601 Cieniowanie jednorodne...n...605 Cieniowanie płaskie...n...n.607 Cieniowanie płaskie w trybie 8-bitowym...n...622 Wstęp do cieniowania Gourauda...n...624 Wstęp do cieniowania Phonga...n...626 Sortowanie względem głębokości i algorytm malarza...n...627 Praca z nowymi formatami plików...n...632 Klasa parsera...n...n... 632 Interpretacja funkcji pomocniczych...n...635 Format ASCII programu 3D Studio Max (.ASC)...n...638 Format ASCII programu truespace (.COB)...n...641 Przegląd formatu binarnego.md2 z gry Quake II...n...650 Przegląd narzędzi do modelowania 3D...n...651 Podsumowanie...n...n.....654

Spis treści 11 Nowe funkcje silnika T3D...n...655 Ulepszanie struktur danych i budowy silnika T3D...n...657 Nowe definicje...n...n...65 7 Nowe struktury matematyczne...n...660 Makra pomocnicze...n...n..661 Dodatkowe elementy umożliwiające reprezentację danych siatki 3D...662 Aktualizacja struktur obiektów i listy renderowania...n..668 Przegląd funkcji i prototypów...n...672 Nowe wersje procedur ładujących obiekty...n...680 Aktualizacja starego dobrego czytnika.plg (.PLX)...n.680 Aktualizacja czytnika formatu.asc z 3D Studio Max...691 Aktualizacja czytnika.cob firmy Caligari...n...692 Powtórka z rasteryzacji wielokątów...n...697 Rasteryzacja trójkąta...n...n697 Konwencja wypełniania...n...702 Przycinanie...n...n... 704 Nowe funkcje kreślące trójkąty...n...706 Zabiegi optymalizacyjne...n...710 Implementacja cieniowania Gourauda...n...712 Cieniowanie Gourauda bez oświetlenia...n...713 Uzupełnianie procedury cieniowania Gourauda o oświetlanie wierzchołków...723 Podstawy teorii próbkowania...n...732 Próbkowanie w jednym wymiarze...n...733 Interpolacja dwuliniowa...n...735 Interpolacja u i v...n...n...7 37 Implementacja afinicznego mapowania tekstur...n...739 Uwzględnienie tekstur w module oświetlenia i rasteryzacji...742 Dodawanie oświetlenia do funkcji renderującej tekstury w trybie 16-bitowym...742 Podsumowanie strategii optymalizacyjnych dla trybów 8- i 16-bitowych...748 Tabele wyszukiwania...n...748 Spójność wierzchołków siatki...n...749 Buforowanie...n...n...74 9 Instrukcje SIMD...n...n...749 Programy demonstracyjne...n...750 Raiders 3D II...n...n...7 51 Podsumowanie...n...n.....754 Przycinanie scen 3D wprowadzenie...n...755 Przycinanie w przestrzeni obiektu...n...755 Przycinanie w obszarze obrazu sceny...n...759 Omówienie algorytmów przycinania...n...760 Przycinanie podstawy...n...761 Algorytm Cohena-Sutherlanda...n...766 Algorytm Cyrusa-Becka (Lianga-Barskiego)...n...768 Algorytm Weilera-Athertona...n...771 Przycinanie dodatkowe źródła informacji...n...774 Przycinanie do ostrosłupa widzenia przykład implementacji...775 Potok przekształceń geometrycznych i nowe struktury danych...776 Dodawanie przycinania do silnika graficznego...n...777 Zabawa w terenie...n...n.....799 Funkcja generowania terenu...n...800 Generowanie mapy wysokości...n...809 Rajd łazikiem terenowym...n...810 Podsumowanie...n...n.....814

12 Triki najlepszych programistów gier 3D. Vademecum profesjonalisty Bufory odległości i identyfikowanie widocznych powierzchni wprowadzenie...815 Bufor Z...n...n......818 Trudności implementacji bufora Z...n...820 Przykład buforowania odległości...n...820 Obliczanie wartości Z piksela z równania płaszczyzny...822 Interpolacja współrzędnej Z...n...824 Problemy buforowania Z i buforowanie odwrotności Z...826 Przykładowa interpolacja Z i odwrotności Z...n...827 Tworzenie systemu z buforem głębokości...n...830 Dodawanie obsługi bufora Z do funkcji rasteryzacji...n..833 Optymalizacje bufora odległości...n...845 Oszczędzanie pamięci...n...846 Rzadsze czyszczenie bufora...n...846 Buforowanie mieszane...n...848 Bufory odległości problemy...n...849 Programy demonstrujące działanie buforów Z...n...849 Program 1.: Obrazowanie zawartości bufora Z...n...849 Program 2.: Wodny rajd...n...851 Podsumowanie...n...n.....857 Teksturowanie podejście drugie...n...861 Nowe struktury w pliku nagłówkowym...n...862 Podstawa funkcji rasteryzacji...n...869 Przyjęcie formatu stałoprzecinkowego...n...870 Nowe funkcje rasteryzacji bez buforowania Z...n...870 Nowe funkcje rasteryzacji z buforowaniem Z...n...873 Teksturowanie z cieniowaniem Gourauda...n...875 Przezroczystość i łączenie alfa...n...882 Łączenie alfa z wykorzystaniem tablic przeglądowych...883 Niezależne definiowanie łączenia alfa dla poszczególnych obiektów...895 Łączenie alfa w module generowania terenu...n...901 Teksturowanie z korektą perspektywiczną i buforowanie odwrotności Z...904 Matematyczne podstawy teksturowania z korektą perspektywiczną...905 Dodawanie do rasteryzatorów buforowania odwrotności Z...913 Implementacja teksturowania poprawnego perspektywicznie...921 Implementacja teksturowania częściowo poprawnego perspektywicznie...925 Aproksymacja kwadratowa w teksturowaniu perspektywicznym...931 Optymalizacja teksturowania teksturowanie hybrydowe...936 Dwuliniowe filtrowanie tekstur...n...938 Filtrowanie trzyliniowe tekstur i mipmapowanie...n...943 Wprowadzenie do analizy Fouriera i efektu aliasingu...944 Tworzenie szeregu tekstur mipmapowania...n...949 Wybór poziomu teksturowania mip...n...958 Filtrowanie trzyliniowe...n...964 Wyświetlanie i teksturowanie wieloprzebiegowe...n...965 Zaawansowane teksturowanie w jednym wywołaniu...n...966 Nowy kontekst renderowania...n...967 Wypełnianie struktury kontekstu renderowania...n...969 Funkcja zbiorcza rasteryzacji...n...971 Podsumowanie...n...n.....979

Spis treści 13 Nowy moduł silnika graficznego...n...981 Podział przestrzenny i określanie widoczności powierzchni wprowadzenie...982 Binarny podział przestrzeni (BSP)...n...986 Binarny podział przestrzenny płaszczyznami równoległymni do osi układu współrzędnych...n...988 Binarny podział przestrzenny płaszczyznami arbitralnymi...988 Binarny podział przestrzenny płaszczyznami wyznaczanynmi przez płaszczyzny wielokątów...n...989 Wyświetlanie (odwiedzanie) węzłów drzewa BSP...n...993 Struktury danych i funkcje obsługujące drzewa BSP...n.995 Tworzenie drzewa BSP...n...997 Strategie podziału...n...n..1001 Przeglądanie i wyświetlanie węzłów drzewa BSP...n...1010 Wpasowanie drzew BSP do potoku renderowania...n...1019 Edytor poziomu wykorzystujący drzewa BSP...n...1021 Ograniczenia drzew BSP...n...1032 Minimalizacja nadmiarowości odrysowywania z wykorzystaniem drzew BSP...1033 Wykorzystanie drzew BSP do redukowania sceny...n..1035 Wykorzystanie drzew BSP do wykrywania kolizji...n..1045 Integracja drzew BSP ze standardowymi funkcjami rasteryzacji...1045 Zbiory powierzchni potencjalnie widocznych...n...1052 Zastosowania zbiorów PVS...n...1053 Możliwe sposoby kodowania zbiorów potencjalnej widoczności...1055 Wyznaczanie zbiorów PVS...n...1057 Portale...n...n...1059 Hierarchie brył otaczających i drzewa oktalne...n...1063 Sposób użycia drzewa hierarchii BHV...n...1065 Wydajność w czasie rzeczywistym...n...1065 Strategie budowy hierarchii BHV...n...1067 Implementacja hierarchii BHV...n...1069 Drzewa oktalne...n...n...1076 Eliminowanie powierzchni zasłoniętych...n...1078 Bryły zasłaniające...n...n..1079 Wybór obiektów zasłaniających...n...1080 Hybrydowa metoda wyboru obiektów zasłaniających...1081 Podsumowanie...n...n... 1081 Nowy moduł silnika gry...n...1083 Wprowadzenie i plan gry...n...1083 Uproszczone zasady fizyki cieni...n...1084 Droga fotonów i wyliczanie intensywności światła...n.1085 Symulowanie cieni za pomocą rzutowanych obrazów i billboardów...1088 Implementowanie rasteryzatorów z obsługą przezroczystości...1090 Nowa biblioteka...n...n...1092 Proste cienie...n...n...1 094 Skalowanie cieni...n...n...1096 Śledzenie położenia źródła światła...n...1100 Końcowe uwagi na temat tworzenia symulowanych cieni...1105 Tworzenie cieni poprzez rzutowanie na płaszczyznę siatki obiektu...1105 Wzory przekształceń wektorowych dla potrzeb rzutowania...1106 Optymalizowanie cieni rzutowanych na płaszczyznę...1110

14 Triki najlepszych programistów gier 3D. Vademecum profesjonalisty Wprowadzenie do mapowania oświetlenia i przechowywannia powierzchni w pamięci podręcznej...n...1110 Przechowywanie powierzchni w pamięci podręcznej...1113 Generowanie map oświetlenia...n...1114 Implementowanie mapera oświetlenia...n...1115 Mapowanie ciemności...n...1118 Efekty specjalne z użyciem map oświetlenia...n...1120 Optymalizowanie kodu mapowania oświetlenia...n...1120 Łącząc wszystko w jedną całość...n...1121 Podsumowanie...n...n... 1121 Nowy moduł silnika gry...n...1125 Wprowadzenie do animacji trójwymiarowej...n...1126 Format.MD2 stosowany w grze Quake II...n...1126 Nagłówek pliku.md2...n...1129 Ładowanie plików.md2 gry Quake II...n...1138 Animowanie plików.md2...n...1147 Proste zasady animacji bez modeli bohaterów...n...1158 Rotacja w ruchu i ruch w wyniku translacji...n...1158 Złożone ruchy parametryczne i ruch po krzywej...n...1161 Wykorzystywanie skryptów do programowania ruchu...1162 Wykrywanie kolizji w przestrzeni trójwymiarowej...n...1164 Ograniczające sfery i walce...n...1165 Wykorzystywanie struktur danych do przyśpieszania wykrywania kolizji...1166 Poruszanie się po powierzchni terenu...n...1167 Podsumowanie...n...n... 1168 Wprowadzenie do technik optymalizacyjnych...n...1169 Profilowanie kodu za pomocą kompilatora Microsoft Visualn C++ i programu VTune Intela...n...1170 Profilowanie przy pomocy kompilatora Visual C++...n1171 Analizowanie danych profilowania...n...1173 Optymalizowanie kodu za pomocą programu VTune...1174 Korzystanie z kompilatora C++ firmy Intel...n...1182 Ściąganie kompilatora optymalizacyjnego Intela...n...1182 Korzystanie z kompilatora...n...1183 Korzystanie z opcji optymalizacyjnych kompilatora...1184 Ręczne wybieranie różnych kompilatorów dla różnych plików źródłowych...1185 Strategie optymalizacyjne...n...1185 Przykład programowania instrukcji SIMD w mechanizmie SSE...1185 Podstawy architektury SIMD...n...1187 Jak naprawdę wygląda korzystanie z instrukcji SIMD...1188 Klasa wektorów trójwymiarowych przystosowana do instrukcji SIMD...1199 Kilka podstawowych trików optymalizacyjnych...n...1205 Trik 1. Pozbywanie się funkcji _ftol()...n...1205 Trik 2. Ustawianie słowa kontrolującego FPU...n...1206 Trik 3. Szybkie zerowanie liczb zmiennoprzecinkowych...1207 Trik 4. Szybkie wyciąganie pierwiastków kwadratowych...1207 Trik 5. Uproszczone wyliczanie arcustangens...n...1207

Spis treści 15 Trik 6: Zwiększanie wartości wskaźnika...n...1208 Trik 7. Wyjmowanie instrukcji if z pętli...n...1209 Trik 8. Rozgałęzianie potoków instrukcji...n...1209 Trik 9. Wyrównywanie danych...n...1210 Trik 10. Wywoływanie wszystkich krótkich funkcji w miejscu...1210 Literatura...n...n......1210 Podsumowanie...n...n... 1210 Instalowanie DirectX...n...n...12 15 Korzystanie z kompilatora Visual C/C++...n...1216 Kilka praktycznych porad związanych z kompilacją...n...1216 Trygonometria...n...n....1219 Wektory...n...n...1222 Długość wektora...n...n...1223 Normalizacja...n...n...122 3 Mnożenie wektora przez skalar...n...1223 Dodawanie wektorów...n...1224 Odejmowanie wektorów...n...1225 Iloczyn skalarny wektorów...n...1225 Iloczyn wektorowy wektorów...n...1227 Wektor zerowy...n...n...1228 Wektory pozycji...n...n...1228 Wektory jako liniowe kombinacje wektorów jednostkowych...1229 Czym język C++ różni się od C...n...1231 Minimum tego co trzeba wiedzieć o C++...n...1233 Nowe typy, słowa kluczowe i konwencje...n...1234 Komentarze...n...n...123 4 Stałe...n...n......1234 Zmienne referencyjne...n...1234 Tworzenie zmiennych w dowolnym miejscu kodu...n..1235 Zarządzanie pamięcią...n...n..123 6 Strumienie wejścia i wyjścia...n...1236 Klasy...n...n...1238 Całkiem nowy typ struktur...n...1238 Przykład prostej klasy...n...1239 Publiczne a prywatne...n...1240 Funkcje składowe klasy (metody)...n...1240 Konstruktory i destruktory...n...1242 Pisanie konstruktora...n...1243 Pisanie destruktora...n...n.1244 Operator ustalania zakresu...n...1246 Pisanie funkcji składowych klasy poza zakresem klasy...1246 Przeciążanie operatorów i funkcji...n...1247 Podstawy korzystania z szablonów...n...1249 Wprowadzenie do obsługi wyjątków...n...1250 Komponenty składające się na obsługę wyjątków...n...1251 Podsumowanie...n...n... 1254

16 Triki najlepszych programistów gier 3D. Vademecum profesjonalisty Witryny poświęcone programowaniu gier i nowinkom programistycznym...1255 Witryny, z których można ściągać użyteczne materiały i programy...1256 Silniki 2D i 3D...n...n......1256 Książki poświęcone programowaniu gier komputerowych...1257 Strony Microsoftu poświęcone interfejsowi DirectX...n...1257 Grupy dyskusyjne Usenetu...n...1257 Najnowsze wiadomości z branży: Blues News...n...1258 Magazyny komputerowe poświęcone projektowaniu gier...1258 Dodatkowe materiały do gry Quake...n...1258 Darmowe modele i tekstury...n...1258 Twórcy witryn poświęconych grom komputerowym...n...1258

Rozdział 10. Nie bój się, to nie jest groźba pod Twoim adresem Marla, Fight Club Dość długo udawało się nam unikać tematu przycinania scen 3D, przyszedł jednak czas na rozwiązanie i tego problemu. Nie da się już dłużej omijać tematu przycinania. Dlatego w bieżącym rozdziale omówione zostaną podstawy teoretyczne oraz zaprezentowany będzie praktyczny szkielet modułu przycinania scen 3D; wskazane zostaną też powody, dla których konieczne jest realizowanie przycinania scen oraz działający przykład wykorzystania tej techniki. Głównśymi wątkami rozdziału będą: wprowadzenie do przycinania scen 3D; podstawy teoretyczne algorytmów przycinania; implementacja przycinania sceny do ostrosłupa widześnia; zabawa z przycinaniem. Przycinanie jako jedna z technik przetwarzania sceny w grafice komputerowej wzmiankowane było w niniejszej książce już kilkukrotnie; stosowne omówienia znajdują się również w drugim wydaniu książki Tricks of the Windows Game Programming Gurus. Przycinanie to jedna z najważniejszych technik grafikśi 3D, gdyż źle przycinane sceny są nie tylko nieprawidłowo wyświetlane na ekranie, ale również ich rzutowanie w ostrosłupie widzenia może doprowadzić do błędów dzielenia przez zero i niepoprawnych odwołań do pamięci. Mając to na uwadze przypomnimy sobie różne techniki przycinania i wskażemy przyczyny ich stosowania. O przycinaniu w przestrzeni obiektu mówimy wtedy, gdy przycinaniu do wyznaczonego obszaru podlegają współrzędne geometryczne elementów sceny. Obszar przycinania może być dwu- lub trójwymiarowy istotne jest to, że przycinanie zachodzi w matematycznej reprezentacji sceny i dotyczy matematycznych reprezentacji obiektów, trójkątów, elementów podstawowych i wszelkich innych części sceny. Zaletą przycinania w przestrzeni obiektu jest prostota: przy pomocy listy wierzchołków wielokątów tworzących scenę przycina się ich współrzędne do wyznaczonego dwu- lub trójwymiarowego obszaru rzutowania. Listę przyciętych trójkątów przekazuje się do następnego etśapu potoku renderowania. Wady przycinania w przestrzeni obiektu tkwią, jak zwykle, w szczegółach implementacyjnych. W omawianych w tej książce mechanizmach obrazowania jako elementy konstrukcyjne wykorzystywane są zawsze trójkąty. Tymczasem w wyniku przycinania, czy to do prostokąta rzutu dwuwymiarowego, czy do ostrosłupa widzenia, do sceny wprowadzane są wielokąty z więcej niż trzema wierzchołkami (a więc w wyniku przycinania scena przestaje składać się już wyłącznie z trójkątów). Tak więc dla każdej płaszczyzny przycinania

756 Część III Podstawy renderowania 3D należy przewidzieć potrzebę wprowadzenia dodatkowych wierzchołków przetwarzanych trójkątów, przez co stają się one czworokątami bądź wielokątami o jeszcze większej liczbie kątów. To pierwsza trudność. Gdyby silnik graficzny optymalizowany był pod kątem przetwarzania wielokątów o dowolnej liczbie wierzchołków, nie byłoby problemu, ale dotychczas omówione optymalizacje przetwarzania 3D opierały się zawsze na założeniu, że scena składa się wyłącznie z trójkątów. Dalej, przycinanie w dowolnym systemie przestrzeni obiektu oznacza konieczność przecinania prostych prostymi, prostych płaszczyznami i tak dalej. Z pozoru proste, operacje te okazują się trudne w wydajnej implementacji, wymagając rozwiązania wielu problemów. Przycinanie 2D w przestrzeni obiektu nie jest nam całkiem obce, ponieważ wielokrotnie prezentowaliśmy je dla grafiki 2D. Podstawowa koncepcja takiego przycinania zakłada, że dysponujemy gotowymi już rzutami prostych i wielokątów, które należy przyciąć do prostokątnego obszaru widzenia. Kod implementujący takie przycinanie prezentowany był już zarówno w tym, jak i poprzednim wydaniu książki. Przycinanie 2D nie może być dłużej pomocne, ponieważ podstawowym problemem jest to, że w przestrzeni trójwymiarowej rzutowaniu podlegają wielokąty, które mogą być potencjalnie tak rozległe, że nie tylko przenikają przez bliską płaszczyznę przycinania, ale również przez płaszczyznę o współrzędnej z równej 0, stąd do rzutowania przekazywane są wierzchołki o ujemnych wartościach tej współrzędnej (jak na rysunku 10.1). Wyłania się więc potrzeba opracowania techniki bardziej agresywneśgo przycinania 3D w przestrzeni obiektu. Rzutowanie wierzchołków o współrzędnej z mniejszeji lub równej zeru prowadzi do błędów

Rozdział 10. Przycinanie scen 3D 757 Jeżeli mechanizm obrazowania sceny ma sobie radzić z wielokątami o dowolnych rozmiarach i rozmieszczeniu, nie da się w prosty sposób uniknąć przycinania sceny do bliskiej płaszczyzny przycinania (patrz rysunek 10.2). Najbardziej prymitywnym sposobem uniknięcia przycinania jest usuwanie w całości ze sceny tych wielokątów, których wierzchołki wystają poza płaszczyznę przycinania, ale wymaga to konstruowania sceny z wielokątów o ograniczonym rozmiarze (patrz rysunek 10.3). Przy tym fragmenty scen przylegające do płaszczyzn przycinania nie będą właśściwie obrazowane. Zbyt długie wielokąty muszą zostać przycięte Niewielkie wielokąty mogą zostać w całości usuniętie bądź zaliczone do sceny

758 Część III Podstawy renderowania 3D Warunkiem koniecznym prawidłowego obrazowania sceny jest przycinanie wszystkich wielokątów sceny do bliższej płaszczyzny, przy czym uzyskane w wyniku przycięcia wielokąty mogą przestać być trójkątami. Trzeba się więc liczyć z koniecznością ponownego podziału powstałych wielokątów na trójkąty i tym samym przebudowania listy obrazowanych wielokątów. W najgorszym więc przypadku konieczne będzie przycięcie wszystkich wielokątów do bliskiej płaszczyzny przycinania, co sprowadza się do wyliczania punktów przecięcia prostych i płaszczyzn. W szczegółach problem okazuje się poważniejszy. Wiemy już o konieczności ponownego podziału sceny na trójkąty; dodatkowo należy jeszcze przyciąć współrzędne tekstur, przeliczyć dane potrzebne do cieniowania powierzchni i wyliczyć nowe wartości wektorów normalnych wierzchołków widać, że trudności jest niemałśo, ale poradzimy sobie i z nimi. Z drugiej strony, niebawem okaże się, że nie ma potrzeby wykonywania operacji przycinania dla pozostałych płaszczyzn ostrosłupa widzenia. Spójrzmy na rysunek 10.4. Okazuje się, że przycinanie wielokątów do dalekiej płaszczyzny przycinania jest zwykłą stratą czasu. Jaki byłby zysk? Praktycznie żaden. Co gorsza, przycinanie to znacznie zwiększyłoby czas przetwarzania sceny. Wystarczy więc (zamiast przycinać) odrzucać w całości te wielokąty, które znajdują się poza daleką płaszczyzną przycinania niezależnie od ich odległości od tej płaszczyzny. Wielokąty, które w całości znajdują się poza tą płaszczyzną, zostaną raczej usunięte z wykorzystaniem sfer otaczających niż przycśinania. Nie wszystkie płaszczyzny ostrosłupa widzenia wymaigają przycinania 3D Dalej, również przycinanie na płaszczyznach tworzących górną, dolną, lewą i prawą ścianę ostrosłupa widzenia nie ma sensu. Przycinanie na ścianach ostrosłupa widzenia zajęłoby cenny czas, a służyłoby tylko do tego, żeby rzut sceny nie wykraczał poza obszar dwuwymiarowej płaszczyzny widoku sceny. O to można zaś zadbać na etapie rasteryzacji, w obszarze bufora ramki ekranu, co jest nieporównanie szybsze niż przycinanie w przestrzeni obiektu. Unikając przycinania na płaszczyznach ostrosłupa widzenia eliminujemy również ze sceny i potoku renderowania potencjalne dodatkowe wielokąty, powstałe z podziału wielokątów na granicach obszaru przycinania.

Rozdział 10. Przycinanie scen 3D 759 Naturalnie, jeżeli Czytelnikowi zależy na elegancji i kompletności mechanizmu obrazowania, może pokusić się o implementację przycinania dla wszystkich płaszczyzn; zostanie to zresztą pokazane w dalszej części rozdziału. Główny nacisk zostanie jednak położony na następujące etapy przycinania i usuwania wielokątów (patrz rysunek 10.5): Etapy w potoku przycinania 3D Usunięcie wszystkich zbędnych obiektów. Usunięcie wielokątów zwróconych tyłem do obserwatora. Przycięcie wszystkich wielokątów do obszaru ostrosłupaś widzenia. Pełnego przycinania wymaga jedynie bliska płaszczyzna przycinania w osi Z. Przyciśnanie na pozostałych pięciu płaszczyznach sprowadza się zaś do prostej kwalifikacji wielokątaś do sceny w całości (jeżeli trójkąt znajduje się częściowo lub w całości w obszarze przycinania, zostśaje zaliczony do sceny w całości; trójkąty pozostające w całości poza lewą, prawą, górną i dolśną płaszczyzną ostrosłupa widzenia można w całości usunąć ze sceny). Przekazanie wszystkich wielokątów do następnych etapówś potoku renderowania; wszelkie trójkąty wystające poza obszar płaszczyzny rzutu można przyciśąć na etapie rasteryzacji. Taki system przycinania jest łatwy w implementacji, działa znakomicie, i co najważniejsze jest bardzo szybki. Należałoby jeszcze sprecyzować, co należy rozumieć pod pojęciem przycinania w obszarze rzutu ekranu. Sytuacja wejściowa prezentowana jest na rysunku 10.6: wielokąt jest gotowy do odrysowania, ale jego fragment wystaje poza jedną z prostych wyznaczających obszar obrazu sceny. Nie jest to problem, o ile przycinanie ma nastąpić w pionie. Wystarczy rozpocząć pętlę odrysowywania wielokąta od wierzchołka uzyskanego przez obliczenie punktu przecięcia trójkąta z obszarem obrazu. Wyliczenie takie to zaledwie jeden dodatkowy wiersz kodu programu. W przypadku przecięcia z lewą bądź prawą krawędzią obrazu procedura odrysowywania jest nieco inna: przycinane są kolejne linie tworzone w pętli odrysowywania. Jest to szybsze niż przycinanie każdego wystającego trójkąta do wszystkich czterech płaszczyzn ostrosłupa widzenia. To ostatnie oznacza bowiem dodanie do sceny potencjalnie wielu nowych wielokątów, a co za tym idzie, oznacza konieczność wyliczania nowych współrzędnych teksturowania, przeliczania wektorów normalnych wielokątów i wierzchołków i tak dalej. Tymczasem aż nadto obciążające obliczeniowo jest już samo przycinanie do bliskiej płaszczyzny prśzycinania.

760 Część III Podstawy renderowania 3D Przycinanie w obszarze obrazu sceny, podczas rysowywania wielokątów Z drugiej strony, nie można dopuścić, aby przycinanie w obszarze bufora ramki doprowadziło do utraty jakichkolwiek informacji 3D; będą one jeszcze potrzebne, między innymi przy okazji konstruowania bufora Z. Operacje w obszarze bufora ramki wymagają ostrożności: gdy dojdzie do interpolacji wartości współrzędnych z dla krawędzi wielokątów, konieczne będzie zachowanie przynajmniej współrzędnych z wierzchołków. Chodzi o to, że podczas ostatecznej rasteryzacji nie można będzie już realizować przycinania wyłącznie na podstawie wartości współrzędnych 2D. Dojdśziemy do tego w stosownym czasie. Przed wkroczeniem w obszar teorii algorytmów przycinania chciałbym uprzedzić, że poważne nazwy co niektórych algorytmów niekiedy rozśmieszają, a to dlatego, że każdy z nich można wymyślić samemu wszystkie są po prostu formalizacją tego, co w domu robi każdy, kto zajmuje się choć trochę algorytmami graficznymi. Nazewnictwo algorytmów jest zresztą nieodłącznym problemem grafiki komputerowej: co i raz ktoś wymyśla nowy algorytm i publikuje go; odtąd zaczyna on funkcjonować pod pewną nazwą, niezależnie od innych nazw tego samego algorytmu publikowanego gdzie indziej. Nie zawsze zresztą nowa nazwa starego algorytmu jest dziełem samego autora publikacji często czytelnicy zaczynają odwoływać się do nowego algorytmu pod nową nazwą. Przycinanie to koncepcja na tyle prosta, że śmieszne byłoby sądzić, że została odkryta przez jedną konkretną osobę. Każdy algorytm przycinania jest pewnym wcieleniem zdroworozsądkowego podejścia do przetwarzania grafiki i opiera się na wyliczaniu punktów przecięcia wierzchołków. Algorytmy takie produkuje się zwykle pod presją pojawiających się zadań niejednokrotnie wyważa się wtedy otwarte już drzwi. Do czego zmierzam? Otóż nieco dalej wymienione zostaną z nazwy pewne powszechnie przyjęte algorytmy przycinania, jednak nie powinniście na ich podstawie wyrabiać sobie poglądu, że są one jedynymi możliwymi wcieleniami przycinania. Jak Wam zapewne wiadomo, programista niejednokrotnie spędza całe godziny na rozwiązaniu problemu, po czym dowiaduje się, że jego rozwiązanie jest bardzo podobne do już istniejących algorytmów. W przypadku algorytmów przycinania byłoby prościej, gdyby ich nazwy były bardziej opisowe. Istniejące 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, powodującym, że opisywana przezeń technika nie jest bynajmniej oczywista dla osób ś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ł trójwymiarowej przestrzeni BSP nie jest bowiem algorytmem trywialnym. Kiedy jednak chodzi o przycinanie wielokąta do innego wielokąta, opracowanie algorytmu wymaga godziny (może dwóch) zastanowienia, spędzonego na kombinowaniu metod przycinania odcinków, klasyfikacji wierzchołków, kodowania bitowego czy parametrycznych reprezentacji prostych. Iś tyle! Mam zamiar, rzecz jasna, zachęcić Was do eksperymenctów. Co prawda, dziewięćdziesiąt dziewięć procent rozwiązywanych w ten sposób problecmów doczekało się już rozwiązania, nie oznacza o jednak, że rozwiązania te zostały gdzicekolwiek opublikowane. Dosyć narzekania. Do dzieła! Przystąpimy teraz do omówienia z teoretycznego punktu widzenia najpopularniejszych algorytmów przycinania, po czym zajmiemy się implementacją takiego algorytmu na potrzeby naszego silnika graficznego. Prezentowany algorytm, jako że powstał pod presją konkretnego problemu, będzie hybrydą wielu pomysłów. Na początek nieśco informacji podstawowych. Przycinanie wielokątów sprowadza się do przycinania odcinków, co z kolei sprowadza się do określania, czy pewne punkty zawierają się w danym obszarze dwuwymiarowym bądź w trójwymiarowej bryle. Ilustracją problemu w jego postaci ogólnej jest rysunek 10.7. Otóż dany jest zbiór odcinków, tworzących wchodzące w skład sceny wielokąty, które mają zostać później poddane rzutowaniu. Należy określić, czy elementy te mieszczą się w pewnych zadanych granicach. Da się to sprowadzić do określenia, czy w granicach tych mieszczą się pojedyncze punkty charakterystyczne elementów. Innymi słowy, dane trójkąty determinowane są trzema wierzchołkami, łączonymi trzema odcinkami (krawędziami). Choć to właśnie krawędzie nadają trójkątowi zarys, naprawdę ważne są jedynie wierzchołki. Stąd, na najwyższym poziomie ogólności, problem sprowadza się do sprawdzenia, czy punkt o współrzędnych (x, y) bądź (x, y, z) znajduje się w zadanym obszarze (bryle), a więc do testu zawierania się punktu. Test zawierania się na płaszczyźnie dwuwymiarowej

762 Część III Podstawy renderowania 3D Dla danego punktu p0(x, y) i prostokątnego obszaru wyznaczanego prostymi xmin, xmax, ymin, ymax (patrz rysunek 10.7), punkt p0 zawiera się w zadanym obszarze, jeżeli spełnia nastśępujące nierówności: i Przypadek 1. Zawieranie się punktu w bryle prostopadłościennej. Dla danego punktu p0(x, y, z) i prostopadłościennego obszaru wyznaczonego płaszczyznami xmin, ymin, zmin, xmax, ymax, zmax (patrz rysunek 10.8), punkt p0 zawiera się w zadanym obszarze, jeżeli spełnia następujące nierówności: Testowanie zawierania się punktu w bryle 3D i i Pojawia się tu wątpliwość, czy warto zawracać sobie głowę przycinaniem do bryły prostopadłościennej, jeżeli z góry wiadomo, że ostrosłup widzenia taką bryłą nie jest? To prawda, ale wystarczy przypomnieć sobie omówienie rzutowania i dyskutowany przy tej okazji efekt prostowania ostrosłupa widzenia właśnie do postaci bryły prostopadłościennej. W takim przypadku przycinanie sprowadza się do trywialnych porównań współrzędnych wierzchołków wielokątów sceny ze współrzędnymi wierzchołków ścian bryły zawierania. Nikt też nie mówił, że przycinanie realizowane jest wyłącznie do ostrosłupa widzenia przecież promienie lasera wystrzeliwane w grze warto przyciąć również do jakiejś skończonej bryły w rozległym świecie gry kosmicznej, aby nie przeliczać ich pozycji w nieskończoność, gdy dawno opuściły penetrowany układ planetarny.

Rozdział 10. Przycinanie scen 3D 763 Przypadek 2. Przypadek ogólny zawierania się punktu w bryle ostrośsłupa widzenia. Przypadek ten będzie interesował nas najbardziej. To standardowy przypadek w przycinaniu: danych jest sześć płaszczyzn tworzących ścięty ostrosłup widzenia, do którego należy przyciąć wszelkie elementy geometryczne sceny. Ostrosłup widzenia można zdefiniować na kilka sposobów, na przykład przez określenie współrzędnych z płaszczyzn przycinania (bliższej i dalszej) wraz ze współrzędnymi prostokątnego obszaru na płaszczyźnie bliższej. Jednak niezależnie od sposobu wyznaczenia zadanych będzie sześć płaszczyzn. Nazwijmy je Pgórna, Pdolna, Pprawa, Plewa, Pdaleka i Pbliska. Dodatkowo załóżmy, że płaszczyzny zdefiniowano w taki sposób, że ich wektory normalne skierowane są do wewnątrz bryły ściętego ostrosłupa widzenia. Dalej, dla punktu p0(x, y, z) można wyznaczyć półprzestrzeń, w której się znajduje. Przynależność do półprzestrzeni dodatniej oznacza, że punkt znajduje się po wewnętrznej stronie płaszczyzny przycinania, przynależność do półprzestrzeni ujemnej że punkt znajduje się po stronie zewnętrznej, a tym samym poza ostrosłupem widzenia. Przypominacie sobie zapewne, że do określenia, czy dany punkt leży na płaszczyźnie, czy też należy do półprzestrzeni dodatniej bądź ujemnej, służy równanie płaszczyzny, prezentowane w rozdziałach 4. i 5. Załóżmy więc, że operator HS(p, pł) zwraca wartość półprzestrzeni punktu p względem płaszczyzny pł (dla półprzestrzeni dodatniej wynikiem operatora jest +1, dla ujemnej 1, a w przypadku, gdy punkt znajduje śsię dokładnie na płaszczyźnie 0). Do określenia zawierania się punktu w bryle niezbędne jest sprawdzenie, czy współrzędne punktu spełniają następujące nierówności: Obliczenia te są tylko pozornie skomplikowane. Znamy już sposób określania, czy dany punkt znajduje się wewnątrz, czy na zewnątrz wyznaczonego obszaru przycinania, zarówno na płaszczyźnie, jak i w przestrzeni trójwymiarowej. Kolejny krok to przejście na wyższy poziom abstrakcji i przycinanie odcinków (krawędzi) wyznaczanych punktami i tym samym przycinanie konturów trójkątów. Potrzebujemy tu narzędzia służącego do wykrywania punktów przecięć odcinków z płaszczyznami i innymi odcinkami. Stosowne wzory podane zostały i omówione w rozdziałach 4. i 5., nie będziemy więc od nowa ich wyprowadzać; konieczne będzie jednak odświeżenie pamięci. Przycinanie wielokątów to tylko pewne rozszerzenie zagadnienia przycinania odcinków, więc nie uprzedzając omówienia rzecz sprowadza się do wymyślenia sposobu przycięcia odcinka względem nieskończonej prostej (na płaszczyźnie) bądź względem płaszczyzny (w przestrzeni 3D). Pełny algorytm przycinania sceny to po prostu iteracyjne lub rekurencyjne stosowanie procedury przycinania dla każdego odcinka wielokąta względem każdej płaszczyzny przycinania ograniczającej ostrosłup widzenia. Naturalnie, algorytmy przycinania są odpowiednio optymalizowane, ale sprowadzają się właśnie do powyższej procedury, i to niezależnie od liczby wymiarów sceny. Skupmy się na zagadnieniu przycinania odcinków. Na pierwszy ogień pójdzie przypadek przycinania w przestrzeni dwuwymiarowej. Odwołując się do rysunku 10.9 wyobrażamy sobie odcinek łączący punkty p0(x0, y0) i p1(x1, y1). Odcinek ten ma zostać przycięty względem pionowej prostej wyznaczanej równaniem x = xl. Przycinanie trójkątów rzadko będzie odbywało względecm prostych o dowolnym kierunku zwykle wystarcza analiza przypadków względem prostcych poziomych i pionowych.

764 Część III Podstawy renderowania 3D Proste przycinanie odcinków Aby przyciąć prostą (odcinek), wystarczy dokonać konwersji jej reprezentacji do postaci parametrycznej i podstawić wartość x w punkcie przecięcia. Oto sposób rozuśmowania, który prowadzi do takiego wniosku: W postaci wektorowej pozycja punktu wzdłuż odcinka tśo: W postaci rozbitej na składowe: Do sprawdzenia, czy dany odcinek przecina zadaną prostą pionową, należy podstawić wartość x definiującą tę prostą (tutaj x = xl) do lewej strony równania dla składowej x, a następnie wyliczyć z tego równania wartość t. Jeżeli t należy do przedziału <0, 1>, odcinek przecina zadaną prostą; dla t spoza tego przedziału wiadomo, że odcinek nie przecina prostej: Po podstawieniu w miejsce x wartości xl otrzymujemy: Stąd t ma wartość: Jeżeli t ma wartość pomiędzy 0 a 1, odcinek przecina prostą. Należy pamiętać, że odcinek zdefiniowany tak, jak w przykładzie, rozciąga się pomiędzy punktami p0 i p1, przy t zmieniającym się od 0 do 1. Wartości 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 mieści się ona w zakresie od 0 do 1,wystarczy podstawić je do równania dla składowej y:

Rozdział 10. Przycinanie scen 3D 765 I otrzymujemy współrzędne punktu przecięcia z danego odcinka z prostą pionową x = xl. Wyznaczenie punktu przecięcia z prostą poziomą jest równie proste, tyle, że jako pierwsze rozwiązujemy równanie dla składowej y i uzyskaną stąd wartość t podstawiamy do równania dla składowej x. Oto przykład dla prostej odcięcia wyznaczanej wzorem y = yl: Po podstawieniu yl do odpowiedniego równania otrzymuśjemy: Stąd wartość t to: Po sprawdzeniu wartości t otrzymujemy informację, czy nastąpiło przecięcie danych odcinków (dla t z zakresu od 0 do 1). Jeżeli tak, podstawiamy otrzymaną wartość dśo równania składowej x: I otrzymujemy drugą współrzędną punktu przecięcia odścinka z poziomą prostą y = yl. Oczywiście, efektywna implementacja takiego przycinania wymaga podejścia zdroworozsądkowego i wprowadzenia stosownych testów odsiewających. Przykładowo, jeżeli punkty końcowe p0 i p1 mają identyczne współrzędne, w ogóle nie trzeba przeprowadzać testu na przecięcie z prostą. Podobnie daremna jest próba obliczenia punktu przecięcia odcinka poziomego z pośziomą prostą i tak dalej. Przypadek przecinania prostych w przestrzeni trójwymiarowej okazuje się równie łatwy jak na płaszczyźnie cały problem sprowadza się do odpowiedniej reprezentacji płaszczyzn. Na razie nie będziemy jednak wprowadzać żadnych sztuczek i przyjrzymy się ogólnemu przypadkowi przycinania odcinków w przestrzeni 3D przy zadanej parametrycznie prostej i zadanej płaszczyźnie. Problem ilustrowany jest rysunkiem 10.10. Na pierwszy ogień pójdzie równanie płaszczyzny będzie ona definiowana w postaci punktu zaczepienia i wektora normalnego płaszczyzny. Odcinek przecinający płaszczyznę w przestrzeni trójwymiarowej Niech p0 = (x0, y0, z0) będzie punktem leżącym na płaszczyźnie, a n [nx, ny, nz] wektorem normalnym tej płaszczyzny. Równanie płaszczyzny przyjmie wtedy śpostać:

766 Część III Podstawy renderowania 3D Odcinek pomiędzy punktami p1 i p2 dany będzie parametrycznie, w zapisie wektorowym: W postaci równań składowych: Pora na wyliczenie punktu przecięcia. Ponownie odsyłam Was do rozdziału 4., w którym zaprezentowano wzory niezbędne do realizacji obliczenia; objaśnienie procesu obliczeniowego można jednak sprowadzić do stwierdzenia, że wartości x, y i z prostej parametrycznej podstawiane są do równania płaszczyzny, po czym z równania tego obliczana jest wartość t: Po podstawieniu x, y i z do równania płaszczyzny otrzśymujemy: Po obliczeniu wartości t należy podstawić ją z powrotem do równania prostej w ten sposób wyliczone zostaną odpowiednie współrzędne punktu przecięcia. Jako, że pokazywaliśmy to już dla przypadku 2D, poszczególne etapy obliczenia zostaną tym razem pominięte. To już wszystko na temat przycinania, sprowadza się on bowiem właśnie do umiejętności obliczania punktów przecięcia prostej z prostą i prostej z płaszczyzną. Teraz wiedzę tę należy wykorzystać w algorytmie, który będzie ją efektywnie implementował. Przejdźmy więc do opisu kilku popularnych algorśytmów przycinania. Algorytm Cohena-Sutherlanda to jedna z najpopularniejszych technik przycinania odcinków do prostokątnych obszarów płaskich bądź do prostopadłościennych brył w przestrzeni trójwymiarowej. Algorytm dzieli się na dwie fazy. W fazie klasyfikacji punktów końcowych każdy odcinek na płaszczyźnie bądź w przestrzeni jest oznaczany jako leżący wewnątrz lub w poza obszarem przycinania; do klasyfikacji wykorzystuje się kodowanie bitowe, reprezentujące pozycję każdego z punktów końcowych odcinka jako wewnątrz (1) lub poza (0) zadanym obszarem. Schemat kodowania klasyfikującego dla przypaśdku 2D ilustrowany jest rysunkiem 10.11. Każdy wierzchołek (x, y) odcinka ograniczonego punktami p0(x0, y0) i p1(x1, y1) wymaga osobnej klasyfikacji. Klasyfikacja punktów końcowych odcinka kodowana jest na czterech (sześciu w przestrzeni trójwymiarowej) bitach. Kod dla punktu p0 określać będziemy symbolem kb0 (analogicznie, dla p1 będzie to symbol kb1). Bity reprezentujące poszczególne obszary klasyfikacji mogą być kodowane w dowolny sposób, dla obszaru prostokątnego ograniczanego punktami (xmin, ymin) i (xmax, ymax) przyjęto jednak kody wymienione w tabeli 10.1. Kodowanie położenia wierzchołków odcinków w algorytimie Cohena-Sutherlanda Nr bitu Znaczenie dla wartości 1, powyżej górnej krawędzi obszaru przycinania, poniżej dolnej krawędzi obszaru przycinania, na prawo od prawej krawędzi obszaru przycinania, na lewo od lewej krawędzi obszaru przycinania