지난 포스트에선 한 축에 대해 세타만큼 회전시키는 방법을 알아보았는데, 이러한 방식은 하나의 축에 대해서만 회전을 나타낼 수 있다는 문제점이 있다. 동시에 두 축 이상에 대한 회전을 하나의 값으로 나타내고 싶은 경우 우리가 사용할 수 있는 방법이 Quaternion(사원수)의 사용이다.
사원수를 정의내리려면 생각보다 많은 수학적인 설명이 필요한데, 이에 관해선 해당 글을 읽어보는 것을 권장한다.
간략하게 설명하면 사원수는 실수부와 허수부로 나타내어지며,
실수부는 스칼라값 하나 (w), 허수부는 어떤 크기 3인 실수값을 원소로 가지는 벡터에 허수 i,j,k를 벡터의 각 원소에 곱해준 형태이다. (v)
이를 편의를 위해 프로그래밍 시에는 그냥 [w, v] = [w, vx, vy, vz]의 vector4 형태로 나타내고 있지만, 어쨌든 사원수의 본질은 단순히 실수 4개를 원소로 갖는 벡터가 아니라는 것이 중요하다.
1.
지난 시간에 다룬 Axis-rotation은 축이 되는 벡터 n과 각 세타가 주어지면 회전을 표현할 수 있었다.
우리는 어떤 Axis-rotation을 Quaternion의 형태로 표현할 수 있으며, 그 식은 다음과 같다.
예시를 들어보자면, 벡터 (1,0,0)을 축으로 하여 (=x축) 90도 회전시키는 행위를 사원수로는 (루트2 / 2, 루트2 / 2, 0, 0)으로 표현 가능하다.
2.
Unit Quaternion이란 Unit Vector와도 유사한 개념으로,
크기가 1인 사원수를 의미한다.
어떤 사원수의 크기는 (w, x, y, z) 꼴일때 sqrt( w^2 + x^2 + y^2 + z^2 )이다.
* 즉 벡터 v를 포함하는 (w, v) 꼴일때 sqrt(w^2 + v^2)라는 일반적인 식으로 나타낼 수 있다.
3.
Identity Quaternion이란, Identity Matrix와도 유사한 개념으로,
(1, 0) 꼴의 사원수를 의미한다. 여기서 0은 0벡터를 의미하며, x,y,z축이 있을 경우 이는 (1, 0, 0, 0) 꼴이라는 것에 주의하자.
*왜 (1, 0)이 Identity Quaternion인지는 사원수를 구하는 공식을 생각하면 쉽다. 어떠한 회전도 하지 않은 상태라면 세타 = 0이기 때문에 (1, 0벡터) 꼴이 나올 수 밖에 없다.
4.
Quaternion Inverse는 행렬에서의 역행렬과 유사한 개념으로, quaternion q = (w, v)가 주어졌을때 q * q^-1 = (1,0) = Identity Quaternion을 만드는 quaternion이다.
역사원수를 구하는 것은 굉장히 쉬운데, 어떤 사원수 q에 대한 역사원수 q^-1은 곱했을 때 q가 apply한 회전을 다시 원상태로 되돌리는 사원수라고 생각하면 편하다. 즉 q가 벡터 n을 축으로 세타만큼 회전시켰다면, q^-1은 벡터 n을 축으로 -세타만큼 회전시키면 되는 것이다.
세타에 -세타를 집어넣으면, 결국 cos(세타/2), 즉 w값은 변하지 않고
뒷부분 v값은 전부 부호가 거꾸로 되는 것을 알 수 있다.
고로 이를 일반화하여 나타내면 다음과 같다.
q (w, v)의 역사원수 q^-1 = (w, -v)
(w, x, y, z).inverse() = (w, -x, -y, -z)
* 정확한 명칭인지 확실하지 않지만, 편의를 위해 역사원수라고 적었다.
'mathematics > game mathematics' 카테고리의 다른 글
[Mathematics] 20. Quaternion을 이용한 정점 회전 (0) | 2022.05.18 |
---|---|
[Mathematics] 19. Quaternion Multiplication (0) | 2022.04.24 |
[Mathematics] 17. Axis-Angle Rotation (Rodrigues formula) (0) | 2022.04.08 |
[Mathematics] 16. Plane Intersection & Frustum Culling (0) | 2022.04.03 |
[Mathematics] 15. 3차원 Line-AABB Intersection (0) | 2022.04.03 |