Von (Roll-)Nick-Gier-Winkel auf Direktions-Vektor schließen?



  • Hallo alle miteinander,

    ich versuche gerade eine eigene 3D-Spiele-Engine zu entwickeln, um meine Programmierkenntnisse etwas zu verbessern. Allerdings merke ich nun, dass ich Wissenslücken in der Mathematik habe, was für mein Vorhaben doch etwas hinderlich ist. Die werde ich auf jeden Fall versuchen zu beseitigen, doch nun möchte ich deswegen nicht wochen/monatelang auf das Programmieren verzichten und für das Erste würde es mir reichen, wenn ich die Frage im Titel beantwortet bekommen könnte.

    Ich habe jeweils einen Winkel für Nick (Pitch) und Gier (Yaw).
    - Ein Pitch reicht von +85° (schaue in den Himmel) über 0° (schaue geradeaus) bis -85° (schaue auf die eigenen Füße).
    - Ein Yaw reicht von 0° (schaue gen Süden) über 90° (schaue gen Westen), 180° (schaue gen Norden) und 270° (schaue gen Osten) bis hin 359° (schaue fast gen Süden); 360° gibt es nicht und wird wieder zu 0°.
    - Ein Roll habe ich noch nicht implementiert (der Spieler kann seinen Kopf nicht von Schulter zu Schulter schwenken). Ich erhoffe mir durch eine Antwort auf die Frage selbst auf die Lösung für dieses Problem zu kommen. Ohne Roll wirken Objekte auf unebenem Terrain etwas fehlplatziert, was aber im Moment nicht stört.

    Kann ich anhand dieser Informationen auf einen direktionalen Vektor schließen? Und wenn ja, wie sehen die Formeln hierfür aus?

    Es wäre wirklich sehr nett von euch, wenn ihr ein Erbarmen mit mir hättet!



  • Hallo SchwarzerFrosch,

    falls ich Dich richtig verstehe, hast Du fast ein ähnliches Problem wie ich, nur dass Du einen Körper um drei anstatt zwei Achsen drehen willst?!

    Hier ist ein Beispiel wie Du um zwei Achsen drehen kannst. Eine dritte Achse kann Du analog dazubauen, in dem Du Dich auf das Ergebnis der vorigen Rotation beziehst (siehe Rotation um x-Achse)

    // Rotation um z-Achse
    x2 = x1 * cos(a) - y1 * sin(a);  
    y2 = x1 * sin(a) + y1 * cos(a);
    z2 = z1; // optional
    // Rotation um x-Achse
    y3 = y2 * cos(b) - z2 * sin(b);
    z3 = y2 * sin(b) + z2 * cos(b);
    

    Siehe hierzu auch https://www.c-plusplus.net/forum/334460 (Dort kommt allerdings noch ein anderes Problem mit 'kamerarelativen' Achsen dazu)



  • Falls Du noch tiefer eintauchen willst: https://www.youtube.com/watch?v=C5g62Cy6WLA

    Hier wird die Drehung um die drei Achsen ganz gut erklärt inkl. Rotationsmatrizen, Formeln, Code-Snippets, ob Euler-Winkel reichen und ab wann Du Quaternionen brauchst. 😉



  • Solange du nur Pitch und Yaw hast, hast du Kugelkoordinaten.
    Wenn du jetzt in kartesische Koordinaten umrechnest, so bekommst du deinen Richtungsvektor.

    Formel siehe hier: https://de.wikipedia.org/wiki/Kugelkoordinaten#Umrechnungen
    Du bekommst damit deinen (x,y,z) Vektor, der dir die Blickrichtung angibt.


Log in to reply