Tunel - tablice offsetów
Tunel na offsetach jest bardzo prostym efektem, ale przynajmniej dla mnie na początku - bardzo efektownym. Aby go skodować musisz umieć wczytać lub wygenerować teksturkę 256x256, umieć wyświetlać dane na ekranie, oraz umieć stworzyć dwie duże tablice (320x200 bajtów).

Wyobraź sobie, że masz kwadratową kartkę papieru, którą za chwilę zwiniesz w rulonik. Może ona wyglądać np. tak:



Gdybyśmy ją zwinęli, spojrzeli z przodu (jak w lunetę) i to co widzimy narysowali na ekranie - to moglibyśmy zauważyć dwie rzeczy. Po pierwsze - im bliżej środka ekranu, tym głębszą część kartki widać:



Punkt A znajduje się bliżej nas niż punkt B, widać, że jego odległość od środka (punktu O) jest większa od odległości OB. Gdyby jakiś punkt znajdował się na zielonym polu - byłby on jeszcze bliżej środka - czyli jeszcze głębiej. Oznacza to, że im bliżej środka znajduje się dany pixel - tym większa jest współrzędna Y punktu, który bierzemy z naszej texturki.

Potraktujmy teraz ekran jak układ współrzędnych. Druga rzecz dotyczy kąta jaki tworzy dany punkt z osią OY układu współrzędnych:



Widać, że punkt A tworzy kąt mniejszy niż punkt B, a punkt B mniejszy niż punkt C. Oznacza to, że dla pixela narysowanego w punkcie A będziemy brali punkt o mniejszej współrzędnej X z teksturki niż dla pixela z punktu B i C. Po prostu po zwinięciu kartki jej lewa połowa jest blisko osi OY na ekranie, a im dalej w prawo - tym bardziej się zwija naokoło środka ekranu.

Nasza kartka - teksturka - jest tablicą o rozmiarach 256x256. Musimy odpowiednio rozmieścić ją za szklaną szybką przed nami... jak?

Musimy więc dla każdego pixela na ekranie wyliczyć dwie wartości: jego odległość od środka ekranu, oraz kąt, jaki tworzy z osią OY. Tak naprawdę będzie nam potrzebne:
- promień tunela podzielony przez odległość pixela od środka ekranu
- arctangens (odwrotność tangensa) kąta (OY,OA) (dla punktu A)
Algorytm rysowania tunelu wygląda tak:

dla każdego pixela na ekranie
niech tx będzie równe elementowi z pierwszej tablicy dla tego piksela
niech ty będzie równe elementowi z drugiej tablicy dla tego piksela
niech color będzie kolorem piksela z texturki z miejsca [tx,ty]
pokoloruj piksel kolorem color

Tablice liczymy według takich wzorów:

t1[x,y] = promień / sqrt(x*x+y*y) 

t2[x,y] = 256*arctan(x/y) / (2*pi)


gdzie:

promień - np. równy 1000, od niego zależy czy tunel jest gruby czy cienki
sqrt - oznacza pierwiastek kwadratowy
pi - 3.14... :-)

Po obliczeniu tych dwóch tablic, zainicjowaniu trybu graficznego oraz wykonaniu podanego algorytmu - powinieneś otrzymać na ekranie coś w rodzaju tunnelu wylepionego twoją teksturką. Jeżeli tak się nie stało, spróbuj pomyśleć co może być źle (często ludziom nie wychodzi z tablicami, sprawdź, czy dobrze je liczysz). Jeżeli zupełnie nie masz pojęcia co popsułeś - napisz do mnie.

OK. Tunel już jest... ale jakiś nieruchomy... a tak fajnie byłoby w nim polecieć w dal.... Jest to (oczywiście) bardzo proste. Jeżeli dla każdego pixela do wartości tx wziętej z tablicy dodamy pewną stałą wartość - tunel będzie wyglądał jakby obrócony w prawo (jak mocno? zależy od tej wartości). Jeżeli dodamy coś do ty - tunel będzie przybliżony. Wystarczy więc zadeklarować dwie zmienne, które będziemy modyfikować raz na klatkę, aby tunel obracał się i przybliżał. Można nim kołysać.. przyśpieszać... spowalniać... naprawdę jest z czym eksperymentować...

Prawdziwa zabawa jednak zaczyna się dopiero, gdy zauważymy, ze podane wzory na tablice nie są jedynymi, jakich możemy użyć... jeżeli zamiast dzielić promień przez pierwiastek - pomnożymy (oczywiście jednocześnie mnożąc przez pewną skalę, aby nie wartość nie była zbyt duża) - to otrzymamy coś w rodzaju odwrotności tunela. To trzeba zobaczyć. :) W ogóle można próbować poskładać różne funkcje i zobaczyć, co z tego wyjdzie.

Miłej zabawy! :-)


Autorem tekstu jest: Jacek Popławski
Materiał dodany przez użytkownika: alphan