Quaternionen...und Bewegung
-
Hi @all,
Habe beim testen meiner Quaternion-Kamera-Klasse einen Bug gefunden...
Um die Kamera zu bewegen habe ich den Vector der die Bewegungsrichtung ausdrückt, folgendermaßen, mithilfe eines Quaternions gedreht,allerdings funktioniert diese nur bedingt...
zB. drehe ich mich um 180 grad im die X-achse dann wird der Bewegungsvector invertiert?!...Vector3D operator* ( Quaternion const& rhs , Vector3D const& lhs ) { return Vector3D ( lhs.V[0] * (1.0f - 2.0f * (rhs.Q[2] * rhs.Q[2] +rhs.Q[3] * rhs.Q[3])) + lhs.V[1] * (2.0f * (rhs.Q[1] * rhs.Q[2] -rhs.Q[3] * rhs.Q[0])) + lhs.V[2] * (2.0f * (rhs.Q[3] * rhs.Q[1] +rhs.Q[2] * rhs.Q[0])) , lhs.V[0] * (2.0f * (rhs.Q[1] * rhs.Q[2] +rhs.Q[3] * rhs.Q[0])) + lhs.V[1] * (1.0f - 2.0f * (rhs.Q[3] * rhs.Q[3] +rhs.Q[1] * rhs.Q[1])) + lhs.V[2] * (2.0f * (rhs.Q[2] * rhs.Q[3] -rhs.Q[1] * rhs.Q[0])) , lhs.V[0] * (2.0f * (rhs.Q[3] * rhs.Q[1] -rhs.Q[2] * rhs.Q[0])) + lhs.V[1] * (2.0f * (rhs.Q[2] * rhs.Q[3] +rhs.Q[1] * rhs.Q[0])) + lhs.V[2] * (1.0f - 2.0f * (rhs.Q[2] * rhs.Q[2] +rhs.Q[1] * rhs.Q[1])) ); }
Berechnung der Position
Q sei Quaternion und Direction ein objekt der klasse Vector3DPosition -=Q * Direction;
entweder bin ich Betrieb blind oder hab was grundlegendes vergessen....
wäre um einen Rat dankbar..
-
Hat niemand eine idee?
währe über jede Anregung dankbar...
-
ich hab mir auch mal eine Drehung mit quaternionen implementiert. Ich habe umgekehrte Vorzeichen als bei deinem Codeausschnitt:
Vector3D operator* ( Quaternion const& rhs , Vector3D const& lhs ) { return Vector3D ( lhs.V[0] * (1.0f - 2.0f * (rhs.Q[2] * rhs.Q[2] +rhs.Q[3] * rhs.Q[3])) + lhs.V[1] * (2.0f * (rhs.Q[1] * rhs.Q[2] +rhs.Q[3] * rhs.Q[0])) + lhs.V[2] * (2.0f * (rhs.Q[3] * rhs.Q[1] -rhs.Q[2] * rhs.Q[0])) , lhs.V[0] * (2.0f * (rhs.Q[1] * rhs.Q[2] -rhs.Q[3] * rhs.Q[0])) + lhs.V[1] * (1.0f - 2.0f * (rhs.Q[3] * rhs.Q[3] +rhs.Q[1] * rhs.Q[1])) + lhs.V[2] * (2.0f * (rhs.Q[2] * rhs.Q[3] +rhs.Q[1] * rhs.Q[0])) , lhs.V[0] * (2.0f * (rhs.Q[3] * rhs.Q[1] +rhs.Q[2] * rhs.Q[0])) + lhs.V[1] * (2.0f * (rhs.Q[2] * rhs.Q[3] -rhs.Q[1] * rhs.Q[0])) + lhs.V[2] * (1.0f - 2.0f * (rhs.Q[2] * rhs.Q[2] +rhs.Q[1] * rhs.Q[1])) ); }
-
Danke Für den Hinweis...
Nach längeren überlegungen bin ich zum schluss gekommen das hier nicht der fehler liegt...
vielleicht bei meiner Quaternion->Matrix-Konvektion?Matrix4x4 Camera::getMatrix()const { Matrix4x4A M; M[0] = 1.0f - 2.0f * (Q[2] * Q[2] +Q[3] * Q[3]); M[1] = 2.0f * (Q[1] * Q[2] +Q[3] * Q[0]); M[2] = 2.0f * (Q[3] * Q[1] -Q[2] * Q[0]); M[3] =0; M[4] = 2.0f * (Q[1] * Q[2] -Q[3] * Q[0]); M[5] = 1.0f - 2.0f * (Q[3] * Q[3] +Q[1] * Q[1]); M[6] = 2.0f * (Q[2] * Q[3] +Q[1] * Q[0]); M[7] =0; M[8] = 2.0f * (Q[3] * Q[1] +Q[2] * Q[0]); M[9] = 2.0f * (Q[2] * Q[3] -Q[1] * Q[0]); M[10] = 1.0f - 2.0f * (Q[2] * Q[2] +Q[1] * Q[1]); M[11] =0; M[12] =Position.V[0]* M[0] - Position.V[1]* M[4] - Position.V[2] * M[8];//mit minus da sonst entgegengesetzt bewegt wie gedreht wird M[13] =Position.V[0]* M[1] - Position.V[1]* M[5] - Position.V[2] * M[9]; M[14] =Position.V[0]* M[2] - Position.V[1]* M[6] - Position.V[2] * M[10]; M[15] =1; return Matrix4x4(M); }
Ich denke, dabei handelt es sich um ein Problem von gemixter Verwendung von links-rechts-systemen
//EDIT
hmm...fehler gefunden...alle vorzeichen geändert und nun um die position zu bestimmen mit der inversen des Quaternions den richtungs vector gedreht