我有一个Ogre :: Matrix4,我想获得此旋转的四元数。 为此,我使用了extract3x3Matrix函数,然后将其转换为四元数,这给了我一个响应。然后,我使用Ogre :: Matrix4的分解函数,这给了我另一个四元数。 两个四元数不同。 这怎么可能 ?
在应用分解功能之前,我要确保变换是仿射的。
Ogre::Matrix4 car_T_tracker( 0.0124343, -0.04752782, 1.010372, -1400.69,
0.3480031, -0.9485609, -0.04890297, 647.4758,
-0.9497393, -0.3481936, -0.004690885, 1441.177,
0, 0, 0, 1);
Ogre::Matrix3 rotation_car_T_tracker;
car_T_tracker.extract3x3Matrix(rotation_car_T_tracker);
Ogre::Quaternion q;
q = car_T_tracker.extractQuaternion();
std::cout << "quaternion x : " << q.x << std::endl;
std::cout << "quaternion y : " << q.y << std::endl;
std::cout << "quaternion z : " << q.z << std::endl;
std::cout << "quaternion w : " << q.w << std::endl;
Ogre::Vector3 translation_car_T_tracker;
Ogre::Vector3 scale_car_T_tracker;
Ogre::Quaternion quaternion_car_T_tracker;
if(car_T_tracker.isAffine())
{
car_T_tracker.decomposition (translation_car_T_tracker,scale_car_T_tracker,quaternion_car_T_tracker);
}
else
{
translation_car_T_tracker = Ogre::Vector3::ZERO;
scale_car_T_tracker = Ogre::Vector3::ZERO;
quaternion_car_T_tracker = Ogre::Quaternion::ZERO;
}
std::cout << "translation : " << translation_car_T_tracker << std::endl;
std::cout << "scale : " << scale_car_T_tracker << std::endl;
std::cout << "quaternion : " << quaternion_car_T_tracker << std::endl;
quaternion_car_T_tracker和q不是相同的四元数,但它们应该是相同的。