El modo 7 es un efecto muy simple. Proyecta una textura 2D x / y (o mosaicos) en algún piso / techo. Los SNES antiguos usan hardware para hacer esto, pero las computadoras modernas son tan poderosas que puedes hacer esto en tiempo real (y no necesitas ASM como mencionas).
La fórmula matemática 3D básica para proyectar un punto 3D (x, y, z) en un punto 2D (x, y) es:
x' = x / z;
y' = y / z;
Cuando lo piensas, tiene sentido. Los objetos que están muy lejos son más pequeños que los objetos cercanos a usted. Piensa en las vías del ferrocarril que no van a ninguna parte:
Si miramos hacia atrás a los valores de entrada de la fórmula: x
y y
será el píxel actual que estamos procesando, y z
será la información de distancia sobre qué tan lejos está el punto. Para entender lo que z
debería ser, mira esa imagen, muestra z
valores para la imagen de arriba:
púrpura = distancia cercana, rojo = lejos
Entonces, en este ejemplo, el z
valor es y - horizon
(suponiendo que (x:0, y:0)
esté en el centro de la pantalla)
Si ponemos todo junto, se convierte en: (pseudocódigo)
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
...
}
Una última cosa: si quieres hacer un juego de Mario Kart, supongo que también quieres rotar el mapa. Bueno, también es muy fácil: girar sx
y sy
antes de obtener el valor de la textura. Aquí está la fórmula:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
y si quieres moverte por el mapa, solo agrega algo de desplazamiento antes de obtener el valor de textura:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
NOTA: probé el algoritmo (casi copiar y pegar) y funciona. Aquí está el ejemplo: http://glslsandbox.com/e#26532.3 (requiere navegador reciente y WebGL habilitado)
NOTA 2: uso matemáticas simples porque dijiste que quieres algo simple (y no pareces familiarizado con las matemáticas vectoriales). Puede lograr lo mismo utilizando la fórmula de Wikipedia o los tutoriales que ofrece. La forma en que lo hicieron es mucho más compleja, pero tiene muchas más posibilidades para configurar el efecto (al final funciona igual ...).
Para obtener más información, sugiero leer: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection