티스토리 뷰

고려대학교 정보대학 컴퓨터학과 2019년 1학기 <컴퓨터그래픽스> 11강 오일러 변환 및 쿼터니언

강의영상 플레이리스트 [Link]

강의자료 [Link]

 

 

Books · media lab

Introduction to Computer Graphics with OpenGL ES Review and Recommendations 이 책의 영문 제목 “Introduction to Computer Graphics”를 “A Painless Introduction to Computer Graphics”라는 닉네임으로 바꿔서 부르고 싶다. 수학을

media.korea.ac.kr


컴퓨터그래픽스 오일러 변환 및 쿼터니언

Keywords

  • euler transforms
  • keyframe & in-between frame
  • slerp (spherical linear interpolation)

 

Euler Transforms

x, y, z축 회전을 결합하면 3차원 공간에서의 임의의 방향을 표현 가능하다

Euler transform = z축 회전을 결합하여 임의의 방향을 제공하는 것

 

Euler angles = \((\theta_1, \theta_2, \theta_3)\)

 

 

 

축 변환 순서를 바꾸면 최종 결과가 달라진다.

 

Keyframe Animation in 2D

[전통적인 2D 애니메이션에서의 키프레임]

24개의 프레임이 있을 때,

* 시니어 애니메이터가 1번, 13번, 24번 주 프레임을 그림 -> keyframe

* 주니어 애니메이터가 2-12, 14-23번 사이 프레임을 그림 -> in-between frame

 

[real-time computer animation]

-> 위치 및 각도 보간을 통해 in-between frame을 생성한다.

 

(예시: 중앙점 \(p\)와 orientation angle \(\theta\)를 보간)

$$p(t)=(1-t)p_0+tp_1$$

$$\theta(t)=(1-t)\theta_0+t\theta_1$$

 

 

Keyframe Animation in 3D

orientation / position 데이터로 표현한 키프레임 예시:

* keyframe 3, in-between frame 4

* keyframe 3개를 2개 구간(kf0-kf1 / kf1-kf2)으로 나누어, \(t_0, t_1\)로 놓고 선형보간

* 아래 예시에서는 각도와 위치뿐 아니라 색상값까지 선형보간하였음

 

[1차함수 보간 vs. 2차 이상 함수 보간]

* 고차원 보간을 할 때 더 부드러운 그래프 -> 부드러운 움직임이 나온다.

 

[y축에 대해서만 고차원 보간을 적용했을 때 결과]

 

 

[정리]

물체의 방향은 오일러 변환으로 표현한다.

* 물체의 방향은 회전이 결정한다.

* 회전은 오일러 변환이 담당할 수 있다.

* 오일러 변환은 \((\theta_x, \theta_y, \theta_z)\)각도 3개로 표현된다.

* 컴퓨터 애니메이션에서 key frame 사이의 in-between frame은 보간으로 생성한다.

* 보간된 \((\theta_x, \theta_y, \theta_z)\)로부터 행렬 3개를 만들어 결합하면 단일 3x3 행렬을 만들 수 있고, 이를 물체에 적용하면 중간 프레임의 회전된 물체가 출력된다.

 

 

A Problem of Euler Angles

오일러 각도는 항상 정확하게 보간되지 않으며, 따라서 keyframe animation에 적합하지 않다.

 

* 아래 예시에서, (a)와 (b) 키프레임에 대한 선형보간 결과인 (c)는 x축 오일러 각도가 0이 아니다.

* (a)와 (b)가 모두 x축 오일러 각도가 0이므로, 선형보간 했을 때 (c)의 x축 오일러 각도도 0이 되어야 하지만?

-> 실제 적용해 보면 기대하지 않은 x축 오일러 앵글 변화가 발생함

 

 

선형보간 결과, x축이 변화하면서 기대하지 않았던 휘어지는 움직임이 발생 (y-z 평면에 대해 평행하지 않음)

 

 

Quarternion

오일러 변환은 매우 직관적이고 효율적이지만, 보간 문제로 키프레임 애니메이션에는 적용하기 어렵다

대안은 없을까? -> Quarternion (4원수)

 

* quarternion은 복소수를 확장한 개념 (총 3개의 허수 단위 사용 - \(i, j, k\))

* 허수부의 경우 bold로 표현함 (\(\symbf{q}_v\))

 

$$q_x i + q_y j + q_z k + q_w = (q_x, q_y, q_z, q_w) = (\symbf{q}_v, q_w)$$

 

* 4차원 복소수 -> 4원수라고 번역됨

* quarternion의 허수는 아래와 같이 cyclic permutation을 만족하며 교환법칙은 성립하지 않음

 

$$i^2=j^2=k^2=-1$$

$$ij=k, ji=-k$$

$$jk=i, kj = -i$$

$$ki=j, ik=-j$$

 

* \(p, q\)라고 하는 쿼터니언 벡터가 있다고 할 때, \(pq\)의 결과는 새로운 쿼터니언이 된다.

 

* 켤레(conjugate) 쿼터니언 \(q^*\)

-> 허수부를 음수로 만든 것

 

$$q^* = (-\symbf{q}_v, q_w)$$

$$= (-q_x, -q_y, -q_z, q_w)$$

$$=-q_x i - q_y j - q_z k + q_w$$

 

* \(\symbf{p}\symbf{q}\)에 대한 켤레, 즉 \((\symbf{p}\symbf{q})^* = \symbf{q}^*\symbf{p}^*\)이 성립한다.

 

* Magnitude of a quarternion

쿼터니언의 크기가 1이면 unit quarternion 이라고 한다.

 

