Mode 7 adalah efek yang sangat sederhana. Ini memproyeksikan tekstur x / y 2D (atau ubin) ke beberapa lantai / langit-langit. SNES lama menggunakan perangkat keras untuk melakukan ini, tetapi komputer modern sangat kuat sehingga Anda dapat melakukan ini secara realtime (dan tidak perlu ASM seperti yang Anda sebutkan).
Rumus matematika 3D dasar untuk memproyeksikan titik 3D (x, y, z) ke titik 2D (x, y) adalah:
x' = x / z;
y' = y / z;
Ketika Anda memikirkannya, itu masuk akal. Objek yang jauh jaraknya lebih kecil dari objek di dekat Anda. Pikirkan tentang rel kereta api yang menuju ke mana-mana:
Jika kita melihat kembali nilai input rumus: x
dan y
akan menjadi piksel saat ini kami sedang memproses, dan z
akan menjadi informasi jarak tentang seberapa jauh titik tersebut. Untuk memahami apa yang z
seharusnya, lihat gambar itu, itu menunjukkan z
nilai untuk gambar di atas:
ungu = jarak dekat, merah = jauh
Jadi dalam contoh ini, z
nilainya adalah y - horizon
(dengan asumsi (x:0, y:0)
berada di tengah layar)
Jika kita menyatukan semuanya, itu menjadi: (pseudocode)
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
...
}
Satu hal terakhir: jika Anda ingin membuat game mario kart, saya kira Anda juga ingin memutar peta. Yah itu juga sangat mudah: memutar sx
dan sy
sebelum mendapatkan nilai tekstur. Berikut ini rumusnya:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
dan jika Anda ingin memindahkan melalui peta, cukup tambahkan beberapa offset sebelum mendapatkan nilai tekstur:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
CATATAN: Saya menguji algoritme (hampir salin-tempel) dan berfungsi. Berikut ini contohnya: http://glslsandbox.com/e#26532.3 (memerlukan browser terbaru dan WebGL diaktifkan)
NOTE2: saya menggunakan matematika sederhana karena Anda mengatakan Anda menginginkan sesuatu yang sederhana (dan sepertinya tidak terbiasa dengan matematika vektor). Anda dapat mencapai hal yang sama menggunakan rumus wikipedia atau tutorial yang Anda berikan. Cara mereka melakukannya jauh lebih kompleks tetapi Anda memiliki lebih banyak kemungkinan untuk mengkonfigurasi efeknya (pada akhirnya itu berfungsi sama ...).
Untuk informasi lebih lanjut, saya sarankan membaca: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection