Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Verständnisproblem bei Rotationsmatrizen (https://www.delphipraxis.net/85917-verstaendnisproblem-bei-rotationsmatrizen.html)

3_of_8 6. Feb 2007 21:59


Verständnisproblem bei Rotationsmatrizen
 
Morgen.

Ich habe gerade ein Problem bei Rotationsmatrizen.

Wie kann ich aus einer Rotationsmatrix die einzelnen Winkel berechnen?

em-sigma 7. Feb 2007 09:12

Re: Verständnisproblem bei Rotationsmatrizen
 
Hi,

schau doch mal hier

Roll-Pitch-Yaw-Winkel

oder hier

Euler-Winkel

In beiden Fällen gibt's in der Rotationsmatrix einen Term, der nur eine einzelne Winkelfunktion enthält, die sich leicht auflösen läßt. Daraus ergeben sich dann einfach die beiden anderen Winkel aus zwei anderen Matrix-Komponenten.

Ich hoffe das hilft,
em-sigma

3_of_8 7. Feb 2007 12:58

Re: Verständnisproblem bei Rotationsmatrizen
 
Die Artikel kenne ich.

Ich habe gestern noch einen Algorithmus dafür geschrieben, aber irgendwie scheint da was nicht ganz zu klappen... *kratz*

Delphi-Quellcode:
procedure TMCCamera.Turn(const Pitch, Yaw, Roll: Single);
var Matrix: TMCMatrix4f;
    a, b, c: Single;
begin
  glPushMatrix;
  glLoadIdentity;

  //Laden der Kameraposition
  glRotatef(FPitch, 1, 0, 0);
  glRotatef(FYaw, 0, 1, 0);
  glRotatef(FRoll, 0, 0, 1);

  //Drehen der Kamera um die Winkel Pitch, Yaw, Roll
  glRotatef(Pitch, 1, 0, 0);
  glRotatef(Yaw, 0, 1, 0);
  glRotatef(Roll, 0, 0, 1);

  //Laden der Modelviewmatrix in die Variable Matrix und zurücksetzen der Modelviewmatrix
  glGetFloatv(GL_MODELVIEW_MATRIX, @Matrix[0, 0]);
  glPopMatrix;

  //Berechnung der Winkel Beta, Alpha und Gamma (Bogenmaß)
  b:=ArcSin(min(1, -Matrix[0, 2]));
  a:=ArcSin(min(1, Matrix[1, 2]/Cos(b)));
  c:=ArcSin(min(1, Matrix[0, 1]/Cos(b)));

  //Umrechnung Bogenmaß in Grad
  FPitch:=c*180/Pi;
  FYaw:=b*180/Pi;
  FRoll:=a*180/Pi;
end;
Wenn ich mich nur nach rechts oder links drehe (Yaw verändere) geht das prima. Sobald jedoch Pitch oder Roll dazukommen, bekomme ich völlig unsinnige Werte. Wenn ich beispielsweise aus Nulllage mehrmals hintereinander Camera.Turn(1, 0, 0); aufrufe, müsste sich eigentlich nur FPitch verändern, es verändern sich jedoch alle Winkel, vor allem der Roll Winkel.

EDIT: Es sei dazugesagt, dass Zeilen- und Spaltenindizes hier vertauscht wird. Die Matrizen liegen spaltenweise im Speicher.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz