Mod 7 çok basit bir etkidir. Bazı zemine / tavana 2B x / y doku (veya fayans) yansıtır. Eski SNES bunu yapmak için donanım kullanır, ancak modern bilgisayarlar o kadar güçlüdür ki bu gerçek zamanlı olarak yapabilirsiniz (ve belirttiğiniz gibi ASM'ye gerek yoktur).
Bir 3B noktasına (x, y, z) 2B noktasına (x, y) yansıtmak için temel 3B matematik formülü:
x' = x / z;
y' = y / z;
Bunu düşündüğünüzde, mantıklı. Uzak mesafedeki nesneler yakınınızdaki nesnelerden daha küçüktür. Hiçbir yere varamayacak demiryolu yollarını düşünün:
Formül giriş değerlerine tekrar bakarsak: x
ve işlediğimiz y
geçerli piksel z
olacak ve noktanın ne kadar uzak olduğuna dair mesafe bilgisi olacaktır. Ne z
olması gerektiğini anlamak için, bu resme bakın, z
yukarıdaki görüntü için değerleri gösterir :
mor = yakın mesafe, kırmızı = uzak
Yani bu örnekte, z
değer y - horizon
( (x:0, y:0)
ekranın ortasında olduğu varsayılarak )
Her şeyi bir araya getirirsek, olur: (sözde kod)
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
...
}
Son bir şey: Eğer bir mario kart oyunu yapmak istiyorsanız, sanırım haritayı da döndürmek istiyorsunuz. Aynı zamanda çok kolay: döndürün sx
ve sy
doku değeri almadan önce. İşte formül:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
ve harita üzerinde hareket etmek istiyorsanız, doku değeri almadan önce bir miktar ofset ekleyin:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
NOT: i (neredeyse kopyala-yapıştır) algoritması test ve çalışır. Örnek: http://glslsandbox.com/e#26532.3 (son tarayıcı ve WebGL'nin etkin olmasını gerektirir)
NOT2: Basit bir şey istediğinizi söylediğiniz için basit matematik kullanıyorum (ve vektör matematiğine aşina görünmüyor). Aynı şeyleri wikipedia formülü ya da verdiğiniz öğreticileri kullanarak da elde edebilirsiniz. Yaptıkları yol çok daha karmaşıktır, ancak efekti yapılandırmak için çok daha fazla seçeneğiniz vardır (sonunda aynı çalışır ...).
Daha fazla bilgi için şunu okumanızı öneririm: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection