출처 What Can I Do For U? | happypcb
원문 https://blog.naver.com/happypcb/90005534378
Quaternion
개발관련/수학 2006/04/01 11:54
쿼터니언(사원수). 이 놈을 제대로 알지도 못하면서 너무 오랫동안 써왔다.
오일러각 표현 처럼 짐벌락 문제가 없기 때문에 캐릭터 애니메이션 부터 아크볼까지 많은 부분에서 사용되는 사원수.
단지 회전축과 회전량을 표현한다는 것만 알고 있었을 뿐 D3DX 에서 제공하는 함수들만 사용하면서 그냥 그런 블랙박스였다. -_-;
이렇게 원리를 모르고 사용하는 것에 대한 문제점은,
단지 정형화된 사용법에만 익숙해지고 새로운 응용법이나 약간만 꼬아놓아도 이해를 하지 못한다는 것이다. 이렇게 얇팍해서는 안된다.
최근에 이것저것 공부하면서 이제서야 사원수에 대해서 조금 알 것 같은데 간단하게 여기에다가 정리해 보도록 한다.
사원수의 연산 및 성질 등등은 인터넷이나 각종 책을 찾아보면 너무 잘 나와있으므로 생략하고, 도대체 사원수가 기하학적으로 무슨 뜻인지. 어떻게 회전이 일어나는 것인지에 대해 의미론적으로 혼자 정리해봤다.
일단 사원수는 다음과 같이 정의된다.
식(1)
$$Q = q_0 + q_1*i + q_2*j + q_3*k$$ 위의 정의에서 i, j, k 는 허수이고 $q_0~q_3$ 는 실수이다. 즉, 허수부 3개와 실수부 1개로 이루어져 있다.
이것은 기하학적으로, Q가 단위 사원수 일때(Q 의 $q_0~q_3$ 으로 이루어진 벡터의 길이가 1) 다음과 같이 표현할 수 있다.
식(2)
$$Q = sin(theta)*U + cos(theta)$$ 자아, 과연 식(1) 과 식(2) 모두 쿼터니언을 표현하는 거라는데 두 개가 겉보기엔 전혀 틀리구만 도대체 뭐가 같다는 걸까.
내가 헷갈렸던..
식(2) 에서 U 는 벡터를 의미한다.
무슨 벡터인가 하면 사원수 Q로 어떤 점을 회전 변환 시킬 때 회전 축이 되는 단위벡터 U 를 말한다.
theta 는 회전 각으로써 위의 식(2) 대로라면
그럼 식(1) 과 식(2) 가 같은 의미인데, 식(1) 에 있는 허수 $i, j, k$는 어디로 갔는가?
그렇다. 식(2) 에는 허수가 없다.
식(2)는 허수를 뺀 쿼터니언의 표현이다. 즉, 회전축 U 와 회전각 2*theta 가 있다면 식(2)를 세울 수 있고 식(2)를 세웠다면 회전축이 있는 부분의 각 x, y, z 부분에 허수를 붙여놓으면 식(1)을 세울 수 있게 된다.
두 가지는 같은 사원수를 표현하면서도 약간 용도가 틀리다.
식(1) 은 사원수끼리의 연산을 할 때 쓰이는 식이며 식(2)는 기하학적으로 의미를 부여한 식이다. 즉, 식(2)는 실제 회전축과 회전량을 표현하는 식인 것이다.
사원수를 이용해서 3차원 상의 어떤 점 P(x, y, z)을 회전 변환하고 싶다면 식(1)의 형태로 다음과 같이 하면 된다.
$P = x*i + y*j + z*k$ -> 어떤 점 P 를 실수부가 0 인 Pure Quaternion 으로 바꾼다.
$Rotation_by_q(P) = q * p * q$의 켤레 사원수
실제 게임 프로그램 안에서는 변환이 쿼터니언이 아닌 4 by 4 행렬로 표현되므로 위의 식을 행렬로 바꾸는 방법이 있다.
(GPG 1권 2.8 행렬-사원수 변환 참조, 또는 Real-Time Rendering 2판 3.3 사원수 참조)
사원수에서의 허수는 자기 자신을 제곱하면 -1 이 된다는 것 이외에,
사원수를 발견한 William Rowman Hamilton 이란 사람이 고안한 독특한 법칙이 적용된다.
이 법칙은 사원수끼리 곱셈 연산을 할 때 쓰인다.
$$ i * j = k\\ j * k = i\\ k * i = j\\ j * i = -k\\ k * j = -i\\ i * k = -j $$ 희한하게도, $i, j, k$ 가 어떤 3개의 축을 표현하는 기저 벡터라고 생각했을 때 외적의 결과와 같다.
바로 이런 허수의 법칙들 역시 회전 변환에 대해 기하학적으로 관련이 있으나 쿼터니언은 너무 복잡해서 잘 모르겠고 허수부가 하나 존재하는 복소수의 경우엔 어떤 복소수에 허수 i 를 곱할 경우 180도 회전이라는 기하학적인 효과를 낳는다.
즉, 좌표 (1, 0) 을 표현하는 1 + 0*i 라는 복소수에 i 를 곱해보면 무슨 말인지 알 것이다.
다시 정리하자면, 사원수끼리의 곱셈은 해밀턴의 법칙을 사용하여 구현하면 되고,
허수라는 것은 실제로 존재 하는 것이 아닌 하나의 법칙이기 때문에 사원수끼리의 연산에 사용하면 되며 실제 코드에서의 표현은 허수를 제외한 것만으로도 사원수를 구축할 수 있기 때문에 허수를 제외한 사원수의 길이만으로 표현한다.
출처http://hankiya.com/tt/jhk8211/tag/Quaternion?TSSESSION=5266e53c2d6b1a46717df54549b06f83
원문 https://blog.naver.com/happypcb/90005534378
Quaternion
개발관련/수학 2006/04/01 11:54
쿼터니언(사원수). 이 놈을 제대로 알지도 못하면서 너무 오랫동안 써왔다.
오일러각 표현 처럼 짐벌락 문제가 없기 때문에 캐릭터 애니메이션 부터 아크볼까지 많은 부분에서 사용되는 사원수.
단지 회전축과 회전량을 표현한다는 것만 알고 있었을 뿐 D3DX 에서 제공하는 함수들만 사용하면서 그냥 그런 블랙박스였다. -_-;
이렇게 원리를 모르고 사용하는 것에 대한 문제점은,
단지 정형화된 사용법에만 익숙해지고 새로운 응용법이나 약간만 꼬아놓아도 이해를 하지 못한다는 것이다. 이렇게 얇팍해서는 안된다.
최근에 이것저것 공부하면서 이제서야 사원수에 대해서 조금 알 것 같은데 간단하게 여기에다가 정리해 보도록 한다.
사원수의 연산 및 성질 등등은 인터넷이나 각종 책을 찾아보면 너무 잘 나와있으므로 생략하고, 도대체 사원수가 기하학적으로 무슨 뜻인지. 어떻게 회전이 일어나는 것인지에 대해 의미론적으로 혼자 정리해봤다.
일단 사원수는 다음과 같이 정의된다.
식(1)
$$Q = q_0 + q_1*i + q_2*j + q_3*k$$ 위의 정의에서 i, j, k 는 허수이고 $q_0~q_3$ 는 실수이다. 즉, 허수부 3개와 실수부 1개로 이루어져 있다.
이것은 기하학적으로, Q가 단위 사원수 일때(Q 의 $q_0~q_3$ 으로 이루어진 벡터의 길이가 1) 다음과 같이 표현할 수 있다.
식(2)
$$Q = sin(theta)*U + cos(theta)$$ 자아, 과연 식(1) 과 식(2) 모두 쿼터니언을 표현하는 거라는데 두 개가 겉보기엔 전혀 틀리구만 도대체 뭐가 같다는 걸까.
내가 헷갈렸던..
식(2) 에서 U 는 벡터를 의미한다.
무슨 벡터인가 하면 사원수 Q로 어떤 점을 회전 변환 시킬 때 회전 축이 되는 단위벡터 U 를 말한다.
theta 는 회전 각으로써 위의 식(2) 대로라면
회전축 U 에 대하여 2*theta 만큼 움직이는 사원수
가 된다.그럼 식(1) 과 식(2) 가 같은 의미인데, 식(1) 에 있는 허수 $i, j, k$는 어디로 갔는가?
그렇다. 식(2) 에는 허수가 없다.
식(2)는 허수를 뺀 쿼터니언의 표현이다. 즉, 회전축 U 와 회전각 2*theta 가 있다면 식(2)를 세울 수 있고 식(2)를 세웠다면 회전축이 있는 부분의 각 x, y, z 부분에 허수를 붙여놓으면 식(1)을 세울 수 있게 된다.
두 가지는 같은 사원수를 표현하면서도 약간 용도가 틀리다.
식(1) 은 사원수끼리의 연산을 할 때 쓰이는 식이며 식(2)는 기하학적으로 의미를 부여한 식이다. 즉, 식(2)는 실제 회전축과 회전량을 표현하는 식인 것이다.
사원수를 이용해서 3차원 상의 어떤 점 P(x, y, z)을 회전 변환하고 싶다면 식(1)의 형태로 다음과 같이 하면 된다.
$P = x*i + y*j + z*k$ -> 어떤 점 P 를 실수부가 0 인 Pure Quaternion 으로 바꾼다.
$Rotation_by_q(P) = q * p * q$의 켤레 사원수
실제 게임 프로그램 안에서는 변환이 쿼터니언이 아닌 4 by 4 행렬로 표현되므로 위의 식을 행렬로 바꾸는 방법이 있다.
(GPG 1권 2.8 행렬-사원수 변환 참조, 또는 Real-Time Rendering 2판 3.3 사원수 참조)
사원수에서의 허수는 자기 자신을 제곱하면 -1 이 된다는 것 이외에,
사원수를 발견한 William Rowman Hamilton 이란 사람이 고안한 독특한 법칙이 적용된다.
이 법칙은 사원수끼리 곱셈 연산을 할 때 쓰인다.
$$ i * j = k\\ j * k = i\\ k * i = j\\ j * i = -k\\ k * j = -i\\ i * k = -j $$ 희한하게도, $i, j, k$ 가 어떤 3개의 축을 표현하는 기저 벡터라고 생각했을 때 외적의 결과와 같다.
바로 이런 허수의 법칙들 역시 회전 변환에 대해 기하학적으로 관련이 있으나 쿼터니언은 너무 복잡해서 잘 모르겠고 허수부가 하나 존재하는 복소수의 경우엔 어떤 복소수에 허수 i 를 곱할 경우 180도 회전이라는 기하학적인 효과를 낳는다.
즉, 좌표 (1, 0) 을 표현하는 1 + 0*i 라는 복소수에 i 를 곱해보면 무슨 말인지 알 것이다.
다시 정리하자면, 사원수끼리의 곱셈은 해밀턴의 법칙을 사용하여 구현하면 되고,
허수라는 것은 실제로 존재 하는 것이 아닌 하나의 법칙이기 때문에 사원수끼리의 연산에 사용하면 되며 실제 코드에서의 표현은 허수를 제외한 것만으로도 사원수를 구축할 수 있기 때문에 허수를 제외한 사원수의 길이만으로 표현한다.
출처http://hankiya.com/tt/jhk8211/tag/Quaternion?TSSESSION=5266e53c2d6b1a46717df54549b06f83
댓글
댓글 쓰기