Modus 7 ist ein sehr einfacher Effekt. Es projiziert eine 2D x / y-Textur (oder Kacheln) auf einen Boden / eine Decke. Alte SNES verwenden hierfür Hardware, aber moderne Computer sind so leistungsfähig, dass Sie dies in Echtzeit tun können (und kein Bedarf an ASM, wie Sie bereits erwähnt haben).
Die grundlegende 3D-Mathematikformel zum Projizieren eines 3D-Punkts (x, y, z) auf einen 2D-Punkt (x, y) lautet:
x' = x / z;
y' = y / z;
Wenn Sie darüber nachdenken, macht es Sinn. Objekte, die weit entfernt sind, sind kleiner als Objekte in Ihrer Nähe. Denken Sie an Eisenbahnschienen, die ins Nirgendwo führen:
Wenn wir auf die Formeleingabewerte zurückblicken: x
und y
werden das aktuelle Pixel sein, das wir verarbeiten, und z
werden Entfernungsinformationen darüber sein, wie weit der Punkt ist. Um zu verstehen, was z
sein sollte, sehen Sie sich das Bild an. Es zeigt z
Werte für das obige Bild:
Lila = Nähe, Rot = Ferne
In diesem Beispiel z
lautet der Wert y - horizon
(vorausgesetzt, er (x:0, y:0)
befindet sich in der Mitte des Bildschirms).
Wenn wir alles zusammenfügen, wird es: (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
...
}
Eine letzte Sache: Wenn Sie ein Mario-Kart-Spiel machen möchten, möchten Sie vermutlich auch die Karte drehen. Nun, es ist auch sehr einfach: drehen sx
und sy
vor dem Abrufen des Texturwerts. Hier ist die Formel:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
und wenn Sie sich durch die Karte bewegen möchten, fügen Sie einfach einen Versatz hinzu, bevor Sie den Texturwert erhalten:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
HINWEIS: Ich habe den Algorithmus getestet (fast Kopieren-Einfügen) und es funktioniert. Hier ist das Beispiel: http://glslsandbox.com/e#26532.3 (aktueller Browser und aktiviertes WebGL erforderlich)
ANMERKUNG 2: Ich benutze einfache Mathematik, weil Sie sagten, Sie wollen etwas Einfaches (und scheinen mit Vektor-Mathematik nicht vertraut zu sein). Sie können die gleichen Dinge erreichen, indem Sie Wikipedia-Formeln oder Tutorials verwenden, die Sie geben. Die Art und Weise, wie sie es gemacht haben, ist viel komplexer, aber Sie haben viel mehr Möglichkeiten, den Effekt zu konfigurieren (am Ende funktioniert es genauso ...).
Für weitere Informationen schlage ich vor zu lesen: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection