Quick Reference
단위 쿼터니언은 3차원 순수 회전을 네 성분으로 저장합니다. 오른손 좌표계에서 벡터를 실제로 돌리는 Hamilton 곱을 사용하며, 성분 순서는 실수부가 앞인 q=(w,x,y,z)로 고정합니다.
단위 축 u, 회전각 θ:
q = (cos(θ/2), u sin(θ/2))
‖q‖² = w²+x²+y²+z² = 1
벡터 v의 회전: (0,v′) = q (0,v) q⁻¹
q₁ 다음 q₂ 적용: q합성 = q₂ q₁
항등 회전: (1,0,0,0)
q와 -q는 같은 회전네 성분과 Hamilton 곱
q=(w,b)에서 w는 실수, b=(x,y,z)는 세 벡터 성분입니다. 쿼터니언의 네 성분은 일반 4차원 벡터처럼 더할 수 있지만 곱셈은 별도로 정의합니다. i²=j²=k²=−1, ij=k, jk=i, ki=j이며 역순 곱은 부호가 반대입니다.
p=(a,u), q=(b,v)
pq = (ab-u·v, av+bu+u×v)예를 들어 ij=k이고 ji=−k이므로 곱은 교환되지 않습니다. 이 성질이 3차원 회전의 적용 순서와 맞아떨어집니다. 공식의 외적 방향과 q의 성분 순서를 API의 저장 배열 순서와 혼동하지 않습니다. API가 (x,y,z,w)를 사용한다면 입출력 위치를 그 규약에 맞춰야 합니다.
켤레와 벡터 회전
켤레는 q*=(w,−x,−y,−z)이며 qq*=‖q‖²입니다. 영쿼터니언이 아니면 q⁻¹=q*/‖q‖²이고, 단위 쿼터니언일 때에만 q⁻¹=q*로 단순해집니다.
단위 q=(w,b)에 대해 q(0,v)q*를 전개하면 벡터 부분을 내적·외적으로 쓸 수 있습니다.
v′=(w²-b·b)v + 2(b·v)b + 2w(b×v)
q=(cos(θ/2),u sin(θ/2)), ‖u‖=1을 대입하면:
v′=cosθ v + (1-cosθ)(u·v)u + sinθ(u×v)이는 Rodrigues 공식과 같습니다. 두 번의 쿼터니언 곱에서 두 배 각도 관계가 생기므로 축각을 저장할 때 θ/2를 사용합니다. (0,v)는 실수부 0인 순허수 쿼터니언이며, 동차좌표의 (v,0)과 목적·곱셈이 다릅니다.
z축으로 90° 회전:
q=(√2/2,0,0,√2/2)
v=(2,0,1)
v′=(0,2,1)
회전축에 평행한 z성분은 유지q의 길이가 1이 아닌데 q를 역원처럼 쓰면 q(0,v)q에 ‖q‖²배 크기 변화가 섞입니다. 일반 역원을 정확히 사용하면 비영 쿼터니언의 크기는 상쇄되지만, 회전 저장과 최적화된 공식에서는 단위 입력을 유지하는 편이 일관됩니다.
합성 순서
q₁으로 돌린 결과에 q₂를 적용하면 q₂(q₁vq₁⁻¹)q₂⁻¹=(q₂q₁)v(q₂q₁)⁻¹입니다. 순서가 바뀌지 않는 이유는 역원의 순서가 반대로 뒤집히기 때문입니다.
qx=(√2/2,√2/2,0,0) : x축 90°
qy=(√2/2,0,√2/2,0) : y축 90°
qy qx=(1/2,1/2,1/2,-1/2)
qx qy=(1/2,1/2,1/2, 1/2)
v=(1,0,0)
qx 다음 qy → (0,0,-1)
qy 다음 qx → (0,1,0)물체의 로컬 방향을 월드 방향으로 보내는 q를 저장한다면 월드 축 기준 추가 회전 Δq는 Δq q, 로컬 축 기준 추가 회전은 q Δq로 합성합니다. 이는 지금 정한 능동 회전·열벡터 규약의 결과입니다.
회전행렬로 바꾸기
단위 q=(w,x,y,z)에 대응하는 3×3 행렬은 다음과 같습니다. 같은 공간의 열벡터 v에 Rv를 적용합니다.
R = [ 1-2(y²+z²) 2(xy-wz) 2(xz+wy) ]
[ 2(xy+wz) 1-2(x²+z²) 2(yz-wx) ]
[ 2(xz-wy) 2(yz+wx) 1-2(x²+y²) ]
q=(√2/2,0,0,√2/2)이면
R = [ 0 -1 0 ]
[ 1 0 0 ]
[ 0 0 1 ]쿼터니언은 회전만 나타내므로 이동·비균일 스케일·전단을 네 성분에 넣지 않습니다. 이 요소들과 결합할 때에는 아핀 변환의 행렬을 구성합니다. 반대로 임의의 스케일·반사 행렬을 순수 회전행렬처럼 쿼터니언으로 변환해서는 안 됩니다. 행렬에서 쿼터니언을 복원하는 분기와 수치 처리는 출처의 변환 설명을 참고합니다.
부호와 정규화의 경계
q와 −q는 양쪽 곱의 두 음수가 상쇄되어 같은 회전을 나타냅니다. 따라서 성분이 다르다는 사실만으로 자세가 다르다고 판단할 수 없습니다. 단위 q₀,q₁에 대해 |q₀·q₁|=1이면 같은 자세이며, 실제 계산에서는 허용 오차를 둡니다.
단위 q에서 필요하면 θ=2 atan2(‖b‖,w), u=b/‖b‖로 축각을 읽습니다. q의 부호를 w≥0으로 선택하면 θ를 0부터 π까지로 제한할 수 있습니다. 항등 회전에서는 b=0이어서 축이 정해지지 않으므로 나누지 않습니다. π 회전에서는 축의 부호가 중복됩니다.
연속된 자세를 저장할 때 매번 w≥0으로 강제하면 π 근처에서 성분 부호가 급변할 수 있습니다. 시간에 따른 부호 선택은 SLERP의 최단 경로 처리와 맞춥니다. 반복 곱에서 누적된 길이 오차는 정규화로 보정하되, 길이가 0이거나 유효하지 않은 입력은 정규화로 복구할 수 없습니다. 오일러각의 짐벌락을 피하는 저장 표현이어도 자세만으로 여러 바퀴의 회전 이력을 알 수는 없습니다.
참고 링크
2 sources