Tryb 7 to bardzo prosty efekt. Wyświetla teksturę 2D (lub kafelki) 2D na pewnej podłodze / suficie. Stare SNES używają do tego sprzętu, ale współczesne komputery są tak potężne, że możesz to robić w czasie rzeczywistym (i jak już wspomniałeś, nie potrzebujesz ASM).
Podstawowa formuła matematyczna 3D do rzutowania punktu 3D (x, y, z) na punkt 2D (x, y) to:
x' = x / z;
y' = y / z;
Kiedy się nad tym zastanowić, ma to sens. Obiekty znajdujące się w dużej odległości są mniejsze niż obiekty w pobliżu. Pomyśl o torach kolejowych zmierzających do nikąd:
Jeśli spojrzymy wstecz na wartości wejściowe formuły: x
i y
będzie to bieżący piksel, który przetwarzamy, i z
będzie informacja o odległości, jak daleko jest punkt. Aby zrozumieć, co z
powinno być, spójrz na to zdjęcie, pokazuje z
wartości dla powyższego obrazu:
fioletowy = bliski dystans, czerwony = daleki dystans
W tym przykładzie z
wartość to y - horizon
(zakładając, że (x:0, y:0)
jest na środku ekranu)
Jeśli poskładamy wszystko razem, staje się: (pseudokod)
for (y = -yres/2 ; y < yres/2 ; y++)
for (x = -xres/2 ; x < xres/2 ; x++)
{
horizon = 20; //adjust if needed
fov = 200;
px = x;
py = fov;
pz = y + horizon;
//projection
sx = px / pz;
sy = py / pz;
scaling = 100; //adjust if needed, depends of texture size
color = get2DTexture(sx * scaling, sy * scaling);
//put (color) at (x, y) on screen
...
}
I ostatnia rzecz: jeśli chcesz stworzyć grę Mario Kart, przypuszczam, że chcesz również obrócić mapę. Cóż, jest to również bardzo łatwe: obracaj sx
i sy
zanim uzyskasz wartość tekstury. Oto wzór:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
a jeśli chcesz przejść przez mapę, po prostu dodaj przesunięcie, zanim uzyskasz wartość tekstury:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
UWAGA: przetestowałem algorytm (prawie kopiuj-wklej) i działa. Oto przykład: http://glslsandbox.com/e#26532.3 (wymaga najnowszej przeglądarki i włączonej WebGL)
UWAGA 2: używam prostej matematyki, ponieważ powiedziałeś, że chcesz czegoś prostego (i nie wydaje się, że znasz matematykę wektorową). Możesz osiągnąć te same rzeczy, używając formuły wikipedia lub samouczków, które dajesz. Sposób, w jaki to zrobili, jest znacznie bardziej złożony, ale masz znacznie więcej możliwości konfiguracji efektu (w końcu działa tak samo ...).
Aby uzyskać więcej informacji, sugeruję przeczytanie: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection