2012-10-15 4 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

그래서 라디안으로 3 개의 각도를 얻었습니까? 그리고 각각을 각도로 변환하고 싶습니까? 각 각도를 라디안 단위로 180/π 씩 곱하면 각도를도 단위로 구할 수 있습니다. – Jesper

+0

@AkiSuihkonen 나는 쿼터니온 (Quaternion)에서 도법 (Degree) 또는 라디안 (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);