in 포스트

쿼터니언 연산 순서가 직관과 반대인 이유

이메일로 왔던 질문의 답인데, 추후 책에 반영하기 위해 메모…

회전 연산에서 회전 A와 회전 B가 있을 때, 회전 A가 적용된 상태에서 회전 B가 적용된 것을 표현하려면, 전역 좌표계에서 회전B를 먼저 적용하는 것이 맞습니다. 

A 회전을 적용하고 B 회전을 적용하는 것이, B회전을 먼저 좌표계에 곱하고 A회전을 곱하는 것으로 표현되는지 쿼터니언 연산 공식을 통해 설명할 수 있겠습니다.

벡터 v 가 있고 회전을 표현하는 쿼터니언 행렬 q가 있을때,vq 를 벡터 v를 q로 회전한 벡터라고 하겠습니다.

이를 공식으로 나타내면 vq = qvq-1 가 됩니다.

위 공식을 알고 있는 상태에서, 회전 A와 회전 B가 모두 적용된 전체 회전을 W 회전이라고 하겠습니다.

W 회전은 A회전이 부모로서 먼저 반영되고, B 회전이 A 회전의 자식으로 반영된 회전입니다. 기호로는 qw로 나타내겠습니다.

  •  vw = qwvqw-1 

qw 는 회전 A 와 회전 B를 적용한 것이므로 qw  = qa qb 라고 할수 있습니다.

따라서 위 식을 각각 회전 A와 회전 B로 다시 나타내면 다음과 같습니다.

  •  vw = qwvqw-1 = (qa qb)v(qa qb)-1 

여기서 qwvqw-1 = (qa qb)v(qa qb)-1 에서 괄호로 묶은 역행렬을 풀어주면 다음과 같이 표현됩니다. 

  • qwvqw-1 = (qa qb)v(qb) -1(qa) -1
  • 참고 : (AB) -1 = B-1 A-1

그런데 행렬 곱셈 연산은 결합법칙이 성립하므로, 괄호 위치를 옮겨줄 수 있습니다.

괄호를 다시 묶어주면 다음과 같습니다.

  •  qwvqw-1 = qa (qb v qb-1)  qa -1 

여기서 괄호로 묶인  (qb v qb-1) 를 유심히 살펴봐주세요. 

쿼터니언 회전 q를 v 벡터에 반영하면  vq = qvq-1 로 표현됩니다. 

즉 (qb v qb-1) 는 v 벡터를 qb로 회전한 결과인 vb 입니다.

 qwvqw-1 = qa (qb v qb-1)  qa -1  = qa (vb) qa -1   

즉 위에서 보듯이 먼저 vb가 계산됩니다.

그리고 qa (vb) qa -1  에서 vb 를 어떤 벡터 i라고 치환하면,qa i qa -1  가 됩니다.

vq = qvq-1 에서 qvq-1  부분과 형태가 똑같으므로, qa i qa -1  는 벡터i를 a로 회전한 것임을 바로 알 수 있습니다.

그런데 벡터 i는 벡터 v를  회전 b로 회전한 것입니다.

따라서..

  •  qwvqw-1 = qa(qb v qb-1) qa -1
    = qa (v를 b로 회전한것) qa -1
    = qa (vb) qa -1  = (v를  b로 회전한것)을 a로 회전한것

..이라는 관계가 성립합니다. 감사합니다.