我正在嘗試使用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