コード例 #1
0
    // <!!> Unity本体のToEulerやSpringheadのToEulerとはどう違うのか…?
    Vec3d ToEuler(Quaterniond q)
    {
        double poleCheck = q.X() * q.Y() + q.Z() * q.W();
        double heading;
        double attitude;
        double bank;

        if (poleCheck > 0.499)                 //	north pole
        {
            heading  = 2 * Math.Atan2(q.X(), q.W());
            attitude = 0;
            bank     = 0;
        }
        else if (poleCheck < -0.499)           //	south pole
        {
            heading  = -2 * Math.Atan2(q.X(), q.W());
            attitude = 0;
            bank     = 0;
        }
        else
        {
            heading  = Math.Atan2(2 * q.Y() * q.W() - 2 * q.X() * q.Z(), 1 - 2 * q.Y() * q.Y() - 2 * q.Z() * q.Z());
            attitude = Math.Asin(2 * q.X() * q.Y() + 2 * q.Z() * q.W());
            bank     = Math.Atan2(2 * q.X() * q.W() - 2 * q.Y() * q.Z(), 1 - 2 * q.X() * q.X() - 2 * q.Z() * q.Z());
        }
        //返す値がy, z, xの順
        //return new Vec3d(heading, attitude, bank);
        //返す値がx, y, zの順
        return(new Vec3d(bank, heading, attitude));
    }