Rotation um Lokale Achse 3D

    • GM 8

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Rotation um Lokale Achse 3D

      Ich steh vor einem riesigen Problem.

      Ich möchte gerne ein 3D-Raumschiff-Game machen, und habe probleme, das Raumschiff korrekt zu drehen.
      Da alle Drehungen von den Welt-Achsen aus gehen, fehlen mir die Drehungen um die lokalen Achsen.
      Also ich kann zwar alle Richtungen anzeigen lassen, aber mich nicht korrekt dehen, wenn das Raumschiff bereits verkippt ist.

      Dazu müsste ich die lokalen Winkel in Globale Winkel konvertieren, konnte bisher aber keine Transformation dafür finden.
      Ich benutze RPY-Winkel.
    • Schon mal versucht, vor jeder Rotation das Raunschiff auf den globalen Koordinatenursprung zu verschieben, zu rotieren, und dann zurückzusetzen? Im Konkreten rede ich von

      GML-Quellcode

      1. d3d_transform_add_translation(-x,-y,-z)
      2. // Rotation
      3. d3d_transform_add_translation(x,y,z)

      © 2008 by Teamgrill Productions
    • Das Anzeigen ist nicht das Problem. Das Model dreht sich schön mit den RPY-Winkel.

      Es geht um die veränderten Achsen nach einer Drehung.
      Beispiel:
      Die Winkel in der Reihenfolge, wie ich sie drehe (z, y, x)-Achse:
      vorher: (0, 0, 45)
      drehe Pitch um 90°
      nachher: (0, 90, 45) globale y-Achse
      soll aber: (90, 45, 90) lokale y-Achse

      hoffe so ist es verständlicher.
    • Du musst nicht die Winkel umrechnen, du kannst auch einfach die Achsen mitdrehen und dann um diese geneigten Achsen drehen. Damit sich der Aufwand in Grenzen hält würde ich yaw zuletzt ausführen und roll und pitch in beliebiger Reihenfolge. Auf diese Weise musst du nur einmal eine gedrehte Achse berechnen. Konkret sähe das wie folgt aus.

      GML-Quellcode

      1. // pitch zuerst
      2. d3d_transform_add_rotation_y(alpha);
      3. // roll um die gedrehte x-Achse
      4. d3d_transform_add_rotation_axis(cos(degtorad(alpha)),0,sin(degtorad(alpha)),beta);
      5. // zuletzt yaw, dessen Achse von vorigen Drehungen unberührt bleibt
      6. d3d_transform_add_rotation_z(gamma);

      Habe das jetzt nicht getestet, aber so in etwa sollte es funktionieren. Wenn nicht, einfach nochmal melden.
    • TheWhiteShadow schrieb:

      Es geht mit nicht um die Drehung des Models an sich, sondern um die Berechnung der Winkel, welche zu der letzendlichen Richtung führen sollen.

      Du hast also zwei Vektoren und möchtest nun so drehen, dass du von einem auf den anderen kommst? Berechne das Kreuzprodukt der zwei Vektoren, dann hast du die Achse um die gedreht werden muss. Schließlich brauchst du noch den Winkel zwischen den beiden Vektoren, den man mit dem Skalarprodukt berechnen kann.

      © 2008 by Teamgrill Productions
    • Nachdem ich mir nochmal dein Beispiel angeschaut habe, verstehe ich denke ich was du meinst. Das Problem an Euler-Winkeln ist einfach, dass sich auf ihnen nicht so ohne weiteres Rotationen um beliebige Achsen durchführen lassen. Deshalb wird dir wohl nichts anderes übrig bleiben, als deine zyx-Darstellung in eine praktikablere Darstellung wie z.B. eine Rotationsmatrix oder ein Quaternion umzuwandeln, deine Rotation darauf anzuwenden und anschließend wieder in zyx-Winkel zurück zu rechnen. Umwandlung in Rotationsmatrix ist auf Wikipedia zu finden.

      Da sich mit den Euler-Winkeln schlecht rechnen lässt wäre es meiner Meinung nach auch sinnvoller lieber ganz auf eine andere Darstellung zu wechseln. Die Quaternionen kann ich da nur empfehlen. Sie sind einfach zu handhaben und benötigen nur eine Koordinate mehr, also vier statt drei. Zur Hintereinanderausführung von Drehungen muss man deren Quaternionen lediglich multiplizieren. Einfacher gehts nicht.
    • Zu Rotationsmatrizen hab ich bereits mehrere Skripte geschrieben.
      Quaternionen
      Ich hab mir das Thema schon gestern 2 mal durchgelesen und verstehe 0. ?(
      Ist ähnlich wie komplexe zahlen aber mehr weiß ich auch nicht.
      Aber wenn das so einfach zu handhaben sein soll, les ich auch noch ein 3. mal durch.