Rotation um eine beliebige Achse [Ideen]
-
Ich habe jetzt ein Funktion um ein Objekt um eine Achse rotieren zu lassen.
Wenn ich für Winkel 0 und die drei Koordinaten mit 0 angebe ist das Objekt nicht zu sehen.
gxRotate(0,0,0,0); Nicht mit glRotatef() verwechseln
Auch wenn ich erst rotiere und danach verschiebe.
Hier mal etwas Code:
m_matRot._11= (x*x) * (1.0f - fcos ) + fcos; m_matRot._12= (x*y) * (1.0f - fcos ) - (z*fsin); m_matRot._13= (x*z) * (1.0f - fcos ) + (y*fsin); m_matRot._21= (y*x) * (1.0f - fcos ) + (z*fsin); m_matRot._22= (y*y) * (1.0f - fcos ) + fcos; m_matRot._23= (y*z) * (1.0f - fcos ) - (x*fsin); m_matRot._31= (z*x) * (1.0f - fcos ) - (y*fsin); m_matRot._32= (z*y) * (1.0f - fcos ) + (x*fsin); m_matRot._33= (z*z) * (1.0f - fcos ) + fcos; m_matRot._14= m_matRot._24 = m_matRot._34 = 0.0f; m_matRot._41= m_matRot._42 = m_matRot._43 = 0.0f; m_matRot._44= 1.0f;
Die Rotationsmatrix multipliziere ich mit der Weltmatrix
Wenn nötig wird das ganze noch verschoben:
m_matWorld._41 = x; m_matWorld._42 = y; m_matWorld._43 = z;
Wenn ich die Funktion glRotatef() in OpenGL verwende und alle Werte mit 0 angebe ist das Objekt trotzdem zu sehen.
Ich selber befinde mich 20 Einheiten vom Nullpüunkt entfernt.
Weiss einer wie ich es trotdem machen könnte das man das Objekt trotdem sehen kann. Ist ja nicht auszuschließen das in einem Programm diese Werte alle mal auf 0 sind.
[ Dieser Beitrag wurde am 16.04.2003 um 17:29 Uhr von Netzwerk-Latenz editiert. ]
-
Aus meiner Engine:
// Rotationsmatrix für Rotation um eine beliebige Achse berechnen Matrix4x4 Matrix4x4::RotationAxis(Vector3D Axis, const float Angle) { // Sinus und Kosinus des Winkels berechnen const float Sin = sinf(-Angle); const float Cos = cosf(-Angle); // Achsenvektor normalisieren Axis.Normalize(); // Matrix erstellen return Matrix4x4((Axis.x * Axis.x) * (1.0f - Cos) + Cos, (Axis.x * Axis.y) * (1.0f - Cos) - (Axis.z * Sin), (Axis.x * Axis.z) * (1.0f - Cos) + (Axis.y * Sin), 0.0f, (Axis.y * Axis.x) * (1.0f - Cos) + (Axis.z * Sin), (Axis.y * Axis.y) * (1.0f - Cos) + Cos, (Axis.y * Axis.z) * (1.0f - Cos) - (Axis.x * Sin), 0.0f, (Axis.z * Axis.x) * (1.0f - Cos) - (Axis.y * Sin), (Axis.z * Axis.y) * (1.0f - Cos) + (Axis.x * Sin), (Axis.z * Axis.z) * (1.0f - Cos) + Cos, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); }
-
Soweit ich das sehe ist es die gleiche Berechnung. Wie ist es bei deiner Engine?
Wenn du
Matrix4x4::RotationAxis(VECTOR3D(0,0,0),0);
machst?
Kann man das Objekt am Weltnullpunkt sehen. Bei mir ist er erst sichtbar wenn ich einen der Werte x,y oder z ändere. Dann ist das Objekt auf einmal sichtbar.
-
Klar, dass das Probleme gibt. Denn (0, 0, 0) ist ja keine Achse. Der Achsenvektor sollte normalisiert sein.