home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 06 / ami027.txt < prev    next >
Text File  |  1997-04-07  |  6KB  |  130 lines

  1. Jak ulepszyê procedurë?
  2. -----------------------
  3.  
  4. COMANCHE: KOD 
  5.  
  6. <lead>Kiedy mamy juû wygenerowanâ mapë, po której moûemy sië
  7. poruszaê (pisaîem o tym w poprzednim odcinku), warto dopisaê
  8. jeszcze sam kod procedury. Zrobimy to dzisiaj...
  9.  
  10. <a>Miklesz/Damage
  11.  
  12. <txt>Jak zapewne pamiëtacie, mamy póîmegowy plik, zawierajâcy 512
  13. * 512 sîów, w którym wyûszy bajt odpowiada za wysokoôê punktu, a
  14. niûszy za jego kolor. Mapë wejôciowâ radzë trzymaê w miarë
  15. moûliwoôci w pamiëci typu Fast, gdyû odwoîywaê sië do niej bëdzie
  16. jedynie procesor. Nasz krajobraz bëdziemy tworzyê na ekranie 160
  17. * 128 * 256. Skîadaê sië on bëdzie ze 128 przekrojów gór (kaûdy o
  18. szerokoôci 160 punktów). Pierwszy przekrój bëdzie przebiegaî
  19. bezpoôrednio przed "kamerâ", a ostatni bëdzie niknâî na
  20. horyzoncie. Jeûeli sporzâdzaliôcie kiedyô wykresy funkcji dwóch
  21. zmiennych, to zapewne juû wiecie, o co chodzi. Po narysowaniu
  22. pierwszej warstwy (najbliûszej nam), nastëpne nanosimy tylko
  23. wtedy, gdy "wystajâ" one ponad poprzednie.  Tutaj jednak pojawi
  24. sië pierwszy problem.
  25.  
  26. Przecieû góry, oddalajâc sië od obserwatora, stajâ sië coraz
  27. niûsze! Problem ten rozwiâzujemy, tworzâc dla kaûdego paska
  28. (warstwy) osobnâ tablicë perspektywy (w osi Y). Jej wymiary to:
  29. 128 * 256 (128 pasków, w kaûdym 256 moûliwych wysokoôci). Wysokie
  30. wzniesienia, kiedy znajdujâ sië blisko kamery (obserwatora),
  31. zajmujâ caîâ wysokoôê ekranu, natomiast na horyzoncie jedynie
  32. parë punktów. Teoretycznie warstw powinno byê nieskoïczenie
  33. wiele, a wysokoôê gór powinna zmierzaê do zera (moûna to
  34. sprawdziê, liczâc granicë standardowej funkcji perspektywy).
  35. Okazuje sië, ûe kiedy rysujemy znacznie mniej pasków (np. 64),
  36. góry albo urywajâ sië przed horyzontem, albo (kiedy trochë
  37. "podrasujemy" perspektywë) wyrastajâ nagle spod ziemi w miarë
  38. zbliûania sië do nich. Dlatego wartoôê ok. 128 przekrojów wydaje
  39. sië sensowna. Przy okazji moûemy zastosowaê ciekawy trik,
  40. polegajâcy na ôciemnianiu kolorów gór w miarë zwiëkszania sië ich
  41. odlegîoôci od obserwatora. Efekt jest bardzo ciekawy (krajobraz
  42. jest jakby "gouraudowany"), a wyglâda, jakbyômy lecieli "czymô" w
  43. nocy, oôwietlajâc sobie reflektorem kawaîek ziemi przed dziobem!
  44. Jeûeli caîy obraz mamy wyîâcznie w odcieniach jednego koloru, to
  45. radzë sobie stworzyê tablicë (z przygotowanymi wczeôniej
  46. jasnoôciami) o rozmiarach: 128 * 256 (128 pasków, w kaûdym 256
  47. moûliwych jasnoôci).
  48.  
  49. Po omówieniu zasady nanoszenia pasków i perspektywy w osi Y warto
  50. zwróciê uwagë, ûe wzniesienia, oddalajâc sië od nas, zmniejszajâ
  51. nie tylko swojâ wysokoôê, ale równieû rozmiary w dwóch
  52. pozostaîych kierunkach (X i Z). Skutkiem powyûszego jest to, ûe
  53. obserwowany przez nas obszar ma rozmiary zbliûone bardziej do
  54. trapezu niû do prostokâta. Co to oznacza? Otóû to, ûe pobierajâc
  55. z mapy dane do rysowania musimy, w wypadku punktów oddalonych od
  56. kamery, po prostu niektóre kolumny i wiersze pomijaê. Tu z pomocâ
  57. przyjdzie nam kolejna tablica, w której przeliczymy sobie, jakie
  58. wartoôci w stosunku do obserwatora naleûy nanieôê. Póúniej
  59. wystarczy zmieniaê poîoûenie kamery, a góry bëdâ sië nam
  60. przesuwaîy w ûâdanych kierunkach. Tablica bëdzie miaîa rozmiary
  61. 160 * 128 (128 pasków, kaûdy po 160 punktów szerokoôci). Ktoô
  62. moûe mi zarzuciê nadmierne tablicowanie, ale w tym wypadku
  63. wielokrotnie przyôpieszajâ one obliczenia (prawie je eliminujâc),
  64. zajmujâ natomiast jedynie: 168 KB -- sîowa, 84 KB -- bajty.
  65.  
  66. Teraz parë sîów o samym przygotowaniu tablic. Wydaje sië to
  67. proste, ale przy perspektywie X-Z naleûy zauwaûyê, ûe dla
  68. "leûâcej" przed nami pîaszczyzny nie obliczamy poîoûenia jej
  69. punktów na ekranie, lecz dokonujemy przeksztaîcenia odwrotnego.
  70. Chcemy dla kaûdego punktu ekranu znaê jego odpowiednik z
  71. pîaszczyzny. W zwiâzku z tym musimy przeksztaîciê oryginalny wzór
  72. na perspektywë (2 linijki na kartce, i mamy). Ostrzegam Was
  73. dlatego, ûe sam kiedyô przesiedziaîem kawaî czasu, nim
  74. wykombinowaîem, jak zrobiê tablicë.
  75.  
  76. Kiedy przygotowania mamy za sobâ, warto szczegóîowo omówiê
  77. algorytm. Nim zaczniemy, potrzebujemy zarezerwowaê sobie (i
  78. kasowaê co klatkë) 160 sîów (ew. bajtów), w których zapisana
  79. bëdzie aktualna linia horyzontu.
  80.  
  81. 1. Ustalamy obserwatora na mapie (od "niego" liczyê bëdziemy
  82. wszelkie offsety).
  83.  
  84. 2. Zaczynamy rysowaê pierwszy (ew. kolejny) przekrój.
  85.  
  86. 3. Pobieramy punkt z mapy i sprawdzamy, czy "wystaje" ponad
  87. horyzont (w pierwszej linii zawsze "wystaje").
  88.  
  89. 4. Jeûeli "tak", to rysujemy sîupek w dóî, który poîâczy nasz
  90. nowy punkt z punktem postawionym poniûej. Kolor pobieramy z
  91. tablicy. Oprócz tego musimy teû uaktualniê wysokoôê horyzontu w
  92. tym punkcie. Jeûeli "nie", to przechodzimy tylko do 5.
  93.  
  94. 5. Zwiëkszamy liczniki pëtli, jeûeli nie przeszliômy jeszcze
  95. caîej szerokoôci ekranu, to skaczemy do 3.
  96.  
  97. 6. Jeûeli narysowaliômy juû wszystkie punkty warstwy, to
  98. zmieniamy minimalnie perspektywë, jasnoôê i przechodzimy do
  99. nastëpnego paska, czyli do punktu 2.
  100.  
  101. 7. Kiedy narysujemy juû wszystkie paski, to mamy nowâ klatkë
  102. obrazu. Nasz "Comanche" juû lata nad górkami, ale caîâ zabawë
  103. wypadaîoby trochë urozmaiciê. Zaczniemy od obrotów, choê z góry
  104. ostrzegam, ûe szybka rotacja jest w naszym wypadku bardzo
  105. pamiëcioûerna. Jest równieû bardzo prosta. Kiedy chcemy sië
  106. obróciê, wystarczy wykonaê rotacjë wokóî obserwatora wszystkich
  107. punktów naszej tablicy perspektywy X-Z. Tutaj jednak -- wiadro
  108. zimnej wody na gîowë. Kaûda nowa pozycja kâta to dodatkowe
  109. dwadzieôcia kilobajtów tablicy (a jeûeli zaûyczymy sobie tablicy
  110. zîoûonej ze sîów, to czterdzieôci kilo). Przy okazji pragnë
  111. zauwaûyê, ûe czësto warto tworzyê tablice zîoûone z dîugich sîów,
  112. w których mamy na raz przeliczone wartoôci dla Y i X. Jak? Po
  113. prostu przy mapce o szerokoôci 512 przesuniëcie w osi Y o 1 w dóî
  114. to to samo, co przesuniëcie w osi X o 512 w prawo. Prawda, ûe
  115. proste? Wzglëdy objëtoôciowe nie pozwalajâ mi na omówienie
  116. przechyîów (na boki) i dodawania ruchomych chmur na niebie, lecz
  117. obiecujë, ûe uczynië to za miesiâc, w odcinku przeznaczonym
  118. wektorówce cieniowanej. Na dzisiaj materiaîu jest i tak sporo,
  119. jak na te 30/31 dni. Naprawdë! Pierwsze próby nad "Comanche'ami"
  120. przeprowadziîem prawie rok temu, zdâûyîem swoje wypociny umieôciê
  121. juû w dwóch demach, a mimo wszystko caîy czas dopracowujë të samâ
  122. procedurë!
  123.  
  124. Zarówno w poprzednim odcinku, jak i dziô, umieôciîem kilka
  125. "shotów" krajobrazów z kilku znanych demek. Pamiëtaê jednak
  126. naleûy, ûe choê w wypadku mojego kodu jestem pewien jego
  127. realtime'owoôci, to czasami to, co widzimy, jest zwykîâ animacjâ
  128. ze Scenery'ego bâdú Visty! To juû wszystko na dzisiaj. Juû za
  129. miesiâc Gouraudy!
  130.