Ich arbeite an einem 2D-Spiel mit einer Top-Down-Perspektive, die Secret of Mana und den 2D Final Fantasy-Spielen ähnelt. Ein großer Unterschied besteht darin, dass es sich um ein Action-RPG handelt, das eine dreidimensionale Physik-Engine verwendet.
Ich versuche, eine Zielgrafik (im Grunde ein Pfeil) zu den Füßen meiner Charaktere zu zeichnen, wenn sie auf eine Fernkampfwaffe zielen. Zuerst habe ich nur den Zielvektor des Charakters in Bogenmaß konvertiert und diesen in Spritebatch übergeben, aber es gab ein Problem. Die Position jedes Objekts in meiner Welt wird für die Perspektive skaliert, wenn es auf den Bildschirm gezeichnet wird. Wenn also die Koordinaten der Physik-Engine (1, 0, 1) sind, sind die Bildschirmkoordinaten tatsächlich (1, .707) - die Y- und Z-Achse werden mit einem Perspektivfaktor von .707 skaliert und dann addiert, um den Bildschirm zu erhalten Koordinaten.
Dies bedeutete, dass die Richtung, in die die Zielgrafik zeigte (dank ihres Rotationswerts, der an Spritebatch übergeben wurde), nicht mit der Richtung übereinstimmte, in die sich das Projektil im Laufe der Zeit tatsächlich bewegte. Die Dinge sahen gut aus, als die Charaktere nach links, rechts, oben oder unten feuerten, aber wenn Sie auf einer Diagonale feuerten, stimmte die Perspektive der Physik-Engine nicht mit der simplen Art überein, wie ich die Zielrichtung des Charakters in eine Bildschirmdrehung umwandelte.
Ok, schnell vorwärts bis jetzt: Ich habe die Rotation des Zielers auf den Pfad abgestimmt, den das Projektil tatsächlich nehmen wird. Dazu zerlege ich eine Transformationsmatrix, die ich aus zwei Rotationsmatrizen aufbaue (eine zur Darstellung der Rotation des Zielers). und eine zur Darstellung der 45-Grad-Drehung der Kamera auf der x-Achse). Meine Frage ist, gibt es eine Möglichkeit, nicht nur eine Rotation aus einer Reihe von Matrixtransformationen zu erhalten, sondern auch eine Vector2-Skala, die dem Zieler das Aussehen eines 3D-Objekts verleiht, das durch die Perspektive verzerrt wird? Ich denke, ich möchte eine orthografische Perspektive. Der Zielpfeil würde also länger, wenn er seitwärts zeigt, und kürzer, wenn er nach Norden und Süden zeigt, aufgrund der Perspektive. Gleichzeitig würde es breiter werden, wenn es nach Norden und Süden zeigt, und weniger breit, wenn es nach rechts oder links zeigt.
Ich möchte vermeiden, die Zieltextur tatsächlich in 3D zu zeichnen, da ich zu diesem Zeitpunkt in meinem Projekt noch den Layerdepth-Parameter von Spritebatch verwende und nicht herausfinden möchte, wie ein 3D-Objekt innerhalb der Tiefensortierung gezeichnet wird System habe ich schon.
Ich kann Code und weitere Details bereitstellen, wenn dies als Frage zu vage ist ... Dies ist mein erster Beitrag zum Stapelaustausch. Vielen Dank fürs Lesen!
Hinweis: (Ich denke) Mir ist klar, dass es keine technisch korrekte 3D-Perspektive sein kann, da das Skalierungsargument vector2 des Spritebatch nicht zulässt, dass ein Objekt so verzerrt wird, wie es eigentlich sein sollte. Was mich wirklich interessiert ist, gibt es eine gute Möglichkeit, den Effekt zu fälschen, oder sollte ich ihn einfach fallen lassen und überhaupt nicht skalieren?
Bearbeiten, um ohne die Hilfe eines Bildes zu klären (anscheinend kann ich sie noch nicht posten):
Ich möchte, dass der Zielpfeil so aussieht, als wäre er zu Füßen des Charakters auf den Boden gemalt worden. Daher sollte er auf der Grundebene (in meinem Fall der XZ-Ebene) gezeichnet sein, die in einem Winkel von 45 Grad (um die Ecke) geneigt sein sollte die X-Achse) aus der Betrachtungsperspektive.
Alex