Ich schreibe ein 2D-Spiel, bei dem in meiner Spielwelt die x- Achse von links nach rechts, die y- Achse von oben nach unten und die z- Achse außerhalb des Bildschirms verläuft:
Während meine Spielwelt von oben nach unten ist, wird das Spiel leicht geneigt gerendert:
Ich arbeite daran, vom Weltraum auf den Bildschirmraum zu projizieren und umgekehrt. Ich habe die erstere wie folgt arbeiten:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
Die NegateY()
Erweiterungsmethode macht genau das, wonach es sich anhört, da die y- Achse von XNA von unten nach oben und nicht von oben nach unten verläuft. Der Screenshot oben zeigt, wie alles funktioniert. Grundsätzlich habe ich eine Reihe von Punkten im 3D-Raum, die ich dann im Bildschirmraum rendere. Ich kann die Kameraeigenschaften in Echtzeit ändern und sehen, wie sie an der neuen Position animiert werden. Natürlich werden in meinem eigentlichen Spiel eher Sprites als Punkte verwendet und die Kameraposition wird festgelegt, aber ich versuche nur, die gesamte Mathematik in Ordnung zu bringen, bevor ich dazu komme.
Jetzt versuche ich, zurück in die andere Richtung zu konvertieren. Das heißt, wenn ein x- und y- Punkt im Bildschirmbereich oben angegeben ist, bestimmen Sie den entsprechenden Punkt im Weltraum. Wenn ich also den Cursor beispielsweise auf die linke untere Ecke des grünen Trapezes zeige, möchte ich einen Weltraumwert von (0, 480) erhalten. Die z- Koordinate ist irrelevant. Oder besser gesagt, die z- Koordinate ist immer Null, wenn sie zurück in den Weltraum abgebildet wird. Im Wesentlichen möchte ich diese Methodensignatur implementieren:
public Vector2 ScreenPointToWorld(Vector2 point)
Ich habe verschiedene Dinge versucht, um dies zum Laufen zu bringen, aber ich habe einfach kein Glück. Mein neuester Gedanke ist, dass ich Viewport.Unproject
zweimal mit unterschiedlichen Nah / Fern- Z- Werten aufrufen , das Ergebnis berechnen Ray
, normalisieren und dann den Schnittpunkt von Ray
mit einem berechnen muss, der im Plane
Grunde das Bodenniveau meiner Welt darstellt. Ich blieb jedoch beim letzten Schritt stecken und war mir nicht sicher, ob ich die Dinge zu kompliziert machte.
Kann mich jemand in die richtige Richtung weisen, wie dies erreicht werden kann?