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
。