2016-04-08 12 views
1

Y-Ekseni ile ilgili dörtlü kullanarak bir nesneyi 45 derece döndürmeye çalışıyorum. Quaternion'u Belirttikten Sonra Rotasyon Matrisini almaya çalışıyorum. Ama bakın değerler hatalıQuaternion to Rotation Matrix, Eigen Kitaplığı'nı kullanarak yanlış değerler

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; 

ÇIKIŞ:

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


Y-ekseni boyunca OpenGL Rotasyon Matris olmalıdır beri:

enter image description here

Dolayısıyla benim beklenen çıktı şu olmalıdır:

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

Değerlerin yalnızca küçük bir yüzde değeriyle yanlış değerler üzerindeki değerleri de beklenmedik dönüşlere neden oluyor. Negatif işaretlerden dolayı küpüm 180 derecelik dönüş artı belirtilen açı yapıyor. Bütün gün boyunca kafamı kırdım. Birisi bana neyi yanlış yaptığımı söyleyebilir mi?

+0

45 derece pi/4 ' – Rostislav

+0

Ben quaternions hakkında bodur bilmiyorum, ama o/8 biliyoruz 'dır 22.5 ° 'ye karşılık gelir. 45 °/4. – Logicrat

+0

@Logicrat Neden olduğunu bilmiyorum, ama açıyı belirtmelisin. Yani 'PI/4' ile döndürmek zorunda kalırsam, bunu 'PI/8' –

cevap

8

Dördünüzü başlatmanın yolu yanlış. doğrudan quaternion koordinatlarını başlatırsanız, dikkate definition almalıdır:

enter image description here

Alternatif Eigen içinde Quaternion sınıf bir axis-angle representation bir yapıcı sağlar.

Bu kod: beklediğiniz

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

çıkışlar:

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 
İlgili konular