개요
지금까지는 회전을 회전 행렬로 표현했다. 하지만 사원수라는 새로운 대수를 사용하면 실수 네개만으로 회전을 표현할 수 있다.
복소수
복소수는 실수부와 허수부로 구성되며 (a,b) 또는 a+ib로 표현된다. 여기서 i는 -1의 루트로 i2은 -1이 된다.
복소수에는 상등 비교와 사칙연산이 가능한데 a+ib의 상등비교와 사칙연산을 생각하면 된다.
(a,b) = (c,d) => a = c && b = d
(a,b) ± (c,d) = (a±c,b±d)
(a,b)(c,d) = (ac-bd,ad+bc)
(a,b)/(c,d) = ( (ac+bd)/(c2+d2) , (bc-ad)(c2+d2) )
실수 x는 (x,0)의 복소수로 생각할 수 있으며 i는 (0,1)로 생각할 수 있다.
또한 복소수 z = (a,b)의 켤레 복소수는 다음과 같이 정의된다.
(a,-b)
복소수의 크기는 복소수를 2차원 벡터로 생각했을 때의 길이와 같다. 이때 길이가 1인 복소수는 단위 복소수라고 한다.
복소평면
x축은 복소수의 실수부, y축은 복소수의 허수부로 생각하면 복소수(a,b)를 하나의 점또는 벡터로 생각하여 복소평면위에 위치 시킬 수 있다.
이때 복소수 (a,b)를 다음과 같이 극형식으로 표현 할 수 있다.
r = (a,b)의 길이 , θ = (a,b)의 각도
(rcosθ,rsinθ) = rcosθ + ircosθ = r(cosθ + isinθ)
이때 두 극형식 복소수 r1(cosθ1 + isinθ1) , r2(cosθ2 + isinθ2)를 곱하여 정리하면 다음과 같이 된다.
r1r2(cos(θ1 + θ2) + isin(θ1 + θ2))
이는 두 복소수를 곱하면 길이는 각 길이의 곱이 되고 각도는 더해진 복소수가 나오게 된다는 뜻이다.
이때 한 복소수에 단위 복소수를 곱한다면 그 복소수를 단위 복소수의 각도만큼 회전 시키는 연산이 되게 된다.
사원수
사원수는 복소수를 일반화하여 평면이 아닌 공간에서 점이나 벡터를 회전시키는데 사용할 수 있는 대수이다.
사원수는 네개의 실수 순서쌍 q = (x,y,z,w) = (q1,q2,q3,q4)로 구성된다.
여기서 xyz는 각각 허수계수이며 (u,w) = (x,y,z,w)로 허수 벡터부와 실수부로 분리하여 주로 표현한다.
또한 (x,y,z,w)는 xi + yj + zk + w로 표현되며 i,j,k는 다음과 같이 정의된 허수들이다.
i2 = j2 = k2 = ijk = -1
ij = k = -ji
jk = i = -kj
ki = j = - ik
연산
사원수에는 상등비교와 덧셈, 뺄셈, 곱하기가 가능하며 나누기는 존재하지 않는다.(대신 역곱이 있다.)
(u,a) = (v,b) => u = v && a =b
(u,a) ± (v,b) = (u±v,a±b)
(u,a)(v,b) = (av + bu + u x v, ab - u · v )
사원수의 곱셈은 행렬로 표현이 가능하다.
pq = (p의 앞곱행렬)(q의 열벡터)
사원수의 곱셈은 교환법칙은 만족하지않지만 결합법칙은 만족한다. 사원수 곱은 행렬로 변환가능하므로 행렬의 성질을 생각하면 증명되는 내용이다. 또한 마찬가지로 덧셈에 대한 분배법칙도 만족한다.
어떠한 실수s는 사원수 (0,0,0,s)로 변환 될 수 있으며 벡터 u는 사원수 (u,0)으로 변환 될 수 있다.
따라서 실수와 사원수의 곱은 그냥 스칼로 곱셈이며 이 경우에는 교환법칙도 성립한다.
이때 (0,0,0,1)은 사원수 곱셈의 항등원이다.
켤레
사원수 q = (u, w)의 켤레는 (-u, w)이며 q*로 표현한다.
켤레는 다음과 같은 성질을 가진다.
(pq)* = q*p*
(p + q)* = p*+ q*
(q*)*= q
(sq)* = s(q*)
q+q* = 2q4
qq* = q*q = q12+q22+q32+q42 = ||u||2+q42
크기
사원수의 크기는 사차원 벡터로 생각했을 때의 길이이다.
크기에는 다음과 같은 성질이 있다.
||q*|| = ||q||
||pq|| = ||p|| ||q||
이에 따르면 단위 사원수끼리의 곱은 단위 사원수가 된다.
역
사원수의 역은 다음과 같다.
q-1 = q*/||q||2
이는 qq-1과 q-1q가 1이 나온다는 사실로 알 수 있다.
이때 단위 사원수의 역은 켤레가 된다.
사원수의 역에는 다음과 같은 성질이 있다.
(q-1)-1= q
(pq)-1 = p-1q-1
단위 사원수의 극형식
단위 사원수q = (u,w)는 다음과 같이 극형식으로 표현 할 수 있다.
q = (sinθn, cosθ)
여기서 n은 u의 방향을 나타내는 단위 벡터이며 θ는 벡터부의 벡터의 길이와 실수부의 크기 사이의 비를 결정하는 0 ~ 180도 사이의 각도이자 w를 cosθ표현 했을 때 나오는 값이다.
이는 ||q|| = ||u|| + q42 = 1에서 q4가 cosθ로 표현될 때 u의 길이는 sinθ가 되어야함을 알 수 있다.
따라서 단위 사원수는 (sinθn, cosθ)꼴로 표현될 수 있다.
사원수 회전
한 단위 사원수는 점 또는 벡터에 대한 회전을 나타낼 수 있다.
본론부터 이야기하면 q = (sin(θ/2)n, cos(θ/2)) 단위 사원수는 n을 회전축으로(벡터가 눈을 가르킬 때 시계방향으로) θ만큼 회전시키는 회전을 나타낸다.
어떠한 점 또는 벡터 v가 주어졌을 때 이를 사원수 p=(v,0)으로 표현하고 다음과 같이 계산하면 회전된 결과인 (v',0)을 얻을 수 있다.
qvq*= (v',0)
이는 위 왼쪽항을 사원수 곱으로 계산한 뒤 정리하면 3장에서 배웠던 회전 공식과 동일하다는 것으로 증명할 수 있다.
또한 위의 qvq*연산을 q의 각 요소로 구할 수 있는 행렬 Q로 변환하여 vQ형태로 만들 수 있다. 따라서 q에 대한 회전연산을 표현하는 회전행렬을 구할 수 있다.
반대로 한 회전행렬이 주어졌을 때 사원수에 대한 회전행렬 공식을 역으로 계산하여 회전행렬에 대한 사원수역시 구할 수 있다.
추가로 단위 사원수 p, q를 곱한 pq는 두 회전을 순서대로 적용시킨것과 같은 결과를 내는 단위 사원수가 되므로 사원수 곱으로 회전을 합성할 수 있다.
마지막으로 어떠한 단위 사원수 q = (sin(θ/2)n, cos(θ/2))에 다음과 같이 처리하면 각각 다음과 같은 효과를 낼 수 있다.
q*는 회전축이 뒤집힌 효과가 나므로 대칭된 회전을 나타낸다.
(sin(-θ/2)n, cos(-θ/2))는 정리하면 q*와 동일하므로 마찬가지로 대칭된 회전을 나타낸다.
(sin(θ/2)n, -cos(θ/2))는 회전 결과는 q*과 동일하나 회전축이 바뀌지 않으므로 회전 방향이 바뀌지않는다. 즉 짧은 회전 - > 먼 회전 또는 먼회전 -> 짧은 회전으로 바뀌며 반대 회전결과를 내게된다.
-q는 회전축이 바뀌며 실수부를 -한 효과가 동시에 나타나므로 회전결과는 같으나 반대 회전방향을 가지게 된다.
사원수 보간
회전을 나타내는 단위 사원수 p,q가 있을 때 이 둘 사이에서 t를 계수로 보간된 회전을 나타내는 단위 사원수를 구할 수 있다. 이는 두 단위 사원수를 4차원 구면을 기준으로 구면 선형 보간을 하여 얻을 수 있다.
이는 다음과 같이 구한다.
p와 q를 내적하고 역코사인을 적용시켜 p와 q사이의 4차원 각도 θ를 얻는다.
(sin((1-t)θ)a + sin(tθ)b) / sin(θ)로 보간된 단위 사원수를 구할 수 있다.
이때 두 사원수 사이의 거리가 0에 가깝다면 sin(θ)도 0에 가까워져 정밀도 오차가 발생 할 수 있다. 따라서 그런 경우에는 두 사원수를 선형 보간한 뒤 정규화시키는 방법이 더 정밀할 수 있다. 다만 평소에는 해당 방법이 구면 선형을 보장해주지 않기에 사용해서는 안된다.
마지막으로 p와 q에 보간하는 것과 p를 -q에 보간하는 것은 서로 반대방향으로 보간을 하는 것을 의미하게 된다. 이를 컨트롤 하기 위해서는 4차원 상에서 p와 q의 거리와 p와 -q사이의 거리를 각각 구했을 때 더 짧은 쪽이 더 짧은 회전방향으로 보간하게 된다는 점을 이용하면 된다. 이를 이용하여 짧은 거리와 먼 거리중 어디로 보간할 지 정할 수 있다.
DirectXMath 사원수
DirectXMath라이브러리에는 다양한 사원수 관련 함수들이 존재한다. 사원수 간의 계산이나 단위 사원수에 대한 회전행렬을 주는함수, 그 반대등 유용한 기능들이 존재한다. 또한 크기 변환 벡터, 회전 중심점 벡터, 단위 사원수, 이동 변환 벡터를 넣으면 그것들을 모두 적용시킨 변환행렬을 주는 함수도 존재한다. 이 함수의 반환 행렬은 각 변환을 적용시키는 행렬로도 사용할 수 있지만 해당 크기, 회전, 위치를 가지는 오브젝트에 대한 월드 행렬로도 그대로 사용가능하다.
키프레임 애니메이션
애니메이션의 대표적인 표현 방식은 키프레임이다.
일련의 키프레임으로 애니메이션이 표현되는데 각 키프레임은 프레임 시간, 위치, 크기, 회전(단위 사원수)의 값을 가진다. 특정 시간대에서 그 시간대를 둘러싼 두 키프레임에서 시간비를 계수로 위치, 크기, 회전을 각각 보간하여 해당 시간대의 오브젝트 월드행렬을 구하여 적용하면 실시간 애니메이션이 구현된다.
참고서적
DirectX 12를 이용한 3D 게임 프로그래밍 입문
'그래픽스 > DirectX12' 카테고리의 다른 글
[Directx12][23장]캐릭터 애니메이션 (0) | 2023.03.21 |
---|---|
[Directx12][21장]주변광 차폐 (0) | 2023.03.21 |
[Directx12][20장]그림자 매핑 (0) | 2023.03.21 |
[Directx12][19장]법선 매핑 (0) | 2023.03.21 |
[Directx12][18장]입방체 매핑 (0) | 2023.03.21 |