2016-04-08 2 views
1

私は、Y軸に関する四元数を使用してオブジェクトを45度回転しようとしています。 四元数を指定した後、私は回転行列を取得しようとしています。しかし、私が見るの値が間違ってい回転行列に対するクォータニオン、固有ライブラリを使用した不正確な値

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 


Y軸に沿ってOpenGLの回転マトリックスである必要がありますので:

enter image description here

ので、私の期待される出力は:

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

値が小さいだけでなく値の誤った記号が予期しない回転を引き起こしているだけでなく、負のサインのために、私の立方体は180度の回転に指定された角度を加えています。私は一日中これ以上頭を痛めた。私が間違っていることを教えてくれる人もいますか?

+0

45度 'パイ/ 4' – Rostislav

+0

である私は、四元についてスクワット知らないが、私はその/ 8を知っていますか22.5°に相当する。 45°は/ 4である。 – Logicrat

+0

@Logicratなぜか分かりませんが、角度の半分を指定する必要があります。だから私が 'PI/4'で回転させなければならない場合、私は' PI/8'と指定しなければなりません。 –

答えて

8

四元数を初期化する方法が正しくありません。あなたが直接四元の座標を初期化する場合は、あなたのアカウントにdefinitionを取る必要があります。

enter image description here

また、固有でQuaternionクラスはaxis-angle representationからコンストラクタを提供します。

このコード:あなたは何を期待

#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}}}); 
} 

出力:

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 
関連する問題