Le mode 7 est un effet très simple. Il projette une texture 2D x / y (ou des tuiles) sur certains sols / plafonds. Les anciens SNES utilisent du matériel pour ce faire, mais les ordinateurs modernes sont si puissants que vous pouvez le faire en temps réel (et pas besoin d'ASM comme vous le mentionnez).
La formule mathématique 3D de base pour projeter un point 3D (x, y, z) vers un point 2D (x, y) est:
x' = x / z;
y' = y / z;
Quand on y pense, cela a du sens. Les objets éloignés sont plus petits que les objets près de chez vous. Pensez aux voies ferrées qui ne vont nulle part:
Si nous regardons en arrière les valeurs d'entrée de formule: x
et y
sera le pixel actuel que nous traitons, et z
sera des informations de distance sur la distance du point. Pour comprendre ce qui z
devrait être, regardez cette image, elle montre les z
valeurs de l'image ci-dessus:
violet = près de la distance, rouge = loin
Donc, dans cet exemple, la z
valeur est y - horizon
(en supposant qu'elle se (x:0, y:0)
trouve au centre de l'écran)
Si nous mettons tout ensemble, cela devient: (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
...
}
Une dernière chose: si vous voulez faire un jeu de mario kart, je suppose que vous voulez aussi faire pivoter la carte. Eh bien, c'est aussi très facile: faites pivoter sx
et sy
avant d'obtenir la valeur de la texture. Voici la formule:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
et si vous voulez vous déplacer dans la carte, ajoutez simplement un décalage avant d'obtenir la valeur de la texture:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
REMARQUE: j'ai testé l'algorithme (presque copier-coller) et cela fonctionne. Voici l'exemple: http://glslsandbox.com/e#26532.3 (nécessite un navigateur récent et WebGL activé)
NOTE 2: j'utilise des mathématiques simples parce que vous avez dit que vous vouliez quelque chose de simple (et que vous ne semblez pas familier avec les mathématiques vectorielles). Vous pouvez réaliser les mêmes choses en utilisant la formule wikipedia ou les tutoriels que vous donnez. La façon dont ils l'ont fait est beaucoup plus complexe mais vous avez beaucoup plus de possibilités pour configurer l'effet (au final ça marche de la même façon ...).
Pour plus d'informations, je suggère de lire: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection