IDZ DO
IDZ DO
PRZYKŁADOWY ROZDZIAŁ
PRZYKŁADOWY ROZDZIAŁ
C++Builder 2006.
SPIS TRESCI
SPIS TRESCI
222 gotowe rozwiązania
KATALOG KSIĄŻEK
KATALOG KSIĄŻEK
Autor: Jacek Matulewski
ISBN: 83-246-0395-6
KATALOG ONLINE
KATALOG ONLINE
Format: B5, stron: 496
ZAMÓW DRUKOWANY KATALOG
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
TWÓJ KOSZYK
Firma Borland, producent cenionych Srodowisk programistycznych, połączyła swoje
DODAJ DO KOSZYKA
DODAJ DO KOSZYKA
trzy najpopularniejsze produkty: C++ Builder, Delphi i C# Builder, tworząc pakiet Borland
Developer Studio 2006. Jednym z jego elementów jest najnowsza wersja C++ Builder,
oznaczona symbolem 2006, która nadal pozostaje doskonałym narzędziem
CENNIK I INFORMACJE
CENNIK I INFORMACJE
do tworzenia aplikacji dla platformy Win32. C++ Builder 2006 pozwala na korzystanie
z biblioteki VCL, wywołań WinAPI i funkcji systemu Windows.
ZAMÓW INFORMACJE
ZAMÓW INFORMACJE
O NOWOSCIACH Książka C++ Builder 2006. 222 gotowe rozwiązania to zbiór porad związanych
O NOWOSCIACH
z tworzeniem aplikacji dla systemu Windows. WSród tytułowych 222 rozwiązań
znajdziesz sposoby wykorzystywania komponentów z biblioteki VCL, elementów
ZAMÓW CENNIK
ZAMÓW CENNIK
interfejsu programistycznego Windows (WinAPI), a także komunikatów systemowych
oraz technologii COM, OLE i ActiveX. Dowiesz się, jak tworzyć biblioteki DLL i jak
z nich korzystać, oraz nauczysz się projektować wspomaganą sprzętowo grafikę 3D
CZYTELNIA
CZYTELNIA
za pomocą biblioteki OpenGL.
FRAGMENTY KSIĄŻEK ONLINE
FRAGMENTY KSIĄŻEK ONLINE
" Korzystanie ze Srodowiska C++ Builder 2006
" Projektowanie okien aplikacji
" Operacje na rejestrze systemowym
" Tworzenie wygaszaczy ekranu
" Kontrolowanie działania aplikacji za pomocą funkcji WinAPI
" Obsługa połączeń sieciowych
" Tworzenie bibliotek DLL
" Tworzenie grafiki i animacji 3D
Wykorzystaj w pracy gotowe rozwiązania, sprawdzone przez najlepszych programistów
Wydawnictwo Helion
ul. KoSciuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
6SLV WUH FL
:VWS
&] Ł , %RUODQG 'HYHORSHU 6WXGLR
5R]G]LD 3R]QDMHP\ & %XLOGHU
Pierwszy projekt .............................................................................................................. 17
Projekt 1. Aplikacja Kolory....................................................................................... 17
Projekt 2. Zmiana tytulu formy ................................................................................. 19
Projekt 3. Zmiana napisu na panelu .......................................................................... 20
Projekt 4. Uzgadnianie stanu komponentów po uruchomieniu aplikacji.................. 21
Projekt 5. Ustalanie pozycji okna po uruchomieniu.................................................. 22
Projekt 6. Zapisywanie projektu w plikach ............................................................... 22
Ustawienia projektu......................................................................................................... 25
Projekt 7. Zmiana tytulu i ikony aplikacji................................................................. 25
Projekt 8. Informacje o wersji aplikacji dol czane do skompilowanego pliku .exe..... 26
Przygotowanie aplikacji do dystrybucji .................................................................... 28
Analiza kodu pierwszej aplikacji..................................................................................... 29
Konfiguracja rodowiska w wielkim skrócie .................................................................. 31
Automatyczne zapisywanie plików projektu ............................................................ 32
Dostosowanie menu File/New................................................................................... 32
Opcje edytora ............................................................................................................ 33
Debugowanie kodu .......................................................................................................... 34
5R]G]LD 8]XSHQLHQLH ZLDGRPR FL R &
Wska niki ........................................................................................................................ 42
Wska niki do zmiennych i obiektów. Stos i sterta.................................................... 42
Zagro enia zwi zane z wykorzystaniem wska ników.............................................. 44
Wska niki do funkcji i metawska niki ..................................................................... 46
Podsumowanie........................................................................................................... 47
Referencje........................................................................................................................ 48
Szablony .......................................................................................................................... 49
Klasy................................................................................................................................ 50
Deklaracja klasy. Pola ............................................................................................... 50
Konstruktor................................................................................................................ 51
Metody....................................................................................................................... 53
Operatory skladowe................................................................................................... 54
Przechwytywanie standardowego strumienia wyj cia .............................................. 56
Wyj tki ............................................................................................................................ 57
& %XLOGHU JRWRZH UR]ZLń]DQLD
5R]G]LD 3UDNW\ND SURMHNWRZDQLD DSOLNDFML ] X \FLHP ELEOLRWHNL 9&/
Sztuczki z oknami............................................................................................................ 59
Projekt 9. Aagodne znikanie okna przy zamkni ciu.................................................. 59
Projekt 10. Dowolny ksztalt formy z wykorzystaniem wlasno ci
TransparentColor .................................................................................................... 61
Projekt 11. Zamykanie aplikacji naci ni ciem klawisza Esc .................................... 62
Projekt 12. Aby okno wygl dalo tak samo w systemach z ró n wielko ci
czcionki................................................................................................................... 63
Projekt 13. Aby ograniczyć rozmiary formy............................................................. 63
Projekt 14. Przeci ganie formy mysz za dowolny punkt ........................................ 63
Projekt 15. Wizytówka programu (splash screen)..................................................... 65
Rejestr systemu Windows................................................................................................ 67
Projekt 16. Przechowywanie polo enia i rozmiaru okna w rejestrze........................ 68
Projekt 17. Aby uruchamiać aplikacj po zalogowaniu si u ytkownika................. 71
Projekt 18. Umieszczanie informacji o zainstalowanym programie
(aplet Dodaj/Usu programy) ................................................................................. 74
Projekt 19. Gdzie jest katalog z moimi dokumentami?............................................. 79
Projekt 20. Dodawanie pozycji do menu kontekstowego zwi zanego
z zarejestrowanym typem pliku .............................................................................. 81
Pliki INI ........................................................................................................................... 83
Projekt 21. Jak umie cić na pulpicie lub w menu Start skrót do strony WWW?...... 84
Projekt 22. Jak odczytać i zmienić rozmiar formy? .................................................. 85
Zagadnienia zwi zane z projektowaniem edytorów........................................................ 86
Projekt 23. Wczytywanie pliku ze wskazanego przez u ytkownika pliku.
Okno dialogowe TOpenDialog............................................................................... 87
Projekt 24. Okno dialogowe wykorzystywane przy zapisywaniu dokumentu
w pliku .................................................................................................................... 89
Projekt 25. Przeszukiwanie tekstu. Okno dialogowe TFindDialog........................... 90
Projekt 26. Formatowanie fragmentów tekstu w komponencie TRichEdit.
Okno dialogowe TFontDialog ................................................................................ 92
Projekt 27. Formatowanie poszczególnych atrybutów czcionki ............................... 93
Projekt 28. Powiadamianie o niezapisanych dokumentach....................................... 95
Projekt 29. Wczytywanie dokumentu z pliku wskazanego jako parametr linii
komend.................................................................................................................... 97
Projekt 30. Jak dodać aplikacj do listy edytorów dost pnych z menu
kontekstowego plików o danym rozszerzeniu? ........................................................ 97
Mechanizm drag & drop.................................................................................................. 97
Projekt 31. Mechanizm przenoszenia i upuszczania w obr bie jednej aplikacji....... 98
Projekt 32. Uelastycznianie kodu. Wykorzystanie referencji Sender ..................... 101
Projekt 33. Przenoszenie wielu elementów............................................................. 103
Projekt 34. Obsluga pliku przeniesionego na form z zewn trznej aplikacji ......... 104
Konwersje oraz operacje na la cuchach i dacie ............................................................ 104
Projekt 35. Konwersja mi dzy liczb i la cuchem. Liczby w TEdit.
Konwersja z formatem ustalonym przez programist .......................................... 104
Projekt 36. Prezentowanie daty i czasu w przyjaznej postaci ................................. 106
Projekt 37. Rozkladanie daty i czasu na elementy .................................................. 109
Projekt 38. Jak przekonwertować dat utworzenia pliku na dat typu
TDateTime i potem na la cuch? ........................................................................... 109
Projekt 39. Jak przeksztalcić la cuch na pisany wielkimi lub malymi literami?
Metody klasy AnsiString ...................................................................................... 110
Pliki i system plików ..................................................................................................... 111
Projekt 40. Jak za pomoc komponentów TDriveComboBox, TDirectoryListBox,
TFilterComboBox i TFileListBox stworzyć prost przegl dark plików? .......... 111
Projekt 41. Przegl danie katalogów w FileListBox ................................................ 112
6SLV WUH FL
Projekt 42. Tworzenie pliku tekstowego................................................................. 113
Projekt 43. Odczytywanie plików tekstowych ........................................................ 114
Projekt 44. Pomijanie linii komentarza w plikach tekstowych ............................... 116
Projekt 45. Rejestrowanie zdarze w plikach tekstowych ...................................... 117
Projekt 46. Operacje na plikach i katalogach .......................................................... 120
Projekt 47. Odnajdywanie pliku i odczytywanie jego wlasno ci............................ 121
Projekt 48. Jak wyodr bnić z la cucha nazw pliku, jego rozszerzenie
lub katalog, w którym si znajduje? ....................................................................... 123
Projekt 49. Jak sprawdzić ilo ć wolnego miejsca na dysku? .................................. 123
Projekt 50. Wczytywanie drzewa katalogów i plików ............................................ 124
Projekt 51. Wczytywanie drzewa katalogów i plików w osobnym w tku.............. 126
Projektowanie wygaszaczy ekranu................................................................................ 128
Projekt 52. Wygaszacz ekranu ................................................................................ 129
Projekt 53. Konfiguracja wygaszacza ekranu ......................................................... 135
Projekt 54. Podgl d wygaszacza na zakladce Wygaszacz ekranu apletu
Wla ciwo ci: Ekran .............................................................................................. 140
Drukowanie.................................................................................................................... 143
Projekt 55. Drukowanie tekstu znajduj cego si w komponencie TRichEdit.
Okno dialogowe TPrintDialog................................................................................. 143
Projekt 56. Lista dost pnych drukarek. Szczególowe informacje o drukarce.
Wybór domy lnej drukarki aplikacji z poziomu kodu.......................................... 144
Projekt 57. Drukowanie tekstu przechowywanego w TStrings w trybie
graficznym ............................................................................................................ 145
Projekt 58. Jak wydrukować obraz z pliku?............................................................ 148
5R]G]LD 3URMHNWRZDQLH NRPSRQHQWŃZ 9&/
Grafika. Rysowanie linii................................................................................................ 152
Projekt 59. Rysowanie linii ..................................................................................... 152
Projekt 60. Wybór koloru za pomoc komponentu TColorDialog ......................... 155
Kolorowy pasek post pu................................................................................................ 156
Projekt 61. Przygotowanie komponentu ................................................................. 156
Projekt 62. Testowanie kolorowego paska post pu.
Dynamiczne tworzenie komponentu .................................................................... 162
Projekt 63. Upublicznianie wybranych wlasno ci i zdarze ,
chronionych w klasie bazowej ............................................................................... 164
Projekt 64. Definiowanie zdarze na przykladzie OnPositionChanged.................. 165
Projekt 65. Ikona komponentu ................................................................................ 167
Projekt 66. Aby stworzyć projekt pakietu komponentu .......................................... 168
Projekt 67. Instalowanie komponentu VCL dla Win32 .......................................... 169
Projekt 68. Automatyczna zmiana koloru. Testowanie komponentu i zdarzenia
OnPositionChanged .............................................................................................. 171
&] Ł ,, 3URJUDPRZDQLH :LQGRZV ] Z\NRU]\VWDQLHP :LQ$3,
5R]G]LD .RQWUROD VWDQX V\VWHPX
Zamykanie i wstrzymywanie systemu Windows .......................................................... 177
Projekt 69. Funkcja ExitWindowsEx ...................................................................... 177
Projekt 70. Program slu cy do zamykania lub ponownego uruchamiania
dowolnej wersji systemu Windows ...................................................................... 182
Projekt 71. Funkcja InitiateSystemShutdown ......................................................... 183
Projekt 72. Program zamykaj cy wybrany komputer w sieci ................................. 186
Projekt 73. Hibernowanie i wstrzymywanie systemu za pomoc funkcji
SetSystemPowerState ........................................................................................... 188
Projekt 74. Program umo liwiaj cy hibernacj komputera lub jego usypianie ...... 190
& %XLOGHU JRWRZH UR]ZLń]DQLD
Projekt 75. Blokowanie dost pu do komputera....................................................... 191
Projekt 76. Uruchamianie wygaszacza ekranu........................................................ 191
Projekt 77. Odczytywanie informacji o baterii notebooka...................................... 192
Kontrola trybu wy wietlania karty graficznej ............................................................... 194
Projekt 78. Pobieranie dost pnych trybów pracy karty graficznej ......................... 195
Projekt 79. Identyfikowanie bie cego trybu dzialania karty graficznej ................ 197
Projekt 80. Zmiana trybu wy wietlania................................................................... 199
5R]G]LD 8UXFKDPLDQLH L NRQWURORZDQLH DSOLNDFML RUD] LFK RNLHQ
Uruchamianie, zamykanie i zmiana priorytetu aplikacji ............................................... 201
Projekt 81. Uruchamianie aplikacji za pomoc funkcji WinExec........................... 202
Projekt 82. Uruchamianie aplikacji za pomoc ShellExecute................................. 203
Projekt 83. Przygotowanie e-maila za pomoc ShellExecute ................................. 205
Projekt 84. Zmiana priorytetu bie cej aplikacji..................................................... 205
Projekt 85. Sprawdzenie priorytetu bie cej aplikacji ............................................ 206
Projekt 86. Zmiana priorytetu innej aplikacji.......................................................... 207
Projekt 87. Zamykanie innej aplikacji..................................................................... 208
Projekt 88. Uruchamianie aplikacji za pomoc funkcji CreateProcess................... 209
Projekt 89. Wykrywanie zako czenia dzialania uruchomionej aplikacji................ 215
Projekt 90. Kontrolowanie ilo ci instancji aplikacji na podstawie unikalnej
nazwy klasy........................................................................................................... 217
Kontrolowanie wlasno ci okien..................................................................................... 219
Projekt 91. Lista otwartych okien............................................................................ 219
Projekt 92. Modyfikowanie stanu okna bie cej aplikacji...................................... 222
Projekt 93. Ukrywanie aplikacji na pasku zada .................................................... 223
Projekt 94. Mrugnij do mnie!.................................................................................. 224
Projekt 95. Sygnal d wi kowy................................................................................ 224
Numery identyfikacyjne procesu i uchwyt okna ........................................................... 225
Projekt 96. Jak zdobyć identyfikator procesu, znaj c uchwyt okna?...................... 225
Projekt 97. Jak zdobyć uchwyt glównego okna, znaj c identyfikator procesu? ..... 226
Projekt 98. Kontrolowanie okna innej aplikacji...................................................... 230
Projekt 99. Kontrolowanie innej aplikacji komponent TControlProcess........... 235
Projekt 100. Pakiet dla komponentu TControlProcess............................................ 244
Okna o dowolnym ksztalcie........................................................................................... 244
Projekt 101. Okno o ksztalcie kola.......................................................................... 245
Projekt 102. A czenie obszarów. Dodanie ikon z paska tytulu............................... 246
Projekt 103. Okno z wizjerem................................................................................. 247
Projekt 104. Aby przenosić form myszk pomimo usuni tego paska tytulu ........ 248
5R]G]LD 6\VWHP\ SOLNŃZ PXOWLPHGLD L LQQH IXQNFMH :LQ$3,
Pliki i system plików funkcje powloki ..................................................................... 249
Projekt 105. Jak za pomoc funkcji WinAPI powloki systemu odczytać
cie k do katalogu specjalnego u ytkownika?.................................................... 250
Projekt 106. Tworzenie pliku skrótu .lnk ................................................................ 251
Projekt 107. Odczyt i edycja skrótu .lnk ................................................................. 254
Projekt 108. Umieszczenie skrótu na pulpicie ........................................................ 256
Projekt 109. Operacje na plikach i katalogach realizowane przez funkcje
powloki (kopiowanie, przenoszenie, usuwanie i zmiana nazwy) ......................... 256
Projekt 110. Jak usun ć plik, umieszczaj c go w koszu? ....................................... 258
Projekt 111. Operacje na calym katalogu................................................................ 259
Projekt 112. Odczytywanie wersji pliku .exe i .dll ................................................. 260
Projekt 113. Jak dodać nazw dokumentu do listy ostatnio otwartych
dokumentów w menu Start? ................................................................................. 263
6SLV WUH FL
Odczytywanie informacji o dysku................................................................................. 264
Projekt 114. Funkcja................................................................................................ 264
Projekt 115. Test funkcji ......................................................................................... 269
Projekt 116. Klasa ................................................................................................... 270
Projekt 117. Komponent.......................................................................................... 272
Ikona w obszarze powiadamiania (zasobniku).............................................................. 277
Projekt 118. Funkcja Shell_NotifyIcon................................................................... 277
Projekt 119. Komponent TTrayIcon ....................................................................... 278
Projekt 120. Menu kontekstowe ikony.................................................................... 279
Projekt 121. Dymek ............................................................................................. 280
Internet........................................................................................................................... 281
Projekt 122. Aby sprawdzić, czy komputer jest pol czony z sieci ........................ 281
Projekt 123. Aby pobrać plik z internetu ................................................................ 282
Projekt 124. Aby uruchomić domy ln przegl dark ze wskazan stron ............. 283
Projekt 125. Aby sprawdzić adres IP lub nazw DNS wskazanego komputera ..... 283
Projekt 126. Mapowanie dysków sieciowych ......................................................... 287
Multimedia (MCI) ......................................................................................................... 288
Projekt 127. Aby wysun ć lub wsun ć tack w nap dzie CD lub DVD................. 289
Projekt 128. Wykrywanie wysuni cia plyty z nap du lub umieszczenia jej
w nap dzie CD lub DVD ...................................................................................... 291
Projekt 129. Sprawdzanie stanu wybranego nap du CD lub DVD......................... 291
Projekt 130. Aby zbadać, czy w nap dzie jest plyta CD-Audio ............................. 292
Projekt 131. Kontrola nap du CD-Audio................................................................ 293
Projekt 132. Asynchroniczne odtwarzanie pliku WAVE........................................ 294
Projekt 133. Jak wykryć obecno ć karty d wi kowej?........................................... 295
Projekt 134. Kontrola poziomu glo no ci odtwarzania plików d wi kowych ....... 295
Projekt 135. Kontrola poziomu glo no ci CD-Audio ............................................. 296
Inne ................................................................................................................................ 297
Projekt 136. Jak wy wietlić zaprojektowan przez nas form w innym oknie? ..... 297
Projekt 137. Pisanie i malowanie na pulpicie.......................................................... 297
Projekt 138. Czy Windows mówi po polsku? ......................................................... 298
Projekt 139. Jak zablokować uruchamiany automatycznie wygaszacz ekranu?..... 299
Projekt 140. Zmiana tla pulpitu............................................................................... 299
&] Ł ,,, :\EUDQH WHFKQRORJLH :LQGRZV
5R]G]LD .RPXQLNDW\ :LQGRZV
Projekt 141. Lista komunikatów odbieranych przez kolejk komunikatów
aplikacji (TApplicationEvents.OnMessage)......................................................... 304
Projekt 142. Filtrowanie zdarze ............................................................................. 305
Projekt 143. Odczytywanie informacji dostarczanych przez komunikat ................ 307
Projekt 144. Lista wszystkich komunikatów odbieranych przez okno
(metoda WndProc)................................................................................................ 308
Projekt 145. Metody obsluguj ce komunikaty nieumieszczane w kolejce
komunikatów aplikacji. Wykrywanie zmiany polo enia formy........................... 310
Projekt 146. Wykrycie zmiany trybu pracy karty graficznej .................................. 311
Projekt 147. Wysylanie komunikatów. Symulowanie zdarze ............................... 313
Projekt 148. Wyslanie komunikatu uruchamiaj cego wygaszacz ekranu............... 314
Projekt 149. Blokowanie zamkni cia sesji Windows ............................................. 314
Projekt 150. Wykrycie wlo enia do nap du lub wysuni cia z niego plyty CD
lub DVD; wykrycie podl czenia do gniazda USB lub odl czenia pami ci
Flash...................................................................................................................... 315
Projekt 151. Wykorzystanie komunikatów do kontroli innej aplikacji
na przykladzie Winamp ........................................................................................ 317
& %XLOGHU JRWRZH UR]ZLń]DQLD
Projekt 152. Przenoszenie plików pomi dzy aplikacjami....................................... 318
Projekt 153. Zmiana aktywnego komponentu za pomoc klawisza Enter.............. 320
Projekt 154. XKill dla Windows ............................................................................. 321
Projekt 155. Modyfikowanie menu systemowego formy ....................................... 323
Projekt 156. Modyfikowanie menu systemowego aplikacji w pasku zada ........... 324
5R]G]LD %LEOLRWHNL '//
Funkcje w bibliotece DLL............................................................................................. 328
Projekt 157. Tworzenie biblioteki DLL eksport funkcji .................................... 328
Projekt 158. Statyczne l czenie bibliotek DLL import funkcji.......................... 332
Projekt 159. Dynamiczne ladowanie bibliotek DLL............................................... 333
Projekt 160. Powiadamianie biblioteki o jej zaladowaniu do pami ci lub
usuni ciu z niej ..................................................................................................... 335
Projekt 161. Import funkcji WinAPI....................................................................... 336
Formy w bibliotece DLL ............................................................................................... 338
Projekt 162. Jak umie cić form w bibliotece DLL? .............................................. 338
Projekt 163. Wykorzystanie biblioteki DLL z funkcj tworz c form ................. 341
Aplet panelu sterowania ................................................................................................ 343
Projekt 164. Przygotowanie biblioteki DLL z funkcj zwrotn CPlApplet............ 344
Projekt 165. Przygotowanie instalatora apletu dla Windows XP i Windows 2003... 348
5R]G]LD $XWRPDW\]DFMD L LQQH WHFKQRORJLH ED]XMńFH QD &20
COM .............................................................................................................................. 353
Projekt 166. Wykorzystanie obiektu COM do tworzenia plików skrótu .lnk ......... 354
Osadzanie obiektów OLE2............................................................................................ 355
Projekt 167. Statyczne osadzanie obiektu ............................................................... 355
Projekt 168. Aby zako czyć edycj dokumentu. A czenie menu aplikacji
klienckiej i serwera OLE ...................................................................................... 356
Projekt 169. Wykrywanie niezako czonej edycji przy zamkni ciu programu ....... 357
Projekt 170. Inicjowanie edycji osadzonego obiektu z poziomu kodu ................... 358
Projekt 171. Dynamiczne osadzanie obiektu .......................................................... 358
Automatyzacja ............................................................................................................... 359
Projekt 172. Klasa Variant ...................................................................................... 361
Projekt 173. A czenie z serwerem automatyzacji Excel z u yciem
komponentu TExcelApplication ........................................................................... 362
Projekt 174. A czenie z serwerem automatyzacji Excel z u yciem metody
Variant::GetActiveObject. Odczytywanie stanu aplikacji.................................... 364
Projekt 175. Uruchamianie aplikacji Excel za po rednictwem mechanizmu
automatyzacji (metoda Variant::CreateObject) .................................................... 366
Projekt 176. Uruchamianie procedur serwera automatyzacji.................................. 367
Projekt 177. Eksplorowanie danych w arkuszu kalkulacyjnym.............................. 367
Projekt 178. Korzystanie z okien dialogowych serwera automatyzacji.
Zapisywanie danych w pliku ................................................................................ 369
Projekt 179. Zapisywanie danych z wykorzystaniem okna dialogowego
aplikacji klienckiej ................................................................................................ 370
Projekt 180. Edycja danych w komórkach Excela za pomoc komponentu
TExcelApplication ................................................................................................ 371
Projekt 181. Reagowanie na zdarzenia komponentu TExcelApplication ............... 373
Projekt 182. Korzystanie z funkcji matematycznych i statystycznych Excela ....... 374
Projekt 183. Uruchamianie aplikacji Microsoft Word i tworzenie nowego
dokumentu lub otwieranie istniej cego ................................................................ 375
Projekt 184. Wywolywanie funkcji Worda na przykladzie sprawdzania
pisowni i drukowania............................................................................................ 376
Projekt 185. Wstawianie tekstu do bie cego dokumentu Worda .......................... 377
6SLV WUH FL
Projekt 186. Zapisywanie bie cego dokumentu Worda ........................................ 377
Projekt 187. Zaznaczanie i kopiowanie calego tekstu dokumentu Worda
do schowka ........................................................................................................... 378
Projekt 188. Kopiowanie zawarto ci dokumentu Worda do komponentu
TRichEdit bez u ycia schowka (z pomini ciem formatowania tekstu)................ 378
Projekt 189. Formatowanie zaznaczonego fragmentu tekstu w dokumencie
Worda.................................................................................................................... 379
Projekt 190. Serwer automatyzacji OLE przegl darki Internet Explorer ............... 380
Projektowanie serwera automatyzacji ........................................................................... 381
Projekt 191. Projektowanie serwera automatyzacji ................................................ 381
Projekt 192. Testowanie serwera automatyzacji ..................................................... 385
ActiveX.......................................................................................................................... 387
Projekt 193. Korzystanie z kontrolek ActiveX w projektach dla platformy
Win32.................................................................................................................... 387
5R]G]LD 2SHQ*/
Rysowanie figur w przestrzeni 3D ................................................................................ 392
Projekt 194. Inicjacja grafiki OpenGL w aplikacji projektowanej
w rodowisku C++Builder.................................................................................... 392
Projekt 195. Rysowanie figury plaskiej (trójk ta). Podwójne buforowanie ........... 398
Projekt 196. Poprawianie geometrii frustum........................................................... 400
Projekt 197. Kolor ................................................................................................... 401
Projekt 198. Rysowanie figury przestrzennej (ostroslupa) ..................................... 402
Projekt 199. Wyodr bnienie metody rysuj cej figur ............................................. 404
Projekt 200. Obroty obiektów na scenie. Ruch kamery i ruch aktorów.................. 406
Projekt 201. Przesuni cia obiektu ........................................................................... 409
Projekt 202. Prosta animacja ................................................................................... 411
Projekt 203. Rysowanie osi ukladu wspólrz dnych................................................ 413
Projekt 204. Dodawanie kolejnych figur................................................................. 414
Projekt 205. Bardziej precyzyjne ustawianie kamery ............................................. 415
Projekt 206. Ruch kamery kontrolowany polo eniem kursora myszy.................... 418
Projekt 207. Cieniowanie kolorów na powierzchniach........................................... 421
Kolor i wiatlo ............................................................................................................... 422
Projekt 208. Montowanie wyl cznika kolorów ................................................... 424
Projekt 209. Wl czenie systemu o wietlenia i ustawianie wiatla tla..................... 425
Projekt 210. Uzgadnianie koloru fizycznego przedmiotów z kolorem
ustalanym funkcj glColor .................................................................................... 427
Projekt 211. Ilu programistów potrzeba, aby wkr cić mleczn arówk ................ 429
Projekt 212. Definiowanie wektorów normalnych.................................................. 430
Projekt 213. Gladkie materialy (rozblysk) .............................................................. 435
Projekt 214. Ustawianie reflektora.......................................................................... 436
Projekt 215. O wietlenie ró nobarwne i montowanie wl czników wiatla............ 438
Mieszanie kolorów......................................................................................................... 440
Projekt 216. Przezroczysto ć................................................................................... 440
Projekt 217. Antyaliasing........................................................................................ 444
Projekt 218. Mgla .................................................................................................... 446
Biblioteka GLU ............................................................................................................. 448
Projekt 219. Definiujemy kwadryk i rysujemy sfer ............................................. 448
Projekt 220. Styl rysowania kwadryki .................................................................... 450
Projekt 221. Teksturowanie kwadryki..................................................................... 450
Projekt 222. Inne kwadryki ..................................................................................... 454
& %XLOGHU JRWRZH UR]ZLń]DQLD
'RGDWNL
'RGDWHN $ ,QVWDODFMD L UHMHVWUDFMD %RUODQG 'HYHORSHU 6WXGLR
$UFKLWHFW 7ULDO
Pobieranie klucza rejestracji.......................................................................................... 459
Instalacja Borland Developer Studio 2006 Architect Trial ........................................... 462
Rejestracja Borland Developer Studio 2006 Architect Trial......................................... 466
'RGDWHN % '9' 520 ]DZLHUD
6NRURZLG]
5R]G]LD
OpenGL to biblioteka funkcji realizuj cych operacje graficzne pozwalaj ce na budo-
wanie trójwymiarowych scen (zbiorów figur), o wietlanie ich, dodawanie ró nego typu
efektów zwi kszaj cych wra enie realno ci oraz na ich prezentacj na ekranie. O OpenGL
mo na my leć jak o interfejsie programistycznym (API) karty graficznej. Lub odwrot-
nie, jak o standardzie (zbiorze polece ), który jest implementowany przez wi kszo ć
kart graficznych. Tak czy inaczej renderowanie (przygotowywanie obrazu przestrzen-
nej sceny na płaskim ekranie) wspomagane jest sprz towo przez procesor karty gra-
ficznej (GPU), dzi ki czemu jest bardzo wydajne i nie obci a przy tym głównego
procesora komputera (CPU). To pozwala na generowanie wielu scen w ci gu sekundy
i ich płynn animacj .
OpenGL, podobnie jak konkurencyjny Direct3D (składnik DirectX odpowiedzialny za
grafik trójwymiarow ), mo e słu yć do tworzenia gier, programów CAD czy progra-
mów do wizualizacji naukowych. W tych ostatnich zastosowaniach dobrym przykładem
s programy do prezentacji niezwykle skomplikowanych struktur przestrzennych białek,
co bez technik 3D byłoby trudne do wyobra enia. Z rynku gier OpenGL został niestety
wyparty przez Direct3D i to pomimo powszechnej opinii, e OpenGL jest równie wy-
dajny, a jednocze nie bardziej elegancki i wygodniejszy w u yciu. To ostatnie twierdze-
nie przestało być tak oczywiste od momentu wprowadzenia wersji 8 DirectX, a szcze-
gólnie w stosunku do DirectX.NET, który jest zorientowany obiektowo. Warto podkre lić
zasadnicz ró nic mi dzy DirectX i OpenGL. Ten pierwszy jest własno ci Microso-
ftu i jest rozwijany wył cznie przez t korporacj na potrzeby jednego systemu opera-
cyjnego Windows, podczas gdy OpenGL jest standardem otwartym, dost pnym na
wielu platformach, implementowanym przez wielu producentów kart graficznych1
i otwartym na rozszerzenia. Jego rozwój nadzorowany jest przez ARB konsorcjum
firm, w ród których w chwili obecnej znajduj si m.in. ATI, NVidia, 3DLabs, SGI
(pierwotny twórca tej biblioteki), Sun, Apple, IBM, Dell i Intel. A wi c sami giganci.
Nie ma ju mi dzy nimi Microsoftu, pomimo e był jedn z korporacji-zało ycieli.
Wi cej informacji na temat OpenGL, jego specyfikacji, historii, ARB i samym API mo na
znale ć na jego oficjalnej stronie http://www.opengl.org/. Warto równie zajrzeć na
stron twórcy biblioteki SGI: http://www.sgi.com/products/software/opengl/. Poza tym
1
Istnieje równie implementacja OpenGL 1.1, przygotowana przez Microsoft, która jest doł czana do
Windows.
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
w internecie jest bardzo du o stron zawieraj cych opisy, poradniki i zbiory przykła-
dów, które łatwo odnale ć. S one łatwo rozpoznawane na pierwszy rzut oka, dzi ki
obecnemu na nich logo OpenGL (rysunek 11.1).
5\VXQHN
Oficjalne logo
OpenGL
Zanim rozpoczniemy zabaw , chciałbym uprzedzić, e celem tego rozdziału nie jest
systematyczne wprowadzenie do OpenGL. Na to potrzeba osobnych ksi ek, a nie
rozdziałów2. Moim zamiarem jest jedynie zainteresowanie Czytelnika mo liwo ciami
tej biblioteki, przełamanie obawy przed projektowaniem aplikacji wykorzystuj cej grafik
trójwymiarow i pokazanie, e OpenGL jest stosunkowo łatwy do nauczenia. Posta-
ram si to udowodnić w serii dwudziestu sze ciu ćwicze , które zaczniemy od ryso-
wania trójk tów i figur przestrzennych, potem przejdziemy do obracania ich i prze-
suwania, nast pnie omówimy o wietlenie, a zako czymy na teksturowaniu kwadryk.
Postaram si przy tym, aby atrakcyjno ć przykładów nie została stłumiona przez nad-
miernie teoretyczny komentarz, ale tego nie da si zawsze unikn ć.
5\VRZDQLH ILJXU Z SU]HVWU]HQL '
3URMHNW ,QLFMDFMD JUDILNL 2SHQ*/ Z DSOLNDFML
SURMHNWRZDQHM Z URGRZLVNX & %XLOGHU
Rozpoczniemy od przystosowania aplikacji projektowanej w rodowisku C++Builder
do współpracy z bibliotek OpenGL. Jest to krok do ć mudny, ale na szcz cie wy-
starczy zrobić go tylko raz; w kolejnych projektach mo emy ju korzystać z gotowego
szablonu.
Tworzymy nowy projekt VCL Forms Application C++Builder. W widoku
projektowania powi kszamy form .
Przechodzimy do kodu ródłowego nagłówka Unit1.h i importujemy pliki
nagłówkowe gl.h i glu.h (listing 11.1). Drugi z tych plików b dzie tak naprawd
potrzebny dopiero w dalszych projektach.
W klasie 6(QTO deklarujemy dwie prywatne metody pomocnicze i dwa
prywatne pola:
2
Jednym z ciekawszych kompendiów wiedzy o OpenGL jest OpenGL. Ksi ga eksperta (Wydanie III)
napisana przez Richarda S. Wrighta i Benjamina Lipchaka (Helion 2005).
5R]G]LD 0 2SHQ*/
/LVWLQJ Pełny kod nagłówka Unit1.h
KHPFGH 7PKV *
FGHKPG 7PKV *
KPENWFG %NCUUGU JRR
KPENWFG %QPVTQNU JRR
KPENWFG 5VF%VTNU JRR
KPENWFG (QTOU JRR
KPENWFG IN J
KPENWFG INW J
ENCUU 6(QTO RWDNKE 6(QTO
]
AARWDNKUJGF +&' OCPCIGF %QORQPGPVU
XQKF AAHCUVECNN (QTO%TGCVG 61DLGEV 5GPFGT
XQKF AAHCUVECNN (QTO%NQUG 61DLGEV 5GPFGT 6%NQUG#EVKQP #EVKQP
RTKXCVG 7UGT FGENCTCVKQPU
*&% WEJY[V&% WEJY[V FQ FKURNC[ FGXKEG EQPVGZV &%
*).4% WEJY[V4% WEJY[V FQ 1RGP). TGPFGTKPI EQPVGZV
DQQN ).A7UVCN(QTOCV2KMUGNK *&% WEJY[V&%
XQKF ).A7UVCYKGPKG5EGP[
RWDNKE 7UGT FGENCTCVKQPU
AAHCUVECNN 6(QTO 6%QORQPGPV 1YPGT
_
GZVGTP 2#%-#)' 6(QTO (QTO
GPFKH
3U]HFKRZDQLH XFKZ\WŃZ GR NRQWHNVWX UHQGHURZDQLD MHVW NRQLHF]QH DE\ PR OLZH
E\R XVXQLFLH JR SU]\ ]DPNQLFLX RNQD
Definicj pierwszej metody pokazuje listing 11.2.
/LVWLQJ Implementacja metody inicjuj cej aplikacj OpenGL
DQQN 6(QTO ).A7UVCN(QTOCV2KMUGNK *&% WEJY[V&%
]
2+:'.(14/#6&'5%4+2614 QRKU(QTOCVW2KMUGNK
QRKU(QTOCVW2KMUGNK P8GTUKQP
QRKU(QTOCVW2KMUGNK FY(NCIU 2(&A5722146A12'0). ^ 2(&A&4#9A61A9+0&19 ^
2(&A&17$.'$7(('4 Y QMPKG RQFYQLPG DWHQTQYCPKG
QRKU(QTOCVW2KMUGNK K2KZGN6[RG 2(&A6;2'A4)$# V[R MQNQTW 4)$
QRKU(QTOCVW2KMUGNK E%QNQT$KVU LCMQUE MQNQTY DCLV[
QRKU(QTOCVW2KMUGNK E&GRVJ$KVU INGDQMQUE DWHQTC < \ DWHHGT
QRKU(QTOCVW2KMUGNK K.C[GT6[RG 2(&A/#+0A2.#0'
KPV HQTOCV2KMUGNK %JQQUG2KZGN(QTOCV WEJY[V&% QRKU(QTOCVW2KMUGNK
KH HQTOCV2KMUGNK TGVWTP HCNUG
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
KH 5GV2KZGN(QTOCV WEJY[V&% HQTOCV2KMUGNK QRKU(QTOCVW2KMUGNK VTWG TGVWTP
HCNUG
TGVWTP VTWG
_
A drugiej listing 11.3:
/LVWLQJ Ustawienia dotycz ce filmowanej sceny
XQKF 6(QTO ).A7UVCYKGPKG5EGP[
]
IN8KGYRQTV %NKGPV9KFVJ %NKGPV*GKIJV QMPQ 1RGP). YPGVT\G HQTO[
FQO[UNPKG
WUVCYKGPKG RWPMVW RTQLGMELK
IN/CVTKZ/QFG ).A241,'%6+10 RT\G ćE\GPKG PC OCEKGT\ RTQLGMELK
IN.QCF+FGPVKV[
NGHV TKIJV DQVVQO VQR \PGCT \HCT ENKRRKPI
IN(TWUVWO OPQ\GPKG OCEKGT\[ T\WVQYCPKC RT\G\
OCEKGT\ RGTURGMV[Y[ WUVCNCPKG HTWUVWO
IN/CVTKZ/QFG ).A/1&'.8+'9 RQYTV FQ OCEKGT\[ YKFQMW OQFGNW
IN'PCDNG ).A&'26*A6'56 \ DWHHGT CMV[YP[ WMT[YCPKG PKGYKFQE\P[EJ
RQYKGT\EJPK
_
Zmieniamy własno ć $QTFGT5V[NG formy na DU5KPING oraz
$QTFGT+EQPU DK/CZKOK\G na HCNUG.
Tworzymy metod zdarzeniow do 1P%TGCVG formy i budujemy w niej kontekst
OpenGL zwi zany z bie cym oknem (listing 11.4):
/LVWLQJ Konieczne jest pobranie i przechowywanie uchwytu kontekstu graficznego okna
jest on potrzebny zarówno do renderowania, jak i przy zamykaniu aplikacji
do zwolnienia zasobów u ywanych przez OpenGL
XQKF AAHCUVECNN 6(QTO (QTO%TGCVG 61DLGEV 5GPFGT
]
DKG\CEG QMPQ UVCLG UKG QMPGO 1RGP).
WEJY[V&% )GV&% *CPFNG
KH ).A7UVCN(QTOCV2KMUGNK WEJY[V&% 5JQY/GUUCIG 0KG WFC Q UKś WUVCNKŁ HQTOCVW
RKMUGNK
WEJY[V4% YIN%TGCVG%QPVGZV WEJY[V&%
KH WEJY[V4% 07.. 5JQY/GUUCIG 0KG WFC Q UKś RQDTCŁ WEJY[VW MQPVGMUVW
ITCHKMK
KH YIN/CMG%WTTGPV WEJY[V&% WEJY[V4% 5JQY/GUUCIG +PKELCELC ITCHKMK 1RGP).
PKG RQYKQF C UKś
).A7UVCYKGPKG5EGP[
%CRVKQP #PUK5VTKPI 1RGP). EJCT IN)GV5VTKPI ).A8'45+10
_
Musimy pami tać o usuni ciu kontekstu OpenGL (kontekstu renderowania)
przy zamkni ciu okna. W tym celu tworzymy metod zdarzeniow do 1P%NQUG
formy i umieszczamy w niej polecenia z listingu 11.5:
5R]G]LD 0 2SHQ*/
/LVWLQJ Zwalnianie zasobów zarezerwowanych podczas uruchamiania aplikacji
XQKF AAHCUVECNN 6(QTO (QTO%NQUG 61DLGEV 5GPFGT 6%NQUG#EVKQP #EVKQP
]
YIN/CMG%WTTGPV 07.. 07..
YIN&GNGVG%QPVGZV WEJY[V4%
4GNGCUG&% *CPFNG WEJY[V&%
2QUV3WKV/GUUCIG
_
Po wykonaniu metody (QTO%TGCVG główne okno aplikacji jest przygotowane do ryso-
wania za pomoc OpenGL. W metodzie tej odczytywany jest uchwyt do kontekstu
urz dzenia odpowiedzialnego za przygotowywanie grafiki w oknie aplikacji (ang. display
device context; funkcja )GV&%) i tworzony jest kontekst zwi zany z przygotowywaniem
grafiki za pomoc biblioteki OpenGL (YIN%TGCVG%QPVGZV), która do rysowania wyko-
rzystywać b dzie to okno (za to przypisanie odpowiada funkcja YIN/CMG%WTTGPV). Jest
to do ć zawiłe, wi c nie b d przezwyci ał swojej i Czytelnika zdrowej niech ci przed
gł bszym wnikaniem w to zagadnienie. Wa niejsze jest moim zdaniem, aby my dobrze
zrozumieli ramy, w jakich działa OpenGL, jak inicjowana jest jej maszyna stanów3,
która przechowuje ustawienia sceny, za co odpowiedzialna jest metoda ).A7UVCYKG
PKG5EGP[.
Grafika trójwymiarowa, podobnie jak mechanika klasyczna, opiera si na korzystaniu
z macierzy 33, które opisuj ró nego rodzaju przekształcenia w przestrzeni. Za pomoc
takiej macierzy mo emy zapisać przesuni cie, obrót oraz skalowanie figur, a z ich
zło e (iloczynów macierzy) zbudować dowolne przekształcenia4. W rzeczywisto ci
macierze przekształce u ywane w OpenGL maj rozmiar 44, gdzie dodatkowa współ-
rz dna wektora opisuj cego punkt odgrywa rol współczynnika skalowania (tu nie
u yjemy go ani razu, wi c nie b d wi cej o nim wspominał). Wi kszo ci przekształ-
ce odpowiadaj wygodne w u yciu funkcje (podstawowy zbiór tych funkcji zebrany
został w tabeli 11.1), które buduj odpowiedni macierz i mno przez ni bie c
macierz model-widok. Czym jest macierz model-widok? To macierz zbieraj ca wszyst-
kie przekształcenia5 oryginalnego układu punktów zdefiniowanych na scenie (modelu)
i transformuj ca je do postaci widzianej przez kamer . Domy lnie macierz model-widok
jest jednostkowa, co oznacza brak przekształce tak j te zostawia metoda ).A7UVC
YKGPKG5EGP[.
3
W rozdziale 9. wspomniałem, e biblioteki DLL mog być nie tylko zbiorem funkcji, ale równie
posiadać stan przechowywanych w jej zmiennych globalnych. Maszyna stanu OpenGL to wła nie zbiór
zmiennych biblioteki OpenGL przechowuj cych ustawienia dotycz ce przygotowywania grafiki 3D,
o wietlenia itp.
4
Nie wymieniłem odbicia wzgl dem osi i punktu, bo OpenGL nie posiada osobnych funkcji, które
realizowałyby te przekształcenia.
5
Nale y pami tać, e iloczyn dwóch macierzy 44 jest nadal macierz 44, a wi c jedn macierz mo na
opisywać dowolne zło enie przekształce .
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
7DEHOD Funkcje OpenGL maj wiele odmian przyjmuj cych ró ne typy argumentów
)XQNFMD 1DMF] FLHM
5RG]DM SU]HNV]WDFHQLD
QD]ZD EH] SU]\URVWNŃZ Z\NRU]\VW\ZDQD ZHUVMD
Przesuni cie (translacja) IN6TCPUNCVG IN6TCPUNCVGH
IN4QVCVG IN4QVCVGH
Obrót
Skalowanie IN5ECNG IN5ECNGH
Pomno enie oryginalnych współrz dnych sceny przez macierz model-widok to jednak
dopiero pierwszy etap przygotowywania obrazu, jaki widzimy na ekranie. Kolejnym
etapem jest rzutowanie. Zwi zana jest z nim druga macierz nazywana macierz rzuto-
wania. Polecenie IN/CVTKZ/QFG ).A241,'%6+10 , które znajduje si w metodzie ).A7UVC
YKGPKG5EGP[, zmienia bie c macierz (tj. macierz, której dotycz funkcje z tabeli 11.1)
z macierzy model-widok identyfikowanej przez stał ).A/1&'.8+'9 na macierz rzuto-
wania (stała ).A241,'%6+10). Je eli chcemy, mo emy j przesun ć, obrócić czy powi k-
szyć. Jednak nie ma to wi kszego sensu. Zamiast tego zmienimy j tak, aby przekształ-
cała scen w taki sposób, e rzeczy odległe s mniejsze od tych, które znajduj si
bli ej kamery. Do tego wła nie słu y macierz rzutowania mo e wprowadzać rzut
perspektywiczny. Rzutowanie to nie zachowuje oczywi cie pierwotnych odległo ci
pomi dzy punktami sceny. Alternatyw jest rzut izometryczny (prostopadły, ortogo-
nalny), w którym przedmioty znajduj ce si dalej od kamery s tej samej wielko ci,
co bli sze niej. Ten sposób rzutowania mo e wydawać si nierealistyczny i wobec tego
nieprzydatny, ale znaj go np. wszyscy miło nicy gier fabularnych, w których spraw-
dza si doskonale. Co robimy z macierz rzutowania? Modyfikujemy j za pomoc
funkcji IN(TWUVWO, która ustala własno ci frustum. Jeszcze jedno nowe poj cie? Fru-
stum to po prostu obszar, na którym budowana jest scena wycinek przestrzeni, który
filmuje kamera, ograniczony od strony kamery przez ekran. Przedmioty znajduj ce si
poza frustum nie s renderowane. W zale no ci od stosowanego typu rzutowania fru-
stum mo e mieć kształt prostopadło cianu, którego jedn ze cian jest ekran (rzutowanie
ortogonalne), lub, jak jest w powy szym przykładzie, widocznego na rysunku 11.2
ostrosłupa o podstawie prostok ta ze ci tym czubkiem (rzutowanie perspektywiczne).
Widoczna na listingu 11.3 funkcja IN(TWUVWO mno y jednostkow macierz rzutowania6
przez macierz perspektywy wygenerowan na podstawie argumentów funkcji, generuj c
w efekcie rzut perspektywiczny:
IN(TWUVWO NGYQ RTCYQ F ITC DNKUMQ FCNGMQ
Argumenty wyznaczaj poło enie ekranu w układzie odniesienia, w którym kamera
(niektórzy wol mówić oko ) znajduje si w rodku układu współrz dnych (punkt
). Oznacza to, e dwa ostatnie argumenty wyznaczaj ce najbli szy i najdalszy
plan powinny być wi ksze od zera. W powy szym przykładzie maj one warto ci odpo-
wiednio i . Nale y pami tać, e ich ró nica wyznacza stopie zniekształcenia
obrazu jak wspomniałem, w rzucie perspektywicznym k ty i odległo ci nie s zacho-
wane. Je eli DNKUMQ b dzie bliskie zera, to figury b d si szybko zmniejszać w miar
oddalania si od kamery i szybko przestan być widoczne. Mo na si przekonać o tym,
zmieniaj c na chwil ten parametr z na i uruchamiaj c aplikacj .
6
Macierz jednostkowa została przygotowana funkcj IN.QCF+FGPVKV[.
5R]G]LD 0 2SHQ*/
5\VXQHN
Frustum w rzucie
perspektywicznym
Przestrze ograniczana przez frustum opisana jest za pomoc prawoskr tnego układu
współrz dnych, którego osie OX i OY skierowane s odpowiednio w prawo i do góry
wzgl dem płaszczyzny ekranu, natomiast o OZ skierowana jest od dali do kamery7.
Domy lne poło enie rodka układu współrz dnych, wzgl dem którego ustalane jest poło-
enie figur, zgodne jest z poło eniem kamery. Zatem poło enie płaszczyzny ekranu na
osi OZ w naszym przykładzie to , a najdalszego planu (obie s ujemne).
rodek układu współrz dnych znajduje si w ten sposób poza frustum. Rysowanie sceny
zaczniemy od jej przesuni cia o , a wi c w kierunku dali, aby rodek współrz d-
nych był widoczny na ekranie (znajdował si wewn trz frustum). Po zmodyfikowaniu
macierzy rzutowania przywracamy macierz model-widok jako bie c macierz (pole-
cenie IN/CVTKZ/QFG ).A/1&'.8+'9 ). To na niej wykonywać b dziemy wszystkie po-
zostałe przekształcenia w programie. W istocie macierz rzutowania po jej zainicjowaniu
rzadko jest zmieniana. Metoda ).A7UVCYKGPKG5EGP[ ko czy si poleceniem IN'PCDNG
).A&'26*A6'56 , którym wł czamy bufor gł bi, odpowiedzialny za kontrolowanie
odległo ci figur od kamery i ich odpowiednie wzajemne przesłanianie.
Podsumowuj c, przypomnijmy, z jakimi macierzami mamy do czynienia w OpenGL.
Po pierwsze jest to macierz model-widok. Je eli na scenie narysowana jest postać
człowieka stoj cego na płaszczy nie OXZ (głowa skierowana jest w kierunku dodat-
nim osi OY), a kamera wisi nad nim i jest skierowana w dół, to przekształcenie zadane
przez macierz model-widok spowoduje, e pierwotny układ współrz dnych zostanie
przesuni ty tak, e jego pocz tek b dzie znajdował si w poło eniu kamery oraz b dzie
obrócony wokół osi OX o 90 stopni przeciwnie do kierunku ruchu wskazówek zegara
(patrz c w stron dodatniej półosi OX). Macierz model-widok mówi zatem, jak
zmienić układ odniesienia sceny na układ odniesienia kamery. Drug macierz
jest macierz rzutowania, która mo e wprowadzić do obrazu perspektyw . Ko cowym
etapem jest przygotowanie obrazu dwuwymiarowego (tzw. przekształcenie widoku),
który wy wietlany jest na ekranie. Przekształcenie widoku mo emy wyobrazić sobie
bardzo łatwo: gdyby my stan li przed oknem i, trzymaj c głow nieruchomo, obrysowali
flamastrem na szybie kontury wszystkich budynków widzianych za oknem po-
wstałby dwuwymiarowy rzut trójwymiarowej przestrzeni. Mniej wi cej na tym polega
7
Prosz zwrócić uwag , e zwykle o OY skierowana jest w dół ekranu. OpenGL jest w tym wzgl dzie
zgodne z intuicj uzyskan w szkole podstawowej. Podobnie jest z osi OZ, która jest skierowana do
nas , a nie jak w Direct3D od nas . Dzi ki temu układ współrz dnych jest prawoskr tny, co pozwala
na stosowanie bez dodatkowych przekształce wzorów z podr czników do geometrii.
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
przekształcenie widoku (nie opisuje go ju oczywi cie macierz 33). Te trzy przekształ-
cenia tworz tak zwany potok, który obejmuje cały proces przygotowywania obrazu
przez OpenGL.
3URMHNW 5\VRZDQLH ILJXU\ SDVNLHM WUŃMNńWD
3RGZŃMQH EXIRURZDQLH
Deklarujemy metod 4[UWL5EGPG zgodnie ze wzorem z listingu 11.6.
/LVWLQJ Deklaracja metody renderuj cej
ENCUU 6(QTO RWDNKE 6(QTO
]
AARWDNKUJGF +&' OCPCIGF %QORQPGPVU
XQKF AAHCUVECNN (QTO%TGCVG 61DLGEV 5GPFGT
XQKF AAHCUVECNN (QTO%NQUG 61DLGEV 5GPFGT 6%NQUG#EVKQP #EVKQP
RTKXCVG 7UGT FGENCTCVKQPU
*&% WEJY[V&% WEJY[V FQ FKURNC[ FGXKEG EQPVGZV &%
*).4% WEJY[V4% WEJY[V FQ 1RGP). TGPFGTKPI EQPVGZV
DQQN ).A7UVCN(QTOCV2KMUGNK *&% WEJY[V&%
XQKF ).A7UVCYKGPKG5EGP[
XQKF AAHCUVECNN 4[UWL5EGPG
RWDNKE 7UGT FGENCTCVKQPU
AAHCUVECNN 6(QTO 6%QORQPGPV 1YPGT
_
Nast pnie definiujemy j zgodnie z listingiem 11.7. Trójk t rysowany jest
w pobli u punktu , ale przesuni tego o w dal8.
/LVWLQJ Definicja metody renderuj cej
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
4[UQYCPKG VTQLMCVC
IN$GIKP ).A64+#0).'5
WUVCNCPKG VT\GEJ YKGT\EJQNMQY VTQLMCVC YGTVGMUQY Z [ \
\ LGUV OPKGL YKGEGL Y UTQFMW GMTCPW
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN8GTVGZ H Z [ \ FQNP[ RTCY[
8
Zauwa my, e nie ma znaczenia, czy przekształceniom poddana zostaje scena, czy kamera. Przesuni cie
sceny w lewo jest całkowicie równowa ne przesuni ciu kamery w prawo to tylko kwestia wyboru
układu odniesienia.
5R]G]LD 0 2SHQ*/
IN8GTVGZ H [ \ IQTP[
MQPKGE T[UQYCPKC HKIWT[
IN'PF
< DWHQTC PC GMTCP
IN(NWUJ
5YCR$WHHGTU WEJY[V&%
_
3U]\URVWHN QD]Z\ ZVND]XMH QD LOR Ł L W\S SU]HFLń RQ\FK IXQNFML QS IN8GTVGZ H
R]QDF]D H SU]\MPRZDQH Vń WU]\ DUJXPHQW\ W\SX HNQCV )XQNFMD IN8GTVGZ PD ]QDF]
QLH ZLFHM RGPLDQ Z VXPLH RNRR GZXG]LHVWX SLFLX : GRNXPHQWDFML GRńF]RQHM
GR %'6 LQIRUPDFML R IXQNFMDFK 2SHQ*/ QDOH \ V]XNDŁ SRG KDVHP EH] SU]\URVWND
D ZLF IN8GTVGZ D QLH IN8GTVGZ H
Za pomoc inspektora obiektów tworzymy metod zwi zan ze zdarzeniem
1P2CKPV formy i umieszczamy w niej wywołanie metody 4[UWL5EGPG (listing
11.8). Dzi ki temu rysunek sceny b dzie od wie any.
/LVWLQJ Do zainicjowania renderowania sceny wykorzystujemy zdarzenie OnPaint formy
XQKF AAHCUVECNN 6(QTO (QTO2CKPV 61DLGEV 5GPFGT
]
4[UWL5EGPG
_
Metod 4[UWL5EGPG otwiera polecenie przypisuj ce macierzy model-widok (b d cej
macierz bie c ) macierz jednostkow (funkcja IN.QCF+FGPVKV[), która oznacza, e
układ odniesienia sceny i kamery s jednakowo ustawione. Nie trwa to jednak długo, bo
znajduj ce si w nast pnej linii polecenie IN6TCPUNCVGH rozsuwa scen
i kamer o jednostek. Dzi ki temu rozsuni ciu trójk t, który rysujemy w pobli u
rodka układu współrz dnych, znajduje si wewn trz frustum i mo emy zobaczyć go
na ekranie.
Rysowanie trójk ta to sekwencja polece rozpoczynaj ca si od funkcji IN$GIKP, a ko -
cz ca si wywołaniem funkcji IN'PF. Argumentem funkcji IN$GIKP jest typ figury (punkt,
linia, trójk t, czworok t lub wielok t oraz zło enia trójk tów). Mi dzy IN$GIKP a IN'PF
powinny znale ć si przede wszystkim wywołania funkcji IN8GTVGZ, które definiuj
werteksy, czyli punkty w trójwymiarowej przestrzeni, a praktyce wierzchołki figur.
Zadeklarowany w IN$GIKP typ figury wyznacza sposób interpretacji werteksów przez
bibliotek OpenGL. Je eli argumentem IN$GIKP jest ).A21+065, to ka dy werteks jest
reprezentowany przez osobno rysowany punkt. Z kolei ).A.+0'5 powoduje ł czenie
werteksów w pary, mi dzy którymi rysowany jest odcinek. Stała ).A.+0'A564+2 powo-
duje rysowanie łamanej mi dzy wszystkimi zdefiniowanymi werteksami. Dla ).A64+#0
).'5 i ).A37#&5 werteksy grupowane s odpowiednio w trójki i czwórki, a na ekranie
pojawia si trójk t lub czworok t. Zatem definicja jednego trójk ta to sekwencja wy-
woła funkcji IN$GIKP ).A64+#0).'5 , trzykrotnego IN8GTVGZ i IN'PF. Wywoła IN8GTVGZ
mogłoby być tak e sze ć, dziewi ć, dwana cie itd., a wówczas zdefiniowaliby my nie
jeden, ale dwa, trzy, cztery i wi cej trójk tów.
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
3URMHNW 3RSUDZLDQLH JHRPHWULL IUXVWXP
Zwróćmy uwag , e w efekcie wykonania polece z poprzedniego ćwiczenia otrzymali-
my trójk t równoboczny (por. rysunek 11.3). Jednak definiowali my trójk t o pod-
stawie Z i wysoko ci [ , a wi c o podstawie i wysoko ci . Długo ci jego lewego
i prawego boku powinny wi c być równe w przybli eniu . A poniewa trójk t ten
le y na płaszczy nie równoległej do ekranu, to wynika z tego, e nie powinni my
uzyskać niczego, co wygl da na trójk t równoboczny (rysunek 11.3); trójk t powinien
być lekko wydłu ony . Co si wobec tego z nim stało? Okazuje si , e z trójk tem
wszystko jest w porz dku. Przyczyna deformacji obrazu jest inna: okre laj c frustum
okre lili my wielko ć najbli szego planu (ekranu) na rozci gaj c si od do
w kierunkach X i Y. Z tego wynika, e ka dy plan sceny ma kształt kwadratu. A przecie
okno widoczne na rysunku 11.3 nie ma takiego kształtu jest rozci gni ty w pozio-
mie. I to rozci gni cie spowodowało zniekształcenie naszego trójk ta. Proporcje okna
(a w trybie pełnoekranowym proporcje ekranu) nale y uwzgl dnić przy definiowaniu
frustum (listing 11.9).
5\VXQHN
Pierwszy trójk t
/LVWLQJ Definiuj c frustum, uwzgl dniamy proporcj okna
XQKF 6(QTO ).A7UVCYKGPKG5EGP[
]
IN8KGYRQTV %NKGPV9KFVJ %NKGPV*GKIJV QMPQ 1RGP). YPGVT\G HQTO[
FQO[UNPKG
WUVCYKGPKG RWPMVW RTQLGMELK
IN/CVTKZ/QFG ).A241,'%6+10 OCEKGT\ RTQLGMELK
IN.QCF+FGPVKV[
NGHV TKIJV DQVVQO VQR \PGCT \HCT ENKRRKPI
HNQCV YUR %NKGPV*GKIJV HNQCV %NKGPV9KFVJ
IN(TWUVWO YUR YUR OPQ\GPKG OCEKGT\[ RT\G\
OCEKGT\ RGTURGMV[Y[ WUVCNCPKG RKTCOKF[ HTWUVWO
IN/CVTKZ/QFG ).A/1&'.8+'9 RQYTQV FQ OCEKGT\[ YKFQMW OQFGNW
IN'PCDNG ).A&'26*A6'56 \ DWHHGT CMV[YP[ WMT[YCPKG PKGYKFQE\P[EJ VTQLMCVQY
_
5R]G]LD 0 2SHQ*/
Na rysunku 11.4 widoczny jest trójk t po skorygowaniu proporcji frustum.
5\VXQHN
Trójk t tym razem
wiernie odwzorowany
na ekranie
3URMHNW .RORU
Do powy szej funkcji dodajemy wywołanie funkcji IN%QNQT, a dokładnie jej wersji IN%Q
NQT WD z argumentami , i , które opisuj odpowiednio czerwon , zielon i niebie-
sk składow koloru (listing 11.10). W efekcie płaszczyzna trójk ta stanie si ółta,
co dobrze byłoby widać na rysunku 11.5, gdyby ksi ka miała kolorowe ilustracje.
/LVWLQJ Czarno-biały wiat to adna zabawa
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
4[UQYCPKG VTQLMCVC
IN$GIKP ).A64+#0).'5
WUVCNCPKG VT\GEJ YKGT\EJQNMQY VTQLMCVC YGTVGMUQY Z [ \
\ LGUV OPKGL YKGEGL Y UTQFMW GMTCPW
IN%QNQT WD \QNV[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN8GTVGZ H Z [ \ FQNP[ RTCY[
IN8GTVGZ H [ \ IQTP[
MQPKGE T[UQYCPKC HKIWT[
IN'PF
< DWHQTC PC GMTCP
IN(NWUJ
5YCR$WHHGTU WEJY[V&%
_
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
5\VXQHN
Zmiana koloru
trójk ta
Zagadnienie kolorów to znacznie powa niejsza sprawa ni wynika z powy szego listingu.
Jest ona w OpenGL tak ci le zwi zana z o wietleniem, e na zabaw kolorami mu-
simy poczekać, a wł czymy mechanizm o wietlenia.
3URMHNW 5\VRZDQLH ILJXU\ SU]HVWU]HQQHM
RVWURVXSD
Jak wspominałem, mi dzy funkcjami IN$GIKP ).A64+#0).'5 i IN'PF mo na umie cić nie
tylko trzy definicj werteksów, ale dowoln wielokrotno ć tej liczby. Dodajmy wobec tego
jeszcze trzy trójki, które okre l trzy dodatkowe trójk ty (listing 11.11). Cało ć powinna
utworzyć ostrosłup. Ka da ciana ostrosłupa narysowana b dzie w innym kolorze:
/LVWLQJ Rysowany wcze niej trójk t te był figur przestrzenn (umieszczon w przestrzeni
trójwymiarowej), tyle e& płask
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
4[UQYCPKG VTQLMCVC
IN$GIKP ).A64+#0).'5
WUVCNCPKG VT\GEJ YKGT\EJQNMQY VTQLMCVC YGTVGMUQY Z [ \
\ LGUV OPKGL YKGEGL Y UTQFMW GMTCPW
V[NPC
IN%QNQT WD \QNV[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN8GTVGZ H Z [ \ FQNP[ RTCY[
5R]G]LD 0 2SHQ*/
IN8GTVGZ H [ \ IQTP[
RQFUVCYC
IN%QNQT WD \KGNQP[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN8GTVGZ H Z [ \ FQNP[ RTCY[
IN8GTVGZ H [ \ FQNP[ RT\GFPK
NGYC
IN%QNQT WD E\GTYQP[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN8GTVGZ H [ \ FQNP[ RT\GFPK
IN8GTVGZ H [ \ IQTP[
RTCYC
IN%QNQT WD PKGDKGUMK
IN8GTVGZ H Z [ \ FQNP[ RTCY[
IN8GTVGZ H [ \ FQNP[ RT\GFPK
IN8GTVGZ H [ \ IQTP[
MQPKGE T[UQYCPKC HKIWT[
IN'PF
< DWHQTC PC GMTCP
IN(NWUJ
5YCR$WHHGTU WEJY[V&%
_
Zamiast rysować cztery trójk ty (12 wierzchołków do przekształcania przez macierze
model-widok i rzutowania), mo na było posłu yć si wst gami lub wachlarzami trój-
k tów (jako argumentów funkcji IN$GIKP nale y wówczas u yć zamiast ).A64+#0).'5
odpowiednio ).A64+#0).'A564+2 lub ).A64+#0).'A(#0). Wówczas kolejne trójk ty wy-
znaczane s nie przez now trójk werteksów, a przez jeden dodatkowy werteks i jeden
z boków poprzednio zdefiniowanego trójk ta. W ten sposób zmniejsza si ilo ć wierz-
chołków, co w przypadku du ych figur zbudowanych z wielu werteksów mo e zna-
cz co przyspieszyć ich przekształcanie w potoku.
Natomiast aby zamiast pełnego ostrosłupa (rysunek 11.6) rysować jedynie jego szkie-
let, nale y w IN$GIKP u yć argumentu ).A.+0'A.112 (zob. rysunek 11.7).
Kolejn wa n spraw zwi zan z rysowaniem figur płaskich jest tzw. nawini cie.
Kolejno ć werteksów wyznacza bowiem przód i tył figury. Je eli staniemy za figur
(tj. patrzymy w kierunku jej przodu), to wierzchołki powinny być zdefiniowane zgod-
nie z kierunkiem ruchu wskazówek zegara. Tym samym je eli patrzymy na trójk t nary-
sowany na ekranie i jego wierzchołki nawini te s w kierunku przeciwnym do kierunku
ruchu wskazówek zegara, to trójk t skierowany jest przodem do nas. Dlaczego jest to
wa ne? Poniewa mo na unikn ć rysowania figur, które skierowane s np. tyłem do
kamery. Bardzo ogranicza to wysiłek wło ony przez kart graficzn w przygotowanie
obrazu. Ale czy sprawdzanie, czy figura uło ona jest przodem, czy tyłem do kamery,
nie jest kosztowniejsze ni rysowanie obu jej stron? Owszem, ale wyobra my sobie zam-
kni t figur przestrzenn , np. nasz ostrosłup. Je eli jego ciany b d tak nawini te, e
wszystkie b d skierowane przodem na zewn trz, to mo emy mieć pewno ć, e rysowanie
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
5\VXQHN
Ka d figur
przestrzenn mo na
zbudować z trójk tów
5\VXQHN
Wszystkie mo liwe
argumenty funkcji
glBegin znajdzie
Czytelnik
w dokumentacji
MSDN doł czonej
do C++Buildera
tyłów nie b dzie potrzebne. S jednak od tej sytuacji wyj tki. Mo emy na przykład
dopuszczać sytuacj , w której kamera wnika do wn trza figury. Wówczas, je eli chcemy
widzieć jej wn trze, a nie ma po prostu znikać, musimy rysować figury z obu stron.
Inna mo liwo ć, i to jest wła nie nasz przypadek, jest taka, e zamierzamy uczynić jedn
lub kilka cian cz ciowo przezroczystych. A przez takie okno b dzie mo na oczywi cie
równie zajrzeć do wn trza figury, a wi c wówczas tak e konieczne jest rysowanie
figur z obu stron.
3URMHNW :\RGUEQLHQLH PHWRG\ U\VXMńFHM ILJXU
Wygodnie jest umie cić zbiór polece rysuj cych figur w osobnej metodzie lub funkcji.
Umo liwi to wielokrotne u ycie tych funkcji i w ten sposób łatwe powielanie figury
(por. projekt 204.).
Definiujemy metod 4[UWL1UVTQUNWR i umieszczamy w niej polecenia
od IN$GIKP do IN'PF \ OGVQF[ 4[UWL5EGPG (listing 11.12).
5R]G]LD 0 2SHQ*/
/LVWLQJ Metoda definiuj ca wierzchołki ostrosłupa
XQKF AAHCUVECNN 6(QTO 4[UWL1UVTQUNWR HNQCV Z HNQCV [ HNQCV \
]
4[UQYCPKG VTQLMCVC
IN$GIKP ).A64+#0).'5
WUVCNCPKG VT\GEJ YKGT\EJQNMQY VTQLMCVC YGTVGMUQY Z [ \
\ LGUV OPKGL YKGEGL Y UTQFMW GMTCPW
V[NPC
IN%QNQT WD \QNV[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN8GTVGZ H Z [ \ FQNP[ RTCY[
IN8GTVGZ H [ \ IQTP[
RQFUVCYC
IN%QNQT WD \KGNQP[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN8GTVGZ H Z [ \ FQNP[ RTCY[
IN8GTVGZ H [ \ FQNP[ RT\GFPK
NGYC
IN%QNQT WD E\GTYQP[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN8GTVGZ H [ \ FQNP[ RT\GFPK
IN8GTVGZ H [ \ IQTP[
RTCYC
IN%QNQT WD PKGDKGUMK
IN8GTVGZ H Z [ \ FQNP[ RTCY[
IN8GTVGZ H [ \ FQNP[ RT\GFPK
IN8GTVGZ H [ \ IQTP[
MQPKGE T[UQYCPKC HKIWT[
IN'PF
_
Do definicji klasy dodajemy odpowiedni deklaracj nowej metody.
Nast pnie modyfikujemy metod RysujScene, zast puj c w niej sekwencj
polece od IN$GIKP do IN'PF przez wywołanie 4[UWL1UVTQUNWR (listing 11.13).
/LVWLQJ Taka zmiana zdecydowanie zwi ksza czytelno ć metody renderuj cej
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
T[UQYCPKG QUVTQUNWRC
4[UWL1UVTQUNWR Z [ \
< DWHQTC PC GMTCP
IN(NWUJ
5YCR$WHHGTU WEJY[V&%
_
3URMHNW 2EURW\ RELHNWŃZ QD VFHQLH
5XFK NDPHU\ L UXFK DNWRUŃZ
Czas zaj ć si przekształceniami macierzy model-widok. Tu pojawia si jednak zagad-
nienie kolejno ci przekształce i polece rysuj cych nowe figury. Musimy wiedzieć
jedn wa n rzecz: to, co zostało narysowane, nie jest ju przekształcane. Zatem je eli
chcemy obracać ostrosłupem, to funkcje IN4QVCVG musz znale ć si przed 4[UWL1UVTQUNWR,
bo inaczej obracane b d figury zdefiniowane potem, ale ostrosłup zostanie nieruchomy.
Ta zasada pozwala na uniezale nienie ruchu poszczególnych przedmiotów znajduj -
cych si na scenie (aktorów), a tak e, a mo e przede wszystkim, na oddzielenie ruchu
kamery od ruchu aktorów. Jak dobrze wiemy, nie ma zasadniczej ró nicy mi dzy ruchem
kamery, a ruchem sceny, szczególnie je eli na scenie nie ma niczego, co nasz umysł
mógłby identyfikować jako nieruchome (np. jaki rodzaj podło a). Zreszt nawet wów-
czas stwierdzenie, który element si porusza, a który spoczywa, jest umowne9. Wy-
obra my sobie jednak metod renderuj c , w której wpierw rysowana jest płaszczyzna,
nast pnie wykonywane jest przekształcenie translacji (przesuni cia) i wówczas ryso-
wany jest ostrosłup. Wygl dałoby to tak, jakby ostrosłup przesuwał si po nieruchomej
(tj. narysowanej przed przesuni ciem) powierzchni tak w naturalny sposób scen
t interpretowałby nasz umysł. Je eli dodatkowe przekształcenie umie cimy przed nary-
sowaniem owej powierzchni, to dotyczyć one b d zarówno niej, jak i poruszaj cego
si po niej ostrosłupa. Wygl dać to b dzie, jak ruch kamery, która filmuje ruch ostro-
słupa po powierzchni.
Z tego wynika, e mo na umownie odró nić ruch kamery od ruchu obiektów na sce-
nie. Podział ten zale y od momentu, w którym rysowana jest cz ć sceny, któr uznaje-
my za nieruchom (owa powierzchnia). Wcze niejsze przekształcenia to ruch kamery,
pó niejsze ruchy aktorów. Ogólny schemat metody renderuj cej powinien być zatem
zgodny z przedstawionym w tabeli 11.2.
I tak dalej. Etapy 7. i 8. mog si oczywi cie powtarzać. Aktor nie tylko mo e nie być
nieruchomy (tzn. mo e poruszać si po scenie), ale mo e równie zmieniać kształt.
Do tego wzgl dnego ruchu trójk tów, z których zbudowany jest aktor, stosuje si jed-
nak ta sama zasada, co do ruchu aktorów po scenie.
9
Ka dy chyba pami ta gag z filmu Monty Pythona, w którym to nie poci g odje d ał, ale peron z osob
machaj c biał chusteczk .
5R]G]LD 0 2SHQ*/
7DEHOD Kolejno ć czynno ci wykonywanych w metodzie renderuj cej
(WDS &]\QQR FL
1. Inicjacja Macierz model-widok ustalana na jednostkow
2. Przedmioty trwale zwi zane z kamer Rysowanie figur
(np. bro bohatera widoczna w grach FPP/FPS)
3. Ruch kamery Przekształcenia macierzy model-widok
4. Rysowanie nieruchomej cz ci sceny Rysowanie figur
5. Ruch pierwszego aktora Przekształcenia macierzy model-widok
6. Rysowanie pierwszego aktora Rysowanie figur
7. Ruch drugiego aktora Przekształcenia macierzy model-widok
8. Rysowanie drugiego aktora Rysowanie figur
Aby móc obracać nasz ostrosłup za pomoc klawiszy sterowania kursorem, musimy
wykonać nast puj ce czynno ci:
Definiujemy dwa pola 6JGVC i 2JK typu 5KPING, przechowuj ce k ty okre laj ce
poło enie ostrosłupa (listing 11.14).
/LVWLQJ Definiujemy dwa nowe pola
ENCUU 6(QTO RWDNKE 6(QTO
]
AARWDNKUJGF +&' OCPCIGF %QORQPGPVU
XQKF AAHCUVECNN (QTO%TGCVG 61DLGEV 5GPFGT
XQKF AAHCUVECNN (QTO%NQUG 61DLGEV 5GPFGT 6%NQUG#EVKQP #EVKQP
XQKF AAHCUVECNN (QTO2CKPV 61DLGEV 5GPFGT
RTKXCVG 7UGT FGENCTCVKQPU
*&% WEJY[V&% WEJY[V FQ FKURNC[ FGXKEG EQPVGZV &%
*).4% WEJY[V4% WEJY[V FQ 1RGP). TGPFGTKPI EQPVGZV
DQQN ).A7UVCN(QTOCV2KMUGNK *&% WEJY[V&%
XQKF ).A7UVCYKGPKG5EGP[
XQKF AAHCUVECNN 4[UWL5EGPG
XQKF AAHCUVECNN 4[UWL1UVTQUNWR HNQCV Z HNQCV [ HNQCV \
HNQCV 2JK 6JGVC
RWDNKE 7UGT FGENCTCVKQPU
AAHCUVECNN 6(QTO 6%QORQPGPV 1YPGT
_
W konstruktorze formy inicjujemy nowe pola zerami (listing 11.15).
/LVWLQJ Inicjujemy oba k ty zerami
AAHCUVECNN 6(QTO 6(QTO 6%QORQPGPV 1YPGT
6(QTO 1YPGT
]
2JK 6JGVC
_
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
Do metody renderuj cej dodajemy polecenia obracaj ce macierz model-widok
o k ty zapami tane w polach 2JK i 6JGVC (listing 11.16). Pierwsze wyznacza k t
obrotu wokół osi OY, a drugie wokół osi OX10
/LVWLQJ W ka dej renderowanej scenie poło enie figury wyznaczone jest przez pola Phi i Theta
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
QDTQV[
IN4QVCVGH 2JK YQMQN 1;
IN4QVCVGH 6JGVC YQMQN 1:
T[UQYCPKG QUVTQUNWRC
4[UWL1UVTQUNWR Z [ \
< DWHQTC PC GMTCP
IN(NWUJ
5YCR$WHHGTU WEJY[V&%
_
Zmieniamy własno ć -G[2TGXKGY formy na VTWG.
Za pomoc inspektora tworzymy metod zwi zan z 1P-G[&QYP formy
(listing 11.17). B dzie ona odgrywała rol naszego pulpitu kontrolnego.
/LVWLQJ Strzałki pozwalaj na kontrolowanie warto ci k tów, o jakie obracany jest ostrosłup
XQKF AAHCUVECNN 6(QTO (QTO-G[&QYP 61DLGEV 5GPFGT 914& -G[
65JKHV5VCVG 5JKHV
]
UYKVEJ -G[
]
ECUG 8-A'5%#2' %NQUG DTGCM
QDTQV[
ECUG 8-A.'(6 2JK DTGCM
ECUG 8-A4+)*6 2JK DTGCM
ECUG 8-A72 6JGVC DTGCM
ECUG 8-A&190 6JGVC DTGCM
10
Kolejno ć obrotów ma znaczenie! Tak samo jak kolejno ć mno enia przez macierze. Wystarczy wzi ć
do r ki niniejsz ksi k i obrócić j wzdłu grzbietu, a potem wzdłu innego wybranego boku. Nast pnie
wróćmy do pozycji wyj ciowej i wykonajmy oba obroty w zmienionej kolejno ci. W obu przypadkach
uzyskamy inne uło enie ksi ki.
5R]G]LD 0 2SHQ*/
_
4[UWL5EGPG
_
Korzystaj c z klawiszy strzałek , mo emy obracać nasz ostrosłup i obejrzeć go z dowol-
nej strony (rysunek 11.8).
5\VXQHN
Teraz mo emy
przekonać si ,
e figura, któr
zbudowali my,
jest rzeczywi cie
trójwymiarowa
3URMHNW 3U]HVXQLFLD RELHNWX
Analogicznie wygl da sprawa z przekształceniem translacji:
W klasie 6(QTO definiujemy jeszcze dwa pola prywatne typu 5KPING o nazwach
2Q\[ELC:, 2Q\[ELC; i 2Q\[ELC<. W konstruktorze ustalamy ich warto ci na równe
0 (listing 11.18).
/LVWLQJ Równie te pola inicjujemy zerami
AAHCUVECNN 6(QTO 6(QTO 6%QORQPGPV 1YPGT
6(QTO 1YPGT
]
2JK 6JGVC
2Q\[ELC: 2Q\[ELC; 2Q\[ELC<
_
Do metody (QTO2CKPV dodajemy polecenie przesuwaj ce figur o wektor
=2Q\[ELC: 2Q\[ELC; 2Q\[ELC zgodnie ze wzorem na listingu 11.19:
/LVWLQJ Przesuwamy ostrosłup
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
QDTQV[
IN4QVCVGH 2JK YQMQN 1;
IN4QVCVGH 6JGVC YQMQN 1:
RT\GUWPKGEKC
IN6TCPUNCVGH 2Q\[ELC: 2Q\[ELC; 2Q\[ELC<
T[UQYCPKG QUVTQUNWRC
4[UWL1UVTQUNWR Z [ \
< DWHQTC PC GMTCP
IN(NWUJ
5YCR$WHHGTU WEJY[V&%
_
Rozbudowujemy metod (QTO-G[&QYP, dodaj c do niej fragmenty wyró nione
na listingu 11.20. Dzi ki temu b dziemy mogli kontrolować przesuni cia
ostrosłupa klawiszami sterowania kursorem przy jednoczesnym naci ni ciu
klawisza Shift lub Ctrl.
/LVWLQJ Zwi kszamy ilo ć przycisków na pulpicie kontrolnym
XQKF AAHCUVECNN 6(QTO (QTO-G[&QYP 61DLGEV 5GPFGT 914& -G[
65JKHV5VCVG 5JKHV
]
KH -G[ 8-A'5%#2' %NQUG
QDTQV[
KH 5JKHV 'ORV[
]
UYKVEJ -G[
]
ECUG 8-A.'(6 2JK DTGCM
ECUG 8-A4+)*6 2JK DTGCM
ECUG 8-A72 6JGVC DTGCM
ECUG 8-A&190 6JGVC DTGCM
_
_
RT\GUWPKGEKC Y RKQPKG K RQ\KQOKG
KH 5JKHV %QPVCKPU UU%VTN
]
UYKVEJ -G[
]
ECUG 8-A.'(6 2Q\[ELC: DTGCM
ECUG 8-A4+)*6 2Q\[ELC: DTGCM
ECUG 8-A72 2Q\[ELC; DTGCM
ECUG 8-A&190 2Q\[ELC; DTGCM
_
_
5R]G]LD 0 2SHQ*/
RT\GUWPKGEKC Y RQ\KQOKG K RT\QF V[N
KH 5JKHV %QPVCKPU UU5JKHV
]
UYKVEJ -G[
]
ECUG 8-A.'(6 2Q\[ELC: DTGCM
ECUG 8-A4+)*6 2Q\[ELC: DTGCM
ECUG 8-A72 2Q\[ELC< DTGCM
ECUG 8-A&190 2Q\[ELC< DTGCM
_
_
4[UWL5EGPG
_
Po wykonaniu powy szych czynno ci mo emy za pomoc klawiszy strzałek oraz
klawiszy Shift i Ctrl w pełni kontrolować pozycj ostrosłupa (rysunek 11.9). Dopóki
na scenie jest tylko jeden obiekt, nie ma znaczenia, czy nazwiemy to ruchem kamery,
czy aktora. Nasz wzrok i tak nie ma adnego nieruchomego układu odniesienia. To tak,
jakby my kr yli wokół innej osoby w pustej przestrzeni kosmicznej. Pytanie o to, kto
wiruje wokół kogo, nie ma wówczas adnego sensu. Lub mniej abstrakcyjny przykład
dwa poci gi stoj ce na s siednich torach. Gdy jeden z nich rusza (i nie widzimy nie-
ruchomego podło a) nie mo emy stwierdzić który z nich jedzie, a który stoi. Sytuacja
zmienia si całkowicie, gdy na scenie umie cimy co , co nasz umysł zidentyfikuje jako
nieruchome podło e. Jednak, jak ju podkre lałem wcze niej, z punktu widzenia OpenGL
przekształcenia w punkcie 3. przedstawionego wy ej schematu niczym nie ró ni si
od przekształce z punktów 5. i 7.
5\VXQHN
Teraz naszemu
ostrosłupowi mo emy
przyjrzeć si z bliska
3URMHNW 3URVWD DQLPDFMD
Animacja to po prostu przesuni cia i obroty wykonywane zgodnie z pewnym czasowym
schematem. W C++Builderze ów schemat mo emy najpro ciej wyznaczyć za pomoc
komponentu 66KOGT. Wystarczy, e co okre lony czas b dzie on uruchamiał metod
zdarzeniow , w której zmieniane b d pola przechowuj ce warto ci k tów i pozycji
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
ostrosłupa, po czym wywoływał metod 4[UWL5EGPG. Identycznie jak przy naciskaniu
klawiszy sterowania kursorem, z tym e teraz owe klawisze naciska sam komputer.
Umieszczamy na formie komponent 66KOGT z zakładki System.
Tworzymy metod zdarzeniow do 1P6KOGT (listing 11.21):
/LVWLQJ Aby ruch był widoczny, konieczne jest oczywi cie wywołanie metody RysujScene
XQKF AAHCUVECNN 6(QTO 6KOGT 6KOGT 61DLGEV 5GPFGT
]
2JK
6JGVC
4[UWL5EGPG
_
Zmieniamy własno ć +PVGTXCN komponentu 6KOGT na .
Do metody (QTO-G[&QYP dodajemy mo liwo ć wł czenia i wył czenia animacji
za pomoc klawisza Q (listing 11.22):
/LVWLQJ Nowy przycisk na panelu kontrolnym
XQKF AAHCUVECNN 6(QTO (QTO-G[&QYP 61DLGEV 5GPFGT 914& -G[
65JKHV5VCVG 5JKHV
]
KH -G[ 8-A'5%#2' %NQUG
QDTQV[
KH 5JKHV 'ORV[
]
UYKVEJ -G[
]
ECUG 8-A.'(6 2JK DTGCM
ECUG 8-A4+)*6 2JK DTGCM
ECUG 8-A72 6JGVC DTGCM
ECUG 8-A&190 6JGVC DTGCM
ECUG S
ECUG 3 6KOGT 'PCDNGF 6KOGT 'PCDNGF DTGCM
_
_
EKCI FCNU\[ OGVQF[
Dzi ki temu w trakcie animacji metoda 4[UWL5EGPG nie tylko jest wywoływana w reakcji
na zdarzenie 1P2CKPV formy, co zachodzi stosunkowo rzadko, ale przede wszystkim
cyklicznie co 10 milisekund (sto razy na sekund ). To z pewno ci wystarczaj co cz sto,
bo płynna animacja wymaga około 50 klatek na sekund (a w najgorszym wypadku
przynajmniej 25). To mo e nawet zbyt wiele, bo monitory CRT (kineskopowe) rzadko
pracuj z cz sto ci wi ksz ni 80 Hz (80 ekranów na sekund ). Cz sto ć od wie-
ania monitorów LCD, z natury wolniejszych, wynosi zazwyczaj 60 Hz.
5R]G]LD 0 2SHQ*/
Je eli nawet nieco przeholujemy z cz sto ci renderowania sceny, to nie musimy si
martwić o obci enie głównego procesora komputera rysowaniem grafiki OpenGL
zajmuje si przecie procesor karty graficznej11.
3URMHNW 5\VRZDQLH RVL XNDGX ZVSŃU]GQ\FK
Narysujmy dwa układy współrz dnych: biały i zielony. W naszym przykładzie białe
osie b d odgrywały rol nieruchomej cz ci sceny. Ustalamy, e wszystkie przekształ-
cenia macierzy model-widok wyprzedzaj ce narysowanie owych białych osi nazywać
b dziemy ruchem kamery. Wszystkie pó niejsze ruchem aktorów.
Definiujemy metod 4[UWL1UKG rysuj c osie układu współrz dnych OXYZ
(listing 11.23):
/LVWLQJ Je eli chcemy narysować dwa układy współrz dnych, wygodnie przygotować
odpowiedni metod , któr b dziemy mogli wielokrotnie wykorzystywać
RTQEGFWTG 6(QTO 4[UWL1UKG TQ\OKCT 5KPING
DGIKP
IN$GIKP ).A.+0'5
IN8GTVGZ H IN8GTVGZ H TQ\OKCT 1: Y RTCYQ
IN8GTVGZ H IN8GTVGZ H TQ\OKCT 1; FQ IQT[
IN8GTVGZ H IN8GTVGZ H TQ\OKCT 1< FQ MCOGT[
IN'PF
GPF
Metod 4[UWL1UKG wywołujemy po raz pierwszy przed poleceniami wykonuj cymi
obroty i translacje ostrosłupa, a po raz drugi ju po narysowaniu ostrosłupa
(listing 11.24). Pierwsze wywołanie poprzedzamy zmian koloru na biały,
a drugie na zielony.
/LVWLQJ Rysowanie nieruchomego i ruchomego układu współrz dnych
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
PKGTWEJQOG QUKG WMNCFW YURQNT\GFP[EJ
IN%QNQT WD
4[UWL1UKG Z
11
Oczywi cie, je eli nie mamy jakiej archaicznej karty graficznej nie obsługuj cej standardu OpenGL
i korzystamy z programowej emulacji.
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
QDTQV[
IN4QVCVGH 2JK YQMQN 1;
IN4QVCVGH 6JGVC YQMQN 1:
RT\GUWPKGEKC
IN6TCPUNCVGH 2Q\[ELC: 2Q\[ELC; 2Q\[ELC<
T[UQYCPKG QUVTQUNWRC
4[UWL1UVTQUNWR Z [ \
TWEJQOG QUKG WMNCFW YURQNT\GFP[EJ
IN%QNQT WD
4[UWL1UKG Z
< DWHQTC PC GMTCP
IN(NWUJ
5YCR$WHHGTU WEJY[V&%
_
Metoda 4[UWL1UKG wywoływana jest dwukrotnie. Pierwsze wywołanie nast puje tu
po ustaleniu pozycji kamery i poprzedza obroty i przesuni cia, które interpretujemy jako
ruch aktorów. Dlatego ten rysowany na biało układ współrz dnych mo na traktować jak
zwi zany z nieruchom scen (por. rysunek 11.10). Drugi raz metoda 4[UWL1UKG wywo-
ływana jest tu przed wymian buforów, dotycz jej zatem wszystkie przekształcenia
macierzy model-widok innymi słowy, osie zwi zane s z rysowanymi na scenie
aktorami.
5\VXQHN
Rysujemy dwie pary
osi współrz dnych
pierwsza zwi zana
jest z nieruchomym
układem odniesienia
sceny, druga
z układem
zwi zanym
z ostrosłupem
3URMHNW 'RGDZDQLH NROHMQ\FK ILJXU
Do pierwszego ostrosłupa dorysujemy kolejne, uzupełniaj c metod 4[UWL5EGPG o p tl
wyró nion w listingu 11.25. Ka dy z ostrosłupów obrócony jest o 90 stopni wzgl dem
poprzedniego. Wszystkie b d wzgl dem siebie nieruchome, ale dodanie wzgl dnego
ruchu mi dzy nimi byłoby jedynie kwesti uzmiennienia wielko ci obrotu, jaki jest
wykonywany przed kolejnym wywołaniem metody 4[UWL1UVTQUNWR. Uzyskany efekt
widoczny jest na rysunku 11.11.
5R]G]LD 0 2SHQ*/
/LVWLQJ Klonowanie ostrosłupów
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
PKGTWEJQOG QUKG WMNCFW YURQNT\GFP[EJ
IN%QNQT WD
4[UWL1UKG Z
QDTQV[
IN4QVCVGH 2JK YQMQN 1;
IN4QVCVGH 6JGVC YQMQN 1:
RT\GUWPKGEKC
IN6TCPUNCVGH 2Q\[ELC: 2Q\[ELC; 2Q\[ELC<
T[UQYCPKG QUVTQUNWRC
4[UWL1UVTQUNWR Z [ \
MQNGLPG QUVTQUNWR[
HQT KPV K K K
]
IN4QVCVGH
4[UWL1UVTQUNWR Z [ \
_
IN4QVCVGH FQRGNPKGPKG RGNPGIQ QDTQVW
TWEJQOG QUKG WMNCFW YURQNT\GFP[EJ
IN%QNQT WD
4[UWL1UKG Z
< DWHQTC PC GMTCP
IN(NWUJ
5YCR$WHHGTU WEJY[V&%
_
: NRG]LH XPLHV]F]RQ\P QD S\FLH U\VRZDQLH GRGDWNRZ\FK RVWURVXSŃZ PR QD Z\
ńF]\Ł NODZLV]HP :
3URMHNW %DUG]LHM SUHF\]\MQH XVWDZLDQLH NDPHU\
Jak pami tamy z komentarza do zada 194. i 195., renderowanie rozpoczynamy od prze-
suni cia całej sceny o w kierunku osi OZ, a wi c o w gł b frustum. Zgodnie ze sche-
matem przedstawionym we wprowadzeniu do projektu 200. przekształcenie to znajduje
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
5\VXQHN
Korona zbudowana
z czterech ostrosłupów
si w punkcie 3., a wi c powinni my mówić raczej o odsuni ciu kamery od sceny. Re-
alizacj tego schematu w tej chwili w metodzie 4[UWL5EGPG przedstawia tabela 11.3.
7DEHOD Schemat etapów w metodzie RysujScene
(WDS &]\QQR FL
1. Inicjacja Macierz model-widok ustalana na jednostkow
2. Przedmioty trwale zwi zane z kamer Brak
3. Ruch kamery Odsuni cie kamery o jednostek w kierunku osi OZ
4. Rysowanie nieruchomej cz ci sceny Rysowanie białych osi współrz dnych
5. Ruch pierwszego aktora Obroty i przesuni cia kontrolowane z klawiatury
6. Rysowanie pierwszego aktora Rysowanie ostrosłupa (oraz jego klonów)
7. Ruch drugiego aktora Brak
8. Rysowanie drugiego aktora Rysowanie zielonych osi współrz dnych
Czynno ć ustawienia kamery (mo na sobie wyobrazić, e etap 3. obejmuje znacznie
wi cej przekształce ni tylko nasze przesuni cie) mo na znacznie upro cić, korzy-
staj c z funkcji INW.QQM#V. Jej argumentami s trzy trójki współrz dnych. Pierwsza
ustala poło enie kamery. W naszym przypadku b dzie to punkt . Argumenty
od czwartego do szóstego wskazuj punkt, na który kamera jest skierowana. My wybrali-
my rodek układu współrz dnych, czyli miejsce, w którym znajduje si nasza figura
(pami tajmy, e kamera została odsuni ta na pozycj ). Ostatnia trójka argu-
mentów okre la sposób, w jaki ustawiona jest kamera, wskazuj c jej kierunek do góry .
My ustawili my j w kierunku osi OY, czyli tak, jak trzymaliby my prawdziw kamer ,
gdyby podło e znajdowało si na płaszczy nie OXZ (por. rysunek 11.2). Odpowiednie
wywołanie funkcji INW.QQM#V pokazuje listing 11.26.
)XQNFMD INW.QQM#V MHVW ]GHILQLRZDQD Z ELEOLRWHFH */8 2SHQ*/ 8WLOLW\ /LEUDU\ v
ELEOLRWHFH ]DZLHUDMńFHM IXQNFMH Z\ V]HJR SR]LRPX NU]\ZH ILJXU\ SU]HVWU]HQQH LWS
:LFHM SRZLHP\ R QLHM Z SRGUR]G]LDOH ]QDMGXMńF\P VL QD NRFX UR]G]LDX 'R MHM
X \FLD SRWU]HEQ\ MHVW LPSRUW QDJŃZND JOX K
5R]G]LD 0 2SHQ*/
/LVWLQJ W metodzie RysujScene zast pili my polecenie odsuwaj ce scen o 10 poleceniem
precyzyjniej ustalaj cym poło enie kamery
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
INW.QQM#V RQNQ\GPKG MCOGT[
RWPMV PC MVQT[ UMKGTQYCPC LGUV MCOGTC
MKGTWPGM FQ IQT[ MCOGT[ RQNCT[\CELC
PKGTWEJQOG QUKG WMNCFW YURQNT\GFP[EJ
IN%QNQT WD
4[UWL1UKG Z
QDTQV[
IN4QVCVGH 2JK YQMQN 1;
IN4QVCVGH 6JGVC YQMQN 1:
RT\GUWPKGEKC
IN6TCPUNCVGH 2Q\[ELC: 2Q\[ELC; 2Q\[ELC<
T[UQYCPKG QUVTQUNWRC
4[UWL1UVTQUNWR Z [ \
MQNGLPG QUVTQUNWR[
KH &QFCVMQYG1UVTQUNWR[
]
HQT KPV K K K
]
IN4QVCVGH
4[UWL1UVTQUNWR Z [ \
_
IN4QVCVGH FQRGNPKGPKG RGNPGIQ QDTQVW
_
TWEJQOG QUKG WMNCFW YURQNT\GFP[EJ
IN%QNQT WD
4[UWL1UKG Z
< DWHQTC PC GMTCP
IN(NWUJ
5YCR$WHHGTU WEJY[V&%
_
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
3URMHNW 5XFK NDPHU\ NRQWURORZDQ\
SRR HQLHP NXUVRUD P\V]\
Kontrola pozycji kamery za pomoc myszki to standardowy element aplikacji korzy-
staj cych z grafiki 3D. Mo liwe jest kilka podej ć do tego zagadnienia ja wybior
mo e nie do ko ca satysfakcjonuj ce, ale zdecydowanie najprostsze. Co wi cej, b d
niekonsekwentny. W poprzednim paragrafie przedstawiłem bowiem funkcj INW.QQM#V,
która słu y do łatwego ustawiania kamery. Natomiast do jej obracania zastosuj poznane
wcze niej funkcje IN4QVCVG. Tak jest po prostu wygodniej12.
Ruch kamery technicznie realizowany jest analogicznie do przenoszenia formy za
dowolny punkt (projekt 14.). Wykorzystamy do tego celu zdarzenia 1P/QWUG&QYP, 1P
/QWUG/QXG, 1P/QWUG7R.
Wył czamy animacj , zmieniaj c własno ć 6KOGT 'PCDNGF na HCNUG.
Do klasy 6(QTO dodajemy trzy pola prywatne okre laj ce poło enie kamery
we współrz dnych sferycznych -COGTC2JK, -COGTC6JGVC, -COGTC4, dwa dodatkowe
VOR-COGTC2JK, VOR-COGTC6JGVC, których zastosowanie zaraz si wyja ni, oraz
dwa pola : i ; , które umo liwiaj mierzenie przesuni cia myszki z przyci ni tym
przyciskiem (listing 11.27).
/LVWLQJ Definiujemy potrzebne pola
RTKXCVG 7UGT FGENCTCVKQPU
*&% WEJY[V&% WEJY[V FQ FKURNC[ FGXKEG EQPVGZV &%
*).4% WEJY[V4% WEJY[V FQ 1RGP). TGPFGTKPI EQPVGZV
DQQN ).A7UVCN(QTOCV2KMUGNK *&% WEJY[V&%
XQKF ).A7UVCYKGPKG5EGP[
XQKF AAHCUVECNN 4[UWL5EGPG
XQKF AAHCUVECNN 4[UWL1UVTQUNWR HNQCV Z HNQCV [ HNQCV \
HNQCV 2JK 6JGVC
HNQCV 2Q\[ELC: 2Q\[ELC; 2Q\[ELC<
DQQN &QFCVMQYG1UVTQUNWR[
XQKF AAHCUVECNN 4[UWL1UKG HNQCV TQ\OKCT
MCOGTC
KPV : ;
HNQCV -COGTC2JK -COGTC6JGVC -COGTC4
HNQCV VOR-COGTC2JK VOR-COGTC6JGVC
Inicjujemy je, dodaj c do konstruktora instrukcje wyró nione w listingu 11.28.
/LVWLQJ Warto ć pola KameraR (odległo ć kamery) kontrolować b dziemy rolk myszki
AAHCUVECNN 6(QTO 6(QTO 6%QORQPGPV 1YPGT
6(QTO 1YPGT
]
12
Nie tylko wygodniej, ale równie bezpieczniej. Korzystanie z IN.QQM#V wymagałoby obliczania
transformacji współrz dnych punktu, w którym znajduje si kamera (wła nie to robi funkcje
IN4QVCVG). Naprawd łatwo wówczas o bł d. A jedenaste przykazanie programisty mówi: nie pisz
kodu, który kto napisał (i sprawdził!) za ciebie. To nie tylko wygoda, ale i unikanie bł dów.
5R]G]LD 0 2SHQ*/
2JK 6JGVC
2Q\[ELC: 2Q\[ELC; 2Q\[ELC<
&QFCVMQYG1UVTQUNWR[ HCNUG
-COGTC4 -COGTC2JK -COGTC6JGVC
: ;
_
W metodzie 4[UWL5EGPG modyfikujemy argument funkcji INW.QQM#V
odpowiadaj cy za odległo ć kamery od rodka układu współrz dnych
oraz dodajemy polecenia obrotu (listing 11.29).
/LVWLQJ Dodane czynno ci nale oczywi cie do etapu 3., przedstawionego w tabeli 11.3 schematu
XQKF AAHCUVECNN 6(QTO 4[UWL5EGPG
]
EQPUV HNQCV Z
EQPUV HNQCV [
EQPUV HNQCV \
2T\[IQVQYCPKG DWHQTC
IN%NGCT ).A%1.14A$7(('4A$+6 ^ ).A&'26*A$7(('4A$+6
IN.QCF+FGPVKV[ OCEKGT\ OQFGN YKFQM OCEKGT\ LGFPQUVMQYC
IN6TCPUNCVGH QFUWPKGEKG ECNQUEK Q
MCOGTC
INW.QQM#V -COGTC4 RQNQ\GPKG MCOGT[
RWPMV PC MVQT[ UMKGTQYCPC LGUV MCOGTC
MKGTWPGM FQ IQT[ MCOGT[ RQNCT[\CELC
IN4QVCVGH -COGTC2JK VOR-COGTC2JK YQMQN 1;
IN4QVCVGH -COGTC6JGVC VOR-COGTC6JGVC YQMQN 1:
PKGTWEJQOG QUKG WMNCFW YURQNT\GFP[EJ
IN%QNQT WD
4[UWL1UKG Z
FCNU\C E\GUE OGVQF[
Nast pnie tworzymy metody zdarzeniowe zwi zane ze zdarzeniami
1P/QWUG&QYP, 1P/QWUG/QXG, 1P/QWUG7R i umieszczamy w nich polecenia
widoczne na listingu 11.30.
/LVWLQJ Sposób kontrolowania kamery przez myszk jest podobny do wykorzystanego
w projekcie 14. do poruszania form za dowolny punkt
XQKF AAHCUVECNN 6(QTO (QTO/QWUG&QYP 61DLGEV 5GPFGT 6/QWUG$WVVQP $WVVQP
65JKHV5VCVG 5JKHV KPV : KPV ;
]
: :
; ;
_
XQKF AAHCUVECNN 6(QTO (QTO/QWUG/QXG 61DLGEV 5GPFGT 65JKHV5VCVG 5JKHV KPV :
KPV ;
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
]
%CRVKQP -COGTC2JK (NQCV6Q5VT -COGTC2JK
-COGTC6JGVC (NQCV6Q5VT -COGTC6JGVC
HNQCV E\WNQUE/[U\[
KH 5JKHV %QPVCKPU UU.GHV
]
KPV F: : :
KPV F; ; ;
VOR-COGTC2JK F: E\WNQUE/[U\[
VOR-COGTC6JGVC F; E\WNQUE/[U\[
4[UWL5EGPG
_
_
XQKF AAHCUVECNN 6(QTO (QTO/QWUG7R 61DLGEV 5GPFGT 6/QWUG$WVVQP $WVVQP
65JKHV5VCVG 5JKHV KPV : KPV ;
]
-COGTC2JK VOR-COGTC2JK
-COGTC6JGVC VOR-COGTC6JGVC
VOR-COGTC2JK
VOR-COGTC6JGVC
MQUOGV[MC
KH -COGTC2JK -COGTC2JK
KH -COGTC2JK -COGTC2JK
KH -COGTC6JGVC -COGTC6JGVC
KH -COGTC6JGVC -COGTC6JGVC
_
Ruch myszki steruje ruchem kamery na sferze wokół rodka układu
współrz dnych. Natomiast rolk myszki ustalać b dziemy promie tej sfery,
a wi c odległo ć kamery od naszego ostrosłupa. Wykorzystamy w tym celu
zdarzenie 1P/QWUG9JGGN, do którego nale y utworzyć metod zdarzeniow
z poleceniami widocznymi na listingu 11.31.
/LVWLQJ Dodatkowo definiujemy funkcj pomocnicz sign, która ustala znak ( 1, 0 lub 1)
podanej liczby
KPV UKIP KPV CTIWOGPV
]
KH CTIWOGPV TGVWTP
KH CTIWOGPV TGVWTP
TGVWTP
_
XQKF AAHCUVECNN 6(QTO (QTO/QWUG9JGGN 61DLGEV 5GPFGT 65JKHV5VCVG 5JKHV
KPV 9JGGN&GNVC 62QKPV /QWUG2QU DQQN *CPFNGF
]
EQPUV HNQCV YUR
RTQRQTELQPCNPC \OKCPC RQ\[ELK YU\[UVMKEJ YUR MCOGT[
-COGTC4 -COGTC4 UKIP 9JGGN&GNVC YUR
4[UWL5EGPG
_
5R]G]LD 0 2SHQ*/
W momencie naci ni cia przycisku myszy zapami tywane jest poło enie myszki (do tego
wykorzystujemy pola : i ; ). W metodzie zwi zanej ze zdarzeniem 1P/QWUG/QXG, je eli
przyci ni ty jest lewy klawisz myszy, obliczana jest wielko ć przesuni cia myszy od
momentu naci ni cia przycisku myszy i na tej podstawie obliczane s k ty obrotu zapi-
sywane w polach VOR-COGTC2JK i VOR-COGTC6JGVC. W metodzie 4[UWL5EGPG warto ci te
wykorzystywane s jako argumenty funkcji IN4QVCVG. W momencie zwolnienia przy-
cisku myszy warto ci pól VOR-COGTC2JK i VOR-COGTC6JGVC przepisywane s do pól -COG
TC2JK i -COGTC6JGVC, co oznacza, e obrót jest zapami tywany.
3URMHNW &LHQLRZDQLH NRORUŃZ
QD SRZLHU]FKQLDFK
Z trójk tem nie musi być zwi zany tylko jeden kolor. Osobny kolor mo na zwi zać
z ka dym jego wierzchołkiem. Wówczas zastosowana zostanie płynna zmiana koloru
pomi dzy wierzchołkami (cieniowanie). W niektórych przypadkach mo emy cienio-
wania u yć do imitowania o wietlenia (por. rysunek 11.12).
5\VXQHN
Cieniowanie kolorów
mo e imitować
o wietlenie
Modyfikujemy metod 4[UWL1UVTQUNWR zgodnie z wyró nieniami na listingu 11.32.
/LVWLQJ Z ka dym werteksem wi emy inny kolor
XQKF AAHCUVECNN 6(QTO 4[UWL1UVTQUNWR HNQCV Z HNQCV [ HNQCV \
]
4[UQYCPKG VTQLMCVC
IN$GIKP ).A64+#0).'5
WUVCNCPKG VT\GEJ YKGT\EJQNMQY VTQLMCVC YGTVGMUQY Z [ \
\ LGUV OPKGL YKGEGL Y UTQFMW GMTCPW
V[NPC
IN%QNQT WD \QNV[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN%QNQT WD
&] Ł ,,, 0 :\EUDQH WHFKQRORJLH :LQGRZV
IN8GTVGZ H Z [ \ FQNP[ RTCY[
IN%QNQT WD
IN8GTVGZ H [ \ IQTP[
RQFUVCYC
IN%QNQT WD \KGNQP[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN%QNQT WD
IN8GTVGZ H Z [ \ FQNP[ RTCY[
IN%QNQT WD
IN8GTVGZ H [ \ FQNP[ RT\GFPK
NGYC
IN%QNQT WD E\GTYQP[
IN8GTVGZ H Z [ \ FQNP[ NGY[
IN%QNQT WD
IN8GTVGZ H [ \ FQNP[ RT\GFPK
IN%QNQT WD
IN8GTVGZ H [ \ IQTP[
RTCYC
IN%QNQT WD PKGDKGUMK
IN8GTVGZ H Z [ \ FQNP[ RTCY[
IN%QNQT WD
IN8GTVGZ H [ \ FQNP[ RT\GFPK
IN%QNQT WD
IN8GTVGZ H [ \ IQTP[
MQPKGE T[UQYCPKC HKIWT[
IN'PF
_
Kompilujemy aplikacj i uruchamiamy j , a nast pnie podziwiamy uzyskany
efekt (zob. rysunek 11.12).
Po tym usuwamy lub komentujemy dodatkowe linie, eby cieniowanie nie
interferowało z o wietleniem figury, które dodamy za chwil .
Cieniowanie mo na te wył czyć poleceniem IN5JCFG/QFGN ).A(.#6 . Wówczas do
kolorowania trójk ta u ywany jest kolor ostatniego wierzchołka. Domy lna warto ć
wł czaj ca cieniowanie to ).A5/116*.
.RORU L ZLDWR
Co to jest kolor? I jaki jest jego zwi zek ze wiatłem? Z fizycznego punktu widzenia
kolor mo na identyfikować z długo ci fali wiatła docieraj cego do oka. Podobnie jak
w przypadku d wi ku, nasze zmysły do ć dobrze radz sobie z jednoczesn detekcj
fal o ró nych długo ciach. Niestety, tak jak w znanym dowcipie o matematyku w balo-
nie, odpowied ta jest prawdziwa, dla niektórych fascynuj ca, ale w przypadku definio-
wania o wietlenia w programowaniu grafiki trójwymiarowej mało przydatna. Wa niejsza
od fizyki okazuje si tu biologia. Mówi ona, e oko rejestruje wiatło za pomoc trzech
5R]G]LD 0 2SHQ*/
typów czopków reaguj cych na fale o ró nych długo ciach oraz pr cików, które s
czułe jedynie na nat enie wiatła. Skupmy si na czopkach. Wytworzone przez ka dy
z typów czopków impulsy nerwowe interpretowane s przez mózg jako kolory czer-
wony, zielony i niebieski. Pobudzenie wszystkich jednocze nie w równym stopniu, co
odpowiada wiatłu, które jest mieszanin fal o ró nych długo ciach, daje kolor biały
(wzgl dnie szary, je eli pobudzenie jest mniej intensywne). Ró ne kombinacje pobu-
dze czopków prowadz do całej palety kolorów, jakie szcz liwie mo emy ogl dać.
Wynika z tego, e kolory czerwony (R), zielony (G) i niebieski (B) tworz układ współ-
rz dnych (oznaczany symbolem RGB), w którym mo na zapisać dowolny widziany
przez człowieka kolor. Ten fakt został wykorzystany w telewizorze, który generuje obraz
zbudowany z czerwonych, zielonych i niebieskich pikseli. W ten sam sposób b dziemy
równie okre lać kolor ródeł wiatła.
To jednak nie wyczerpuje tematu barwy i o wietlenia. Do o wietlania u ywamy zwy-
kle wiatła o białej barwie. Rzeczy, które o wietlamy, s jednak ró nobarwne. Z tego
wynika, e czym innym jest kolor ródła wiatła i kolor o wietlanych przedmiotów.
To rozró nienie odzwierciedlone jest równie w OpenGL. Kolor o wietlanego przed-
miotu, jaki widzimy, zale y wył cznie od wiatła, jakie biegnie od tego przedmiotu
w kierunku naszego oka. Załó my, e przedmiot ten nie emituje wiatła, a jedynie je
odbija. Je eli przedmiot ten nie odbija wszystkich długo ci fali, to cz ć padaj cego
na ten przedmiot wiatła jest pochłaniana. W efekcie przedmioty o wietlane mody-
fikuj wiatło, które na nie pada. I to nie znaczy tylko, e je osłabia, ale równie
zmienia jego kolor. Przedmiot mo e bowiem pochłaniać ró ne długo ci fali w ró nym
stopniu (innymi słowy niejednakowo odbijać składowe RGB). Zatem je eli ródło
wiatła jest białe, a przedmiot pochłania składow niebiesk , a dobrze odbija składo-
we czerwon i zielon , to przedmiot ten widzimy jako ółty13. I tak wła nie ustala si
kolor przedmiotów na scenie w OpenGL ustalaj c współczynniki odbicia poszcze-
gólnych składowych RGB wiatła na powierzchni tego przedmiotu.
eby bardziej spraw skomplikować, powiem jeszcze tylko, e funkcja IN%QNQT, której
u yli my w projektach 197. i 207., z cał t teori nie ma nic wspólnego. Nie zale y
bowiem w aden sposób od o wietlenia sceny jest zwyczajnym oszustwem, które
wprowadzone zostało do OpenGL, aby mo liwe było rysowanie bez definiowania ródeł
wiatła. To oszustwo mo emy jednak zmniejszyć, je eli za yczymy sobie, aby współ-
czynniki odbicia ustalane zwykle funkcj IN/CVGTKCN były uzgadniane z kolorem ustalo-
nym za pomoc funkcji IN%QNQT (jednym słowem, aby u ycie tych dwóch funkcji było
równowa ne). Słu y do tego funkcja IN%QNQT/CVGTKCN, której u yjemy w kolejnych
projektach.
Zacznijmy jednak od mo liwo ci wył czenia kolorowania cian. Ułatwi to nam ekspe-
rymenty z o wietleniem sceny.
13
Czasem zamiast mówić, e przedmiot dobrze odbija składowe R i G, wygodniej jest powiedzieć, e
odbija składow Y ( ółć). Zamiast R i B mo na podstawić M (magent ), a zamiast G i B C (cyjan).
W ten sposób powstaje nowy układ współrz dnych, oznaczany jako CMY. O ile RGB wygodne jest
w urz dzeniach opartych na emisji wiatła (monitory), to CMY bardziej pasuje do okre lania kolorów
na przedmiotach o wietlanych, tj. absorbuj cych wiatło (np. wydruk na papierze lub obraz na płótnie).
To wła nie kolory z układu współrz dnych CMY uznawane s przez malarzy za kolory podstawowe.
Takimi kolorami pluj tak e drukarki atramentowe.
Wyszukiwarka
Podobne podstrony:
06 Zadania z rozwiązaniamiidd47
ASPNET 20 Gotowe rozwiazania
CSS Gotowe rozwiazania
Jezyk C Gotowe rozwiazania dla programistow cppgot
Domowe sieci komputerowe Gotowe rozwiazania dosiek
Test z ZS rozwiązywany z dr 12 06
matematyka trenig 06 A rozwiazania
Dowódca USA w Iraku Wojsko gotowe do wycofania się z miast (28 06 2009)
więcej podobnych podstron