2017-12-02 32 views
0

쿼터니언을 구현할 때 어떤 문제가 있습니까? 나는 그들이 여전히 짐벌 자물쇠와 모든 것을 가진 오일러처럼 행동한다고 ​​생각합니다.쿼터니언은 오일러와 같은 역할을합니다

Quaternionf rotations = makeQuaternion(new Vector3f(1, 0, 0), angles.x); 
      rotations.mul(makeQuaternion(new Vector3f(0, 1, 0), angles.y)); 
      rotations.mul(makeQuaternion(new Vector3f(0, 0, 1), angles.z)); 

Matrix4f matrix = new Matrix4f(); 

matrix.translate(position); 
matrix.rotate(rotations); 
matrix.scale(scale); 

angles에는 오일러 각이 있습니다. 사람들은 항상 내가 그 (것)들을 전혀 사용하면 안된다고 말하지만 나는 어떻게 내가 4 원의 가치를 바꿀 것인지 전혀 모른다. 그리고 나는 Quaternionf rotations이 맞다고 생각합니다. 예 : 각도가 0, 90, 0 인 경우 쿼터니온은 0.00, 0.707, 0.00, 0.707 (x,y,z,w)을 포함합니다. 어느 것이 맞습니까?

그래서 문제가 어디에 있습니까? 나는이 주제에 관해서 내가 발견 한 모든 것을 읽었지만 명확하게 이해하지 못한다.

는 편집 :

private static Quaternionf makeQuaternion(Vector3f n, float a) { 

    float w, x, y, z; 

    a = a/360 * (float) Math.PI * 2; 

    w = (float) Math.cos(a/2); 

    x = (float) (n.x * Math.sin(a/2)); 
    y = (float) (n.y * Math.sin(a/2)); 
    z = (float) (n.z * Math.sin(a/2)); 

    Quaternionf quaternion = new Quaternionf(x, y, z, w); 

    return quaternion; 

} 
+0

* "쿼터니언을 구현하는 데 문제가 있습니까?"* * 당신이 쿼터니언을 구현하지 않았기 때문에 우리는 말할 수 없습니다. – luk2302

+0

@ luk2302 글쎄, 그게 가장 중요한 부분이라고 생각해. 나는 당신에게'makeQuaternion' 함수를 줄 수 있지만, 내가 말했듯이 그것이 올바른 결과를 줄 것이라고 생각합니다. – Maineri

+0

쿼터니언을 정규화하고 있습니까? –

답변

1

는 사원 수는 매우기만적인 것 그리고 그들을 위해 단단한 느낌을 얻을 매우 어렵습니다.

먼저, 이미 읽은 리소스가있을 수 있습니다. 사원 수에 대한 위키 백과 페이지는 방정식을위한 훌륭한 자원이다 : https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

나는 또한 사원 수에 대한 기본 사항에 대한 블로그 포스트를 가지고 무엇을 내가 그들에게 느낌을 얻을 도움 : https://blog.mide.com/quaternions-for-orientation

이 있습니다를 makeQuaternion에서 이상하게 보일 수있는 것들은 거의 없으며, 잘못 사용하거나 다른 장소에 조각을 적용하는 것이 명확하지 않습니다.

quaternion equation 여기

는, A는 단일 축을 중심으로 총 회전을 한 경우 적용됩니다 회전은 회전 총 각도, 그리고 :

당신이 구현하고있는 방정식은 Bx, By, Bz는 방향 각입니다. 원점을 가리키는 벡터를 나타내는 방향 각의 코사인 값의 제곱의 합은 1이어야합니다 (즉 cos^2 Bx + cos^2 By + cos^2 Bz = 1).

n.x, n.y, n.z를 사용하면 제곱의 합이 1 = 1, 즉 단위 구상의 포인트가되어야하는 한 계속 작동합니다. A와 방향 각 사이에는 비슷한 관계가 있지만 쿼터니온의 제곱의 합이 1인지 확인하는 가장 쉬운 방법은

+0

2 쿼터니온이 있습니다. 하나는 객체의 방향이고 다른 하나는 현재 방향 변경을 포함하는 임시 객체입니다. 임시 객체의 x + y + z + w는 정규화 후에 1.01과 같고 주 객체는 -2와 2 사이에서 점프합니다.이 두 쿼터니언은 함께 곱 해집니다. – Maineri

+0

makeQuaternion을 사용하고 결과가 -2에서 +2이면 a 및 n 값이 부당하다는 것을 의미합니다. n 값이 cosine 제곱 검정 합을 통과하면 a 값이어야합니다. 1.01은 반올림 오류 일뿐입니다 또한 ijk 벡터를 사용하여 올바르게 곱해야합니다. Q1이 X = 1이고 Q2가 Y = 1이면 Q1 * Q2 = (Z = 1) – pscheidler

+0

무엇이되어야합니까? 그들은 그 각도가 0과 360 사이에 있다는 것을 내가 따라 잡을 뿐이다. 그리고 축의 값은 0과 1 사이이다. y 축을 중심으로 90도 회전 : makeQuaternion (새 Vector3f (0, 1, 0), 90). – Maineri