Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
Turbo Delphi für Win32
|
Re: Verständnisproblem bei Rotationsmatrizen
7. Feb 2007, 13:58
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.
Manuel Eberl „The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
|