1

私はここ数日、OpenGLとJBulletをいじっています。何度もいじくり回した後、私はついにJBulletのかなりの数のバグを修正し、いくつかのデモで使用できるようにしました。私が現在抱えている問題は、翻訳を度に変換することができないということです。これまでのところ、次のコードを使用して、クォータニオンからラジアンに最高の結果が得られています。

public Vector3f getRadians(Quat4f quat) {
    Vector3f v = new Vector3f();
    //float scale = (float) Math.abs(quat.x * quat.y * quat.z); //Apparently the scale of the angle, thought without I get a almost perfect result on the X-Axis
    float angle = (float) Math.abs(Math.acos(quat.w)) * 2.0f;

    v.x = angle * Math.round(quat.x);
    v.y = angle * Math.round(quat.y);
    v.z = angle * Math.round(quat.z);               

    return v;
}

私の唯一の成功はクォータニオンのX軸であり、それは他の軸での変換がないことであることに注意してください。言うまでもなく、0〜6度の範囲でずれています。

4

1 に答える 1

1

これがあなたの望むものかどうかは本当にわかりませんが、glm :: gtx :: quadnerionから:

inline valType roll
(
    detail::tquat<valType> const & q
)
{
    return atan2(valType(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z);
}

template <typename valType> 
inline valType pitch
(
    detail::tquat<valType> const & q
)
{
    return atan2(valType(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z);
}

template <typename valType> 
inline valType yaw
(
    detail::tquat<valType> const & q
)
{
    return asin(valType(-2) * (q.x * q.z - q.w * q.y));
}

したがって、より読みやすい形式で:

float roll = atan2(valType(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z);
float pitch = atan2(valType(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z);
float yaw = asin(valType(-2) * (q.x * q.z - q.w * q.y));
vec3 EulerAngles = vec3(pitch, yaw, roll);
于 2012-10-15T09:34:05.477 に答える