2013-06-16 3 views
2

X 축에 추가 된 회전과 Y 축에 추가 된 쿼터니온을 생성하고 이러한 회전을 하나의 쿼터니언으로 결합하는 사용자 마우스 입력에서 생성 된 약간의 변경 사항이있는 쿼터니언을 전파합니다. 이 변경 사항을 카메라 쿼터니언에 계속 추가 (추가)하여 잠김 현상이없는 카메라 (여전히 미친 듯이 굴러 다니고 있습니다.) :Quaternion 인스턴트 숫자 드리프트

카메라 회전을 시작하면 회전 매트릭스가 비뚤어지고 비뚤어지기 시작합니다. 통제 불능. 매 프레임마다 카메라 쿼터니온을 표준화 할 때 모든 것이 잘 작동하지만 모든 프레임을 정규화해서는 안됩니다. 이것이 수치 드리프트라면 너무 빨리 볼 수 없습니까? 이 질문에

:

정상화 단위 3 영역으로 다시 사원 수를 드래그하는 kludge입니다 : Quaternion and normalization

데이비드 Hammen이 댓글을 기록했다. 쿼터니언이 매니 폴드에서 표류하는 이유는 오일러 단계가 의미 상으로는 수학적으로 유효하지 않기 때문입니다. 단위 쿼터니언은 대수가 아닌 그룹입니다. 유닛 쿼터니언을 사용하지 않으면 도 유효하지 않습니다. 이제는 차트가 없습니다 (3). 올바른 작업 (예 : 거짓말 그룹 통합 기법)과 쿼터니언은 상당 부분 매니 폴드에 머물러 있습니다. 가끔씩 정상화해야 할 수도 있습니다.

저는 이것이 오일러 회전에서 2 쿼터니온을 생성하기 때문에 이것이 과도한 회전 오류의 원인이 될 수 있습니까?

오일러 회전에서 생성 된 쿼터니언은 항상 사용 전에 정규화해야합니까?

답변

0

먼저 쿼터니언이 NONUnit이되어 있는지 확인하십시오. 그 문제의 근원.

나는 의사에 nonunit 사원 수의 행렬 강력한 변환을 사용하는 것이 좋습니다

inline void to_matrix(matrix33& m )const { 
     float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2; 
     float s = 2.0f/norm_2_sqr(); 
     x2 = x * s; y2 = y * s; z2 = z * s; 
     xx = x * x2; xy = x * y2; xz = x * z2; 
     yy = y * y2; yz = y * z2; zz = z * z2; 
     wx = w * x2; wy = w * y2; wz = w * z2; 

     m.m[0][0] = 1.0f - (yy + zz); 
     m.m[0][1] = xy - wz; 
     m.m[0][2] = xz + wy; 

     m.m[1][0] = xy + wz; 
     m.m[1][1] = 1.0f - (xx + zz); 
     m.m[1][2] = yz - wx; 

     m.m[2][0] = xz - wy; 
     m.m[2][1] = yz + wx; 
     m.m[2][2] = 1.0f - (xx + yy); 

     //1 division 16 multiplications 15 addidtions 12 variables 
    }