Rotation aus Matrix auslesen

FSA

Erfahrenes Mitglied
Hallo. Ich habe ein 4x4 Matrix in DirectX (row-major). Ich schreibe eine Y Rotation so hinein:
C++:
// Rotationsmatrix berechnen
	                    mResult.m12 = 0.0f;                     mResult.m14 = 0.0f;
	mResult.m21 = 0.0f; mResult.m22 = 1.0f; mResult.m23 = 0.0f; mResult.m24 = 0.0f;
	                    mResult.m32 = 0.0f;                     mResult.m34 = 0.0f;
	mResult.m41 = 0.0f; mResult.m42 = 0.0f; mResult.m43 = 0.0f; mResult.m44 = 1.0f;

	mResult.m11 = mResult.m33 = cosf( f );
	mResult.m31 = sinf( f );
	mResult.m13 = -mResult.m31;
Soweit so gut. Jetzt ist aber das Problem, wenn ich die Rotation wieder auslesen will, dass ich nur Werte zwischen -PI/2 und PI bekommen. Das ist doof denn ich bekomme so nur 90°. Wie kann ich jetzt Werte zwischen 0 und 2PI auslesen? Also 0-360 Grad. Ich dachte mir einfach sin^-1() also asinf(mResult.m31), doch da bekomme ich, wie schon gesagt, nur Werte zwischen PI/2 und PI raus(0°-90°).
Danke im Voraus :)
 
Zuletzt bearbeitet von einem Moderator:
Das liegt an der Symmetrie der trigonometrischen Funktionen. Ich habe mal eine Methode für Java geschrieben die das macht, die musst du dir nur auf C++ umdenken:
Java:
public static double acos(double x, double y){
		/* Liefert einen Winkel von 0° - 360° anstelle von 0° - 180°, gibt ihn im Bogenmaß zurück */
		double angle = Math.acos(x);
		if( y < 0 ){// Für alle Winkel > 180° (wenn y < 0 am Einheitskreis ist), liefer acos(x) den kleineren Winkel zurück
			angle += 2* Math.acos(-x);
		}
		return angle%360;
	}
	
	public static double asin(double x, double y){		
		/* Liefert einen Winkel von 0° - 360° anstelle von 0° - 180°, gibt ihn im Bogenmaß zurück */
		double angle = Math.asin(y);
		if( x < 0 ){//von 90°-270°
			angle = -angle + Math.PI;
		}
		if( y < 0 && x > 0 ){ //von 270°-360°
			angle += 2 * Math.PI;
		}
		return angle%360;
	}
 
  • Gefällt mir
Reaktionen: FSA
Danke :) Aber ein Zeile verstehe ich nicht ganz:
C++:
return angle%360;
Was macht die Genau? Ist das auch ein Modulo? Wenn ja wofür?
 
Zuletzt bearbeitet von einem Moderator:
Ja, das ist Modulo.
Und den Zweck sieht man doch.
100->100
460->100
820->100

Winkel über 360 machen keinen Sinn, da kann man
so oft 360 wegnehmen, bis es kleiner als 360 ist.
 
  • Gefällt mir
Reaktionen: FSA
Ja das ist ein modulo. Sobald der Winkel größer als 360° ist, soll er halt auf einen Winkel zwischen 0 und 360 zurückgerechnet werden. Ich muss allerdings sagen, ich bin mir nicht sicher ob der Fall bei der Funktion überhaupt eintreten kann.

edit: Jetzt sehe ich das Problem. Ersetze das mal durch %(2*Math.PI). Der Winkel wird im Bogenmaß, nicht im Gradmaß zurückgegeben. Da habe ich wohl gepennt.
 
Keiner eine Idee? Also ich habe den Sinus des Winkels und den Kosinus des Winkels. Mehr nicht :( Wäre dankbar wenn es mir einer sagen könnte :) Ich verstehe zwar die Funkion aber was ich da genau übergeben soll weiß ich nicht.
 
Zurück