O modo 7 é um efeito muito simples. Ele projeta uma textura 2D x / y (ou ladrilhos) em algum piso / teto. Os SNES antigos usam hardware para fazer isso, mas os computadores modernos são tão poderosos que você pode fazer isso em tempo real (e não precisa do ASM, como você mencionou).
A fórmula matemática 3D básica para projetar um ponto 3D (x, y, z) em um ponto 2D (x, y) é:
x' = x / z;
y' = y / z;
Quando você pensa sobre isso, faz sentido. Objetos distantes são menores que objetos próximos a você. Pense em trilhos de trem que não levam a lugar nenhum:
Se olharmos para os valores de entrada da fórmula: x
e y
será o pixel atual que estamos processando, e z
haverá informações de distância sobre a distância que o ponto está. Para entender o que z
deve ser, olhe para a figura, ela mostra z
valores para a imagem acima:
roxo = próximo da distância, vermelho = distante
Portanto, neste exemplo, o z
valor é y - horizon
(assumindo que (x:0, y:0)
está no centro da tela)
Se juntarmos tudo, ele se torna: (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
...
}
Uma última coisa: se você quiser fazer um jogo de mario kart, suponho que você também queira girar o mapa. Bem, também é muito fácil: gire sx
e sy
antes de obter o valor da textura. Aqui está a fórmula:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
e se você quiser mover-se pelo mapa, basta adicionar algum deslocamento antes de obter o valor da textura:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
NOTA: testei o algoritmo (quase copiar e colar) e funciona. Aqui está o exemplo: http://glslsandbox.com/e#26532.3 (requer navegador recente e WebGL ativado)
NOTA2: eu uso matemática simples porque você disse que quer algo simples (e não parece familiarizado com a matemática vetorial). Você pode conseguir as mesmas coisas usando a fórmula da wikipedia ou os tutoriais fornecidos. O modo como eles fizeram isso é muito mais complexo, mas você tem muito mais possibilidades de configurar o efeito (no final, funciona da mesma maneira ...).
Para mais informações, sugiro a leitura: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection