2016-04-08 24 views
1

Ich versuche, ein Objekt um 45 Grad mit Quaternionen über Y-Achse zu drehen. Nachdem ich das Quaternion spezifiziert habe, versuche ich die Rotationsmatrix zu bekommen. Aber die Werte, die ich sehen, sind falschQuaternion zu Rotationsmatrix, falsche Werte mit Eigenbibliothek

Eigen::Quaterniond q; 
q.x() = 0; 
q.y() = 1; 
q.z() = 0; 
q.w() = PI/8; // Half of the rotation angle must be specified, even IDK why 

Eigen::Matrix3d R = q.normalized().toRotationMatrix(); 
std::cout << "R=" << std::endl << R << std::endl; 

OUTPUT:

R= 
-0.732 -0 -0.680 
    0  1  -0 
0.680  0 -0.732 


Da die OpenGL Rotation Matrix entlang der Y-Achse sollte sein:

enter image description here

Daher meine erwartete Ausgabe sollte sein:

R= 
0.707  0 0.707 
    0  1  0 
-0.707  0 0.707 

Nicht nur sind die Werte um ein kleines Prozent deaktiviert, die falschen Zeichen auf den Werten verursachen einige unerwartete Rotationen. Wegen der negativen Vorzeichen macht mein Würfel eine 180 Grad Drehung plus den angegebenen Winkel. Ich habe mir den ganzen Tag über den Kopf gebrochen. Kann mir jemand sagen, was ich falsch mache?

+0

45 Grad 'pi/4' – Rostislav

+0

Ich weiß nicht, hocken über Quaternionen, aber ich weiß, dass die/8 entspricht 22,5 °. 45 ° ist/4. – Logicrat

+0

@Logicrat Auch ich weiß nicht warum, aber Sie müssen die Hälfte des Winkels angeben. Also wenn ich um 'PI/4 'rotieren muss, muss ich es als' PI/8' spezifizieren. –

Antwort

8

Die Art, wie Sie Ihre Quaternion initialisieren, ist falsch. Wenn Sie direkt die Koordinaten quaternion initialisieren, sollten Sie die definition berücksichtigen:

enter image description here

Alternativ kann die Quaternion Klasse in Eigen einen Konstruktor aus einem axis-angle representation zur Verfügung stellt.

Dieser Code:

#include <Eigen/Geometry> 
#include <iostream> 

void outputAsMatrix(const Eigen::Quaterniond& q) 
{ 
    std::cout << "R=" << std::endl << q.normalized().toRotationMatrix() << std::endl; 
} 

void main() 
{ 
    auto angle = M_PI/4; 
    auto sinA = std::sin(angle/2); 
    auto cosA = std::cos(angle/2); 

    Eigen::Quaterniond q; 
    q.x() = 0 * sinA; 
    q.y() = 1 * sinA; 
    q.z() = 0 * sinA; 
    q.w() = cosA;  

    outputAsMatrix(q); 
    outputAsMatrix(Eigen::Quaterniond{Eigen::AngleAxisd{angle, Eigen::Vector3d{0, 1, 0}}}); 
} 

Ausgänge, was Sie erwarten:

R= 
0.707107   0 0.707107 
     0   1   0 
-0.707107   0 0.707107 
R= 
0.707107   0 0.707107 
     0   1   0 
-0.707107   0 0.707107