본문 바로가기
Computer Graphics

컴퓨터 그래픽스 - Quaternions

by eigen96 2024. 2. 18.
728x90

 

 

Euler Transform이 직관적이지만 올바르게 보간된다는 보장이 없기 때문에

KeyFrame Animation에서는 쓰기가 어렵다는 결론으로 지난 포스팅을 마무리 하였다.

 

이번엔 이에 대한 해결책을 알아본다.

Quaternion 기법은 항상 올바르게 보간된다.

 

 

Quaternion은 Complex Number 복소수를 확장한 것이다.

a + bi

b를 허수부, a를 실수부라고 배웠었다.

여기서 b를 확장하게 된다.

i에서 j와 k가 추가된다.

그 앞에 스칼라값이 붙게 되어 허수부를 결정하게 된다.

그 결과 4개의 스칼라값이 나오는데 이것을 4차원 벡터로 표현하게 된다.

4차원 벡터이기 때문에 쿼터니언이라 부른다.

두개의 서로 다른 허수 단위가 곱해지면 Cyclic Permutation 적인 특징을 가진다

 

 

 

쿼터니언을 이용하여 2차원 회전을 살펴보자.

2차원 회전은 복소수를 이용해서 표현 가능하다.

이 그림은 2차원 회전을 첨 설명할때 그림이다.

  1. 회전 대상인 (x,y) vector 를 복소수를 통해 표현한다면 x + yi이다. 이를 p라고 하자
  2. 2차원 회전은 세타만 있으면 표현이 되는데, 이것을 이용하여 p와 q로 또다른 복소수를 만든다. 크기가 1인 Polar form의 복소수로 표현하면 cosθ + sinθi 가 된다. 이를 q라 하자.
  3. p와 q를 곱하면 다음과 같은 식이 나오며, 실수부와 허수부가 만들어진다.
  4. 그 결과 각 실수부와 허수부가 기존 행렬의 x, y와 같다는 것을 알 수 있다.

 

 

 

 

 

3차원 회전은 회전 축이 필요하다.

원래 x, y, z라고 하는 벡터가 x, y, z`의 좌표를 갖게 될것이다.

회전 대상인 벡터를 쿼터니언으로 표현할것이다.

  1. 쿼터니언은 4차원 벡터인데 우선 3개의 원소를 p로 설정한다. 이것이 허수부를 결정하며 실수부는 0을 지정하여 p를 설정한다.
  2. 회전 그 자체를 쿼터니언으로 표시한다.
    1. 회전 중심 축 u를 단위 벡터로 만든다. u
    2. u 앞에 sin(θ/2)를 곱하여 허수부를 완성한다. 실수부는 cos(θ/2)를 넣는다.
    3. 이렇게 회전을 쿼터니언 q로 표현한다.

qpq*를 연산하면 하나의 쿼터니언이 되며 이것의 허수부만 뺀다면 회전된 벡터값 x', y', z'가 된다.

회전을 표현했던 쿼터니언은 Unit Quaternion으로 만들어두었다.

 

증명은 다음 포스팅에 따로 정리해보려고 한다.

 

 

 

 

 

 

u라고 하는 회전축을 중심으로 하는 쿼터니언을 만들었는데

이것은 융통성있는 회전을 구현할 수 있게 해준다.

지금까지는 x,y,z 축, 주축을 중심으로 하는 회전에 대해서만 회전 행렬을 만들고 표현했었는데

지금은 임의의 축이 주어졌을때 θ만큼 회전시킬 수 있다.

다음에 설명할 예정인 보간도 가능한 표현법이다.

 

 

key Frame 0에 p 쿼터니언이 있고

keyFrame 1에 q라는 쿼터니언이 있다.

In Between Frame이 있을텐데 어떻게 보간할 것인가?

조금 복잡해보이지만 다음과 같은 식을 이용하여 보간을 할 수 있다.

4차원이지만 구 표면상에서 쿼터니언들을 보간한다고 하여 Spherical linear interpolation (slerp)이라고 한다.

 

 

회전을 기본축을 중심으로 한 기본 회전 몇가지를 조합한 euler Transform을 이용했는데

그 대안인 Quaternion을 배웠다.

그런데 Translation, Scaling이 있었으며 4x4행렬로 이루어져있었다.

4x4행렬의 형태가 아닌 쿼터니언은 이 곱셈에 끼어들 수 없다.

이것을 행렬로 바꾸는 방법은 다음과 같다.

원소들을 조합하여 4x4크기의 행렬로 만들 수 있다.

 

 

 

 

 

 

 

요약

  1. Euler Transform은 임의의 회전을 주축중심의 회전의 조합으로 표현한것
  2. 임의의 방향을 부여하는 회전을 Euler Transform이 아닌 Quarternion으로 표현가능하다.
  3. 쿼터니언은 Slerp이라는 것을 통해 잘 보간된다.
  4. 쿼터니언은 행렬로서 변환이 가능하다.

KeyFrame 0이 있고 KeyFrame1이 있다. InBetween Frame을 만들고 싶다면

Euler Transform이 있다면 보간으로는 제대로된 InBetween Frame의 회전을 표현할 수 없다.

대신 Quaternion을 사용하며 Slerp을 이용해서 보간하면 새로운 쿼터니언이 나오며 중간프레임의 회전을 표현.

다른 Translation이나 Scaling과 결합하려면 행렬로 바꾸면 된다.

728x90

댓글