티스토리 뷰
고려대학교 정보대학 컴퓨터학과 2019년 1학기 <컴퓨터그래픽스> 11강 오일러 변환 및 쿼터니언
강의영상 플레이리스트 [Link]
강의자료 [Link]
컴퓨터그래픽스 오일러 변환 및 쿼터니언
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축 오일러 앵글 변화가 발생함
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로 변환
'3D Computer Graphics > Learnings' 카테고리의 다른 글
컴퓨터그래픽스_출력병합 (0) | 2022.05.06 |
---|---|
컴퓨터그래픽스_라이팅(2) (0) | 2022.05.06 |
컴퓨터그래픽스_라이팅(1) (0) | 2022.05.04 |
컴퓨터그래픽스_이미지텍스처링 (0) | 2022.05.02 |
컴퓨터그래픽스_래스터라이저(2) (0) | 2022.04.30 |
- Total
- Today
- Yesterday
- vertex shader
- 3d affine transform
- 컴퓨터그래픽스 강의
- 컴퓨터그래픽스 좌표계와 변환
- 원유로필터
- 컴퓨터그래픽스
- tensorflow.js
- 메타버스
- 고려대학교 한정현
- PoseNet
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |