kwan's note

쿼터니언(Quaternion) 과 오일러 변환 (euler transform) 본문

graphics VR AR/Computer Graphics -Korea Univ

쿼터니언(Quaternion) 과 오일러 변환 (euler transform)

kwan's note 2021. 6. 27. 16:41
반응형

본 학습노트는 2021년 1학기 고려대학교 한정현 교수님의 컴퓨터 그래픽스 강의를 수강하고 이 내용을 기반으로작성하였습니다.

 

이전시간: https://reminder-by-kwan.tistory.com/138

 

이전에 물체의 회전에 대해 다룬적이 있다.

지금까지는 오일러각(지금까지 사용했던 일반적인 각도)을 이용한 변환을 다루었다. 

world 공간에서 물체의 회전을 다시한번 생각해보자.

위 그림에서는 x축으로 45도, y축으로 60도, z축으로 -45도 회전한 물체를 보았다.

 

지금까지 다루었던 오일러 변환에 대해 다시한번 살펴 보았다. 아무런 문제가 없어 보인다.

 

하지만 아래 그림처럼 회전의 순서에 따라 결과값이 다르게 나타난다.

여기까지 오일러 각도를 이용한 회전을 기억하고 있자.

 

이젠 지금까지와 다른 주제에 대해서 생각해보고자 한다.

지금까지 우리가 다룬 animation은 하나의 결과 장면이다.

 

실제 애니메이션을 만들기 위해서는 초당 20~60 프레임이 필요하다. 최근 게이밍 모니터의 경우 120hz~240hz까지도 표현을 하기 때문에 점점 이러한 기준은 올라가고 있다.

 

즉 1초당 수십 수백개의 scene을 뿌려줘야 한다. 그렇다면 모든 frame을 하나하나 다 작업해야할까?

정답은 아니오다. 모든 장면을 다 작업하는것이 이론적으로는 가능할지 몰라도 매우 복잡한 작업이고 어렵다.

영화와 같은 작업에서라면 그나마 생각해봄직 하더라도 그렇게 하지도 않고 특히나 게임과 같은 실기간 그래픽 처리에서는 불가능에 가깝다.

 

그렇다면 이러한 한계를 극복하기 위해서는 어떻게 해야할까?

우리는 특정 keyframe만 정의하고 이를 interpolate하는 방식으로 해결할 수 있다.

 

위는 이러한 방식으로 2개 키프레임(t0 과 t1)을 이용해 총 5개의 장면을 나타낸 것이다.

중간 이미지들을 interpolate함으로서 구현하였다.

 

이런 방식을 통해서 우리는 몇개의 장면만 가지고 30fps ,60fps의 애니메이션을 만들 수 있다.

 

이제 이를 3차원에서 응용해보자.

위 이미지를 자세히 보면 문제가 생긴다는것을 알 수 있다.

a는 frame0 b는 frame1이고

마지막 c는 이 중간각도를 가진 interpolated 각도이다.

정상적으로 보간되었다면 yz평면 내에서 움직여야하는데 c는 그렇지 않다.

이러한 문제점을 해결하기 위해 새로운 각도표현인 쿼터니언을 도입하고자 한다.

 

쿼터니언은 복소수를 확장한 것으로qx qy qz qw의 항으로 표현되는데 qw는 실수항 나머지는 허수항이다.

오일러각을 이용한 2차원 회전은 mat2({cos,-sin},{sin,cos}) 으로 표현된 행렬을 좌표 (x,y)에 곱하는 것으로 표현하였다.

쿼터니언을 이용한 회전은 cos(theta)+sin(theta)i 로 표현되고 p*q로 회전을 계산한다.

이제 3차원에 대해서 보자.

3차원에서 쿼터니언을 이용한 회전(u를 중심으로 p를 theta만큼 회전한 경우)을 살펴보자

qpq*를 이용해 연산할 수있다.(q*는 q의 켤래복소수)

 

이 쿼터니언 회전에 대한 자세한 내용은 아래 위키피디아 참조

https://en.wikipedia.org/wiki/Quaternion

 

Quaternion - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Noncommutative extension of the real numbers Quaternion multiplication table 1 i j k 1 1 i j k i i −1 k −j j j −k −1 i k k j −i −1 In mathematics, the quaternion number sys

en.wikipedia.org

 

이제 쿼터니언을 이용함으로서 짐벌락(회전축이 겹침으로서 한개의 차원이 소실되는 문제)와

보간에서의 문제를 해결할 수 있다.

 

이제 쿼터니언을 이용한 보간 방법을 보자.

위와 같은 방식을 통해 쿼터니언으로 각도를 보간할 수 있게 되었다.

이를 spherical linear interpolation이라고 한다.

다만 아직 해결해야할 한가지 문제가 남아있다. 우리는 지금까지 모든 변형을 matrix의 곱을 통해 진행했다.

하지만 쿼터니언은 4차원 벡터이므로 쿼터니언을 이용한 변형을 행렬로 표현해야 기존에 진행했던 모든 과정들을 그대로 사용할 수 있다.

 

위와 같은 식으로 행렬과 쿼터니언은 언제든 바꿀 수 있다.

쿼터니언 회전(qx,qy,qz,qw)을 행렬로 바꾸는 식의 증명은 비교적 간단하다.

위에서 보았단 pq를 다시 생각해보자

이를 행렬로 보면 다음과 같이 표현할 수 있다.

pq 는 (qx qy qz qw)의 선형 조합이기도 하므로 다음과 같이 표현될 수 있다.

이를 이용해 qpq*를 표현하면 다음과 같다.

이를 곱하면 하나의 4x4 행렬이 되는데 이때 쿼터니언의 성질을 이용하면 위 식으로 고쳐쓸 수 있게된다.

 

이제 모든 회전에 대해서 쿼터니언을 이용한 방식으로 사용하고자 한다.

실제로 unity등의 game engine에서도 모든 회전에 대해 쿼터니언을 이용하여 구현한다.

반응형