我正在尝试使用Irrlicht作为图形引擎和物理ODE在C++中编写3D模拟。然后我使用函数将ODE四元数转换为Irrlicht euler角。为了做到这一点,我使用这个代码。将四元数转换为欧拉角。 Y角度范围的问题
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的范围内,当我打电话节点 - > getRotation()。Ÿ
任何一个可以帮我这个好吗?
在'[0°,360°]','sin'取的每个值的两倍,因此存在用于'asin'(反正弦函数)没有合理的方式为0°和360°之间返回值。 – us2012