【发布时间】:2013-01-05 00:30:32
【问题描述】:
我正在尝试使用 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 度中获取一个范围。当我调用node->getRotation().Y 时,至少我需要在0..360 范围内进行轮换。
【问题讨论】:
-
在
[0°,360°]上,sin对每个值取两次,因此asin(反正弦函数)没有明智的方法返回 0° 到 360° 之间的值。
标签: c++ math 3d irrlicht ode-library