Ich rolle meine eigene 3D-Engine in JavaScript und verwende nur Zeichenfläche, kein WebGL. Dies ist ein weiterer Minecraft-Klon. Ich liebe Kisten, verurteile mich nicht.
Bisher funktioniert alles wunderbar, bis auf eines: Wenn in 3D einige Scheitelpunkte hinter der nahen Schnittebene liegen, kommt ihre Projektion auf dem Bildschirm merkwürdig heraus (vorausgesetzt, andere Scheitelpunkte, die zum Verfolgen einer Ebene verwendet werden, sind vorne).
Ich habe versucht, diese Punkte auszuschneiden, aber dann kann ich durch die Oberflächen sehen, die diese Scheitelpunkte verwenden. In WebGL / OpenGL kümmert sich die Grafikkarte um diese Punkte und die Ebene wird korrekt gerendert, aber ich habe keinen Zugriff auf Hardware, daher muss ich diese selbst codieren.
Ich bin mir nicht ganz sicher, was ich davon halten soll. Derzeit ist das letzte, was mir in den Sinn gekommen ist, die Projektion von Punkten hinter der Clipping-Ebene des Spielers umzukehren, was logisch erscheint, da ich einen Punkt auf einen Bildschirm projizieren muss, der vor mir liegt des Scheitelpunkts.
Hier sind meine Gedanken:
Hier sind einige Bilder, die veranschaulichen, was passiert:
Aus der Ferne macht sich die blaue Box perfekt.
Wenn einige der Scheitelpunkte hinter der nahen Clipping-Ebene des Players liegen, mache ich eine Umkehrprojektion, aber es sieht nicht richtig aus:
focalLength *= -1;
2d.x = x*focalLength/z;
2d.y = y*focalLength/z;
Beachten Sie, dass das graue Feld dahinter vollständig entfernt ist, da sich alle zum Zeichnen der Gesichter verwendeten Scheitelpunkte hinter dem Player befinden.
Dies ist, was passiert, wenn Sie nach oben oder unten schauen.
Ich weiß nicht, was ich mit der Mathematik dahinter anfangen soll. Ich hoffe, jemand hat bereits das gleiche Problem und kann mir helfen.
lineTo(x,y)
Funktion weiterhin aufgerufen werden konnte. Ich weiß nur nicht, wie sie sich verhält. Es ist eine bizarre Dimension, da stimme ich zu.