将四元数转换为欧拉角。 Y角度范围的问题

时间:2013-01-21 21:15:52

标签: c++ math 3d irrlicht ode-library

我正在尝试使用Irrlicht作为图形引擎和物理ODE在C ++中编写3D模拟。然后我使用函数将ODE四元数转换为Irrlicht Euler角度。为了做到这一点,我正在使用此代码。

void QuaternionToEuler(const dQuaternion quaternion, vector3df &euler)
{
    dReal w,x,y,z;

    w = quaternion[0];
    x = quaternion[1];
    y = quaternion[2];
    z = quaternion[3];

    double sqw = w*w;    
    double sqx = x*x;    
    double sqy = y*y;    
    double sqz = z*z; 

    euler.Z = (irr::f32) (atan2(2.0 * (x*y + z*w),(sqx - sqy - sqz + sqw)) * (180.0f/irr::core::PI));
    euler.X = (irr::f32) (atan2(2.0 * (y*z + x*w),(-sqx - sqy + sqz + sqw)) * (180.0f/irr::core::PI));          
    euler.Y = (irr::f32) (asin(-2.0 * (x*z - y*w)) * (180.0f/irr::core::PI));

}

它可以正确绘制正确的位置和旋转,但asin指令会出现问题。它只返回0..90 - 0..-90范围内的值,我需要从0..360度获得范围。当我致电0..360时,至少我需要在node->getRotation().Y范围内获得轮换。

1 个答案:

答案 0 :(得分:1)

想想地球的全球。其上的每个点只能在纬度(范围[-90, 90])和经度(范围[-180, 180])中定义。因此,可以使用这些角度指定球体上的每个点。现在球体上的一个点指定一个向量,球体上的所有点都指定所有可能的向量。正如this article中指出的那样,您使用的公式将生成所有可能的方向。

希望这有帮助。