Drehung mit Quaternion um Lokale Achsen



  • Liebe Community,

    Bei der Programmierung einer Flugzeug-Motion Simulation mit Quaternionen bin ich auf einen Fehler gestoßen, und komme nicht auf seine Lösung.

    und zwar berechne ich die Drehung des Richtungsvektors bei Tastendruck mittels der Quaternionen Rotation " w= qvq* "

    Vektor4 Kollision::Rotation(Vektor4 OV, float phi, Vektor4 v)
    {
    
    Vektor4 a,b,c,cross,newvek;
    
    Move = LocalRotation(OV,phi);
    
    float fak1 = Move.w*Move.w - Norm(Move)*Norm(Move);
    
    	a.w = 0;
    	a.x = fak1 * v.x;
    	a.y = fak1 * v.y;
    	a.z = fak1 * v.z;
    
    	b.w = 0;
    	b.x = 2 * Move.x * v.x * Move.x;
    	b.y = 2 * Move.y * v.y * Move.y;
    	b.z = 2 * Move.z * v.z * Move.z;
    
    	cross = CrossProduct(Move,v);
    
    	c.w = 0;
    	c.x = 2 * Move.w * cross.x;
    	c.y = 2 * Move.w * cross.y;
    	c.z = 2 * Move.w * cross.z;
    
    	newvek.w = 0;
    	newvek.x = a.x + b.x + c.x;
    	newvek.y = a.y + b.y + c.y;
    	newvek.z = a.z + b.z + c.z;
    
    	return SetZero(newvek);
    }
    
    Vektor4 Kollision::LocalRotation(Vektor4 Achse, float phi)				
    {
    	Vektor4 Rotate;
    	Rotate.w = cos(phi / 2);
    	Rotate.x = Achse.x * sin(phi / 2);
    	Rotate.y = Achse.y * sin(phi / 2);
    	Rotate.z = Achse.z * sin(phi / 2);
    	return Rotate;
    }
    

    Das funktioniert auch alles soweit solange ich um eine Achse rotiere. Bei der Rotation um eine weitere Achse jedoch dreht er um die Achse im Globalen System (z.B. Drehung um den Gierwinkel nach Links, Rollen des Flugzeugs im Anschluss). somit entsteht bei dem Beispiel anstatt einer Rolle, eine Nickbewegung.
    wie also krieg ich es hin, die Drehung im Lokalen Koordinatensystem ausführen zu lassen und den Richtungsvektor im Anschluss im GLobalen System.

    Ich bedanke mich schonmal für die Hilfe 🙂
    Smörsch



  • Da mir dein cod danke der gewählten Variablennamen zu kryptishc ist, hier nur ein Allgemeinplatz:

    Du musst natürlich beachten, dass sich nach einer Drehung deines lokalen Koordinatensystems die Achsen in disem System ebenfalls ändern.



  • Genau das ist das Problem. Wie berücksichtige ich das? es wird wohl eine einfache Methode geben dies umzusetzen, da eine drehung um die globalen Achsen ja selten Sinn macht.

    Ich hoffe das Problem ist verstanden. Ich brauche den Richtungsvektor (Quasi die Richtung der X-Achse des Lokalen Koordinatensystems) im Globalen KOS. Die Drehung jedoch wird im Lokalen System duchgeführt. (Sprich: wenn ich mich um die Z-Achse drehe, und im Anschluss das Flugzeug eine Rollbewegung machen soll, soll sich der Richtungsvektor nicht ändern, da er um die Lokale x-Achse ja drehen soll, was dem Richtungsvektor entspricht)

    Prinzipiell beschreibt mein code nichts anderes als die Erstellung das Quaternions
    mittels "LocalRotation" und im Anschluss darauf die Rechnung "newvek = Q*v*Q´"
    Q = Quaternion, v = Richtungsvektor , Q` konjugierte des Quaternions Q.





  • Vielen Dank,

    ES war nicht der letzte Beitrag der mir geholfen hat, sondern ein Link der Mitten drin erwähnt wurde 🙂
    Ich hab die Ortsvektoren nicht ordentlich mitgedreht.
    Vielen dank nochma 🙂


Log in to reply