$$||\symbf{q}||=\sqrt{q_x^2+q_y^2+q_z^2+q_w^2}$$

 

 

2D Rotation through Complex Numbers

복소수를 이용해서 2차원 회전을 표현해 보자.

 

* 좌표값 \(p\)를 복소수 \(\symbf{p}\)로 표현

$$p = (x,y) \rightarrow \symbf{p}= x+yi$$

 

* 회전각도 \(\theta\)를 이용해 unit-length 복소수 \(\symbf{q}\) 표현

$$\symbf{q}=cos\theta + sin\theta i$$

 

* \(\symbf{pq}\)를 계산하면, 실수부와 허수부가 \((x, y)\)에 대한 \(\theta\) 회전변환 결과인 \((x', y')=(xcos\theta-ysin\theta, xsin\theta+ycos\theta)\)와 동일함

 

$$\symbf{pq}=(x+yi)(cos\theta+sin\theta i)$$

$$=(xcos\theta - ysin\theta) + (xsin\theta+ycos\theta)i$$

 

3D Rotation through Quarternions

2차원과 달리 3차원 회전에는 \(\theta\)만큼 이동하는 기준이 되는 "회전축"이 필요함

* \((x,y,z) \rightarrow (x',y',z')\)

 

3D vector \(p\), axis \(u\), angle \(\theta\)

-> 쿼터니언으로 "회전하고자 하는 벡터 \(p\)"와 "회전각 \(\theta\)"를 표현

 

최초 \(\symbf{p}\)에서 \(p_w\)는 0으로 initialize

* \(\symbf{p}=(\symbf{p}_v, p_w) = (p, 0)\)

 

\(u, \theta\)를 이용하여 unit quarternion \(\symbf{q}\) 정의

* 축 \(u\)는 유닛 벡터 \(\symbf{u}=(u_x, u_y, u_z)\)를 만들기 위해 \(u\)의 길이로 나누어줌

* \(\symbf{q}=(\symbf{q}_v, q_w)=(sin\frac{\theta}{2}\symbf{u}, cos\frac{\theta}{2})\)

 

$$\symbf{q}=(sin\frac{\theta}{2}\symbf{u}, cos\frac{\theta}{2})$$

$$= \sqrt{sin^2\frac{\theta}{2}(u_x^2+u_y^2+u_z^2)+cos^2\frac{\theta}{2}}$$

 

\(\symbf{u}\)는 unit vector 이므로,

$$u_x^2+u_y^2+u_z^2=1$$

 

따라서,

$$||\symbf{q}||=\sqrt{sin^2\frac{\theta}{2}(u_x^2+u_y^2+u_z^2)+cos^2\frac{\theta}{2}} = \sqrt{sin^2\frac{\theta}{2}+cos^2\frac{\theta}{2}}=1$$

 

\(\symbf{qpq^*}\) 계산

* \(\symbf{qp}\)와 켤레쿼터니언 \(\symbf{q}*\)를 곱한다

* 결과값의 허수부만 뽑아내면 rotated vector \(p'\)와 동일하다.

 

 

회전축 입력에 대응하는 \(\symbf{u}\)는 매우 융통성 있는 회전을 표현가능

* \(x, y, z\)축을 포함하는 임의의 회전축 \(u\)에 대해 \(\theta\)만큼의 회전을 표현할 수 있다.

* "Rotation about \(\symbf{u}\) by \(\theta\)" = "Rotation about \(-\symbf{u}\) by \(-\theta\)" 

 

 

Interpolation of Quarternions (spherical linear interpolation, slerp)

그러면 4차원 벡터(4원수) \(\symbf{u}\)를 이용해서 키프레임 보간을 어떻게 수행할까?

rotation을 표현하는 \(\symbf{p}, \symbf{q}\)가 주어졌을 때, [0,1] 범위를 갖는 파라미터 \(t\)에 대해 아래와 같이 보간한다.

 

$$\frac{sin(\phi(1-t))}{sin\phi}\symbf{p} + \frac{sin(\phi t)}{sin\phi}\symbf{q}$$

 

\(\symbf{p,q}\)의 내적으로부터 유도되는 \(cos\phi\) 값을 이용하여 위 수식을 계산.

$$\symbf{p} \cdot \symbf{q}=||\symbf{p}|| ||\symbf{q}|| cos \phi=1*1*cos\phi=cos\phi$$

$$=(p_x,p_y,p_z,p_w) \cdot (q_x,q_y,q_z,q_w)$$

$$=p_x q_x + p_y q_y + p_z q_z + p_w q_w$$

 

 

 

 

 [다시, 변환행렬의 포맷]

* translation / scaling 변환행렬은 4x4 행렬식

* quarternion으로 표현된 회전변환행렬은 어떻게 4x4 행렬로 바꿀까?

 

 

Quarternion and Matrix

 

Quarternion - Summary

* 오일러 변환은 물체에 대한 임의의 방향에 대한 회전을 주축 중심 회전의 조합으로 표현

* 임의 방향을 부여하는 회전은 오일러 변환 외에도 쿼터니언으로 표현할 수 있다

* 쿼터니언은 slerp을 통하여 오일러 변환보다 더 유연하고 융통성 있는 회전 보간에 적합

* 쿼터니언 회전변환은 4x4 크기의 회전변환행렬로 사용할 수 있음

 

키프레임에 대해 쿼터니언이 주어졌을 때,

1. in-between frames에 대해 slerp 적용

2. slerp 수행 결과인 interpolated quarternion을 4x4 rotation matrix로 변환

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함