2012-10-15 81 views
1

我在過去幾天一直在OpenGL和JBullet中混戰。經過許多修補之後,我終於設法修復了JBullet中的一些錯誤,並使其可用於一些演示。我目前有問題,我不能設法翻譯成度轉換,到目前爲止,我已經受夠了四元數的最好成績,爲弧度用下面的代碼:(Java)將四元數轉換爲弧度(或度)?

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度的任何地方。

+0

這是一個有點很難理解你打算做什麼,什麼是問題...... –

+0

所以你得到弧度三個角度,並且你想要將它們轉換成度?用弧度乘以180 /π得到角度。 – Jesper

+0

@AkiSuihkonen我打算在一個四元數上轉換成Degrees或Radians(因爲兩者之間的轉換相當簡單)。 –

回答

1

我真的不知道這是你想要的,但是從GLM :: GTX ::四元數:

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);