* 정의

사원수(quaternion 쿼터니언) 또는 해밀턴 (Hamilton number)는 복소수를 확장해 만든 수 체계이다. 네 개의 실수 성분을 가지며, 덧셈과 곱셈의 결합법칙 및 덧셈의 교환법칙을 만족시키지만 곱셈의 교환법칙은 성립하지 않는다.

단일 사원수로 하나의 3차원 회전을 나타낼 수 있고, 회전의 보간을 수월하게 계산할 수 있다.

 

* 복소수

사원수는 복소수(complex number)를 일반화한 것이라고 할 수 있다. 그렇기 때문에 2차원의 복소수의 곱의 의미를 파악하고 이를 3차원으로 확장해 본다.

 

- 정의

 

두 실수의 순서쌍 z = (a, b)를 하나의 복소수이다. 첫 성분을 복소수의 실수부(real part)라고 하고, 둘째 성분을 허수부(imaginary part)라고 부른다. 이러한 복소수들에 대해 상등 비교와 사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈)이 가능하다.

 

x + iy와 같은 형태의 복소수 p1 = a + ib, p2 = c + id는 각각 다음과 같이 표현할 수 있다.

p1 = (a, b), p2 = (c, d)

 

- 상등

a = c이고 b = d을 만족해야 p1 = p2가 성립한다. 

 

- 덧셈과 뺄셈

p1 +- p2 = (a +- c, b +- d)

 

- 곱셈

p1 p2 = (a, b) (c, d) = (ac - bd, ad + bc)

 

- 실수와 복소수의 곱

(x, 0) 형태의 복소수는 그냥 실수로 간주해서 x로 표기한다. 모든 실수는 허수부가 0인 복소수로 간주할 수 있다.

x * p1 = x (a, b) = (x, 0) (a, b) = (a, b) (x, 0) = (a, b) x = p1 * x

이는 스칼라와 벡터의 곱셈과 비슷한 성질을 가지고 있다.

 

- 나눗셈

p1 / p2 = (a, b) / (c, d) = ( ac + bd / (c * c + d * d), bc - ad / (c * c + d * d) ), 단 (c, d) != (0, 0)이다.

 

- 허수부의 단위

허수부의 단위i를 (0, 1)로 정의하며, 복소수 곱셈 정의에 의해 i * i = (0, 1) * (0, 1) = -1이다.

i = √-1임을 이를 통해서도 알 수 있다.

 

- 켤레 복소수(complex conjugate)

z = (a, b)라고 하면 결레 복소수는 (a, -b)로 표현된다.

 

 

- 기하학적 해석

 

a + ib의 순서쌍 형태(a, b)를 2차원 평면의 점, 벡터로 생각하고 2차원 평면상에서 해석해보면, 덧셈의 경우 벡터의 덧셈의 정의와 일치한다.

 

복소수 a + ib의 절댓값 또는 크기(magnitude)는 그 복소수가 나타내는 벡터의 길이로 정의된다.

이때 크기가 1인 복소수를 단위 복소수(unit complex number)라고 한다.

 

|a + ib| = √(a * a + b * b)

 

 

- 극좌표 표현과 회전

 

위와 같이 복소수를 2차원 복소평면의 한 점이나 벡터로 간주할 수 있기 때문에 극좌표를 이용해서 표현하는 것도 가능하다.

 

r = |a + ib|

a + ib = r cosθ + i r sinθ = r(cosθ + i sinθ)

 

이런 표현 방식을 복소수 a + ib의 극좌표 표현(polar representation) 또는 극형식(polar form)이라고 한다.

 

 

두 극형식의 복소수를 각각 z1 = r1(cosθ1 + i sinθ1), z2 = r2(cosθ2 + i sinθ2)이라고 하고 복소평면에 나타내면 다음과 같다.

극형식의 두 복소수를 곱해보면 다음과 같다. 

 

다음과 같은 삼각함수 항등식이 사용되었다.

z1 * z2는 크기가 r1 * r2이고 각도가 θ1 + θ2인 벡터를 나타낸다.

 

만약 r2 = 1이라면(길이가 1) z1을 θ2만큼 회전한 것이다.

결론은 2차원 복소평면에서 복소수 z1에 단위 복소수 z2를 곱하면 z1이 회전한다.

 

 

* 사원수

- 정의와 기본 연산 

 

실수 네 개의 순서쌍 q = (x, y, z, w) = (q1, q2, q3, q4)는 하나의 사원수이다. 이를 흔히 q = (u, w)로 줄여쓴다.

u = (x, y, z)를 사원수의 허수 벡터부(imaginary vector part), 줄여서 '벡터부'라고 부르고, w를 실수부라고 부른다.

 

사원수 (u, a) = (ux, uy, uz, a), (v, b) = (vx, vy, vz, b)에 대해서 상등 비교와 덧셈, 뺄셈, 곱셈을 다음과 같이 정의한다.

 

- 상등

만약 u = v이고 a = b이면 (u, a) = (v, b)이다.

 

- 덧셈, 뺄셈

(u, a) +- (v, b) = (u +- v, a +- b)

 

- 곱셈

(u, a) * (v, b) = (av + bu + u x v, ab - u · v)

 

곱셈공식 유도해보면 다음과 같다.

p = (u, p4) = (p1, p2, p3, p4), q = (v, q4) = (q1, q2, q3, q4)라고 하면

 

먼저 r = pq를 성분별로 전개해서 정리하면 다음과 같다.

pq = (q1p4 - q2p3 + q3p2 + q4p1)i

+ (q1p3 + q2p4 - q3p1 + q4p2)j

+ (-q1p2 + q2p1 + q3p4 + q4p3)k

+ (-q1p1 -q2p2 - q3p3 + q4p4)

 

= q4p4 -(q1p1 + q2p2 + q3p3) + p4(q1i + q2j + q3k) + q4(p1i + p2j + p3k) + (q3p2 - q2p3)i + (q1p3 - q3p1)j + (q2p1 - q1p2)k

 

 

여기서 내적과 외적을 통해 나타내야 한다. 외적과 내적의 값은 다음과 같이 표현된다.

u x v = (p2q3 - p3q2, p3q1 - p1q3, p1q2 - p2q1)

        = (p2q3 - p3q2)i + (p3q1 - p1q3)j + (p1q2 - p2q1)k

 

u · v = p1q1 + p2q2 + p3q3

 

곱은 최종적으로 다음과 같이 정리된다.

(u, p4) * (v, q4) = ... = q4p4 - (u · v) + p4v + q4u + u x v = (p4v + q4u + u x v, q4p4 - u · v)

 

 

이를 행렬로 표현하면 다음과 같다.

 

곱셈 유도과정에서 나왔던 중간 결과를 이용하면 쉽게 행렬로 바꿀 수 있다.

 

 

사원수의 곱셈은 교환법칙을 만족하지 않지만 결합법칙과 분배법칙을 만족한다.

사원수의 곱셈을 행렬 곱셈으로 나타낼 수 있으므로 이를 통해 증명할 수 있다.

사원수 곱셈의 항등원은 e = (0, 0, 0, 1)이다.

pe = ep = p를 만족한다. 

 

 

- 특별한 사원수

 

사원수 i = (1, 0, 0, 0), j = (0, 1, 0, 0), i = (0, 0, 1, 0)이라는 세 사원수의 곱들은 외적의 성질을 연상시킨다는 점에서 특별하다.

 

예를 들어 위에서 사원수의 곱 정의에 의해 ij = k가 된다. 외적과 매우 닮아있다. 

 

 

- 변환

 

실수와 벡터(또는 점)을 사원수와 연관시키면 다음과 같다.

s는 하나의 실수이고 u = (x, y, z)가 하나의 벡터라고 하면

 

- s = (0, 0, 0, s)

 : 실수는 벡터부가 영벡터인 사원수로 간주, 특히 1 = (0, 0, 0, 1)인데 이는 사원수 곱셈의 항등원인 항등 사원수(identity quaternion)이다. 

 

- u = (x, y, z) = (u, 0) = (x, y, z, 0)

 : 임의의 벡터는 실수부가 0인 사원수로 간주, 실수부가 0인 사원수를 순사원수(pure quaternion)라고 부른다. 

 

 

실수 * 사원수는 그냥 스칼라 곱셈이며 교환법칙이 성립한다.

 

 

 

- 켤레 사원수와 크기

 

사원수 q = (q1, q2, q3, q4) = (u, q4)의 켤레를 q*로 표기한다. 켤레 사원수의 정의는 다음과 같다.

q의 켤레사원수 = q* = (-q1, -q2, -q3, q4) = (-u, q4)

허수 벡터부를 부정한 것과 같다.

 

아래와 같은 성질을 가지고 있다.

특히 q + q*와 q q* = q* q가 실수로 평가된다.

공식을 통해서 모두 유도할 수 있다.

 

사원수의 크기는 다음과 같이 정의된다. // qq* = ||q||²

 

 

크기가 1인 사원수를 단위 사원수(unit quarternion)이라고 부르며, 사원수의 크기에는 다음과 같은 성질이 있다.

q = (p1, p2, p3, p4)라고 하면 q* = (-p1, -p2, -p3, p4)가 되고, 1, 2번을 증명해보면 다음과 같다.

 

1번은 사원수의 크기의 정의를 활용하여 증명할 수 있다.

||q*|| = √(q*(q*)*)

= √(q*q) = √((-q1)² + (-q2)² + (-q3)² + q4² )

= √(q1² + q2² + q3² + q4²) = √(qq*)

= ||q||

 

2번은 정확하지 않지만 이런식으로 증명되지 않을까 생각해본다. // 식에 오류가 있을 수 있음

||pq|| = √(pq (pq)*)

= √(pqq*p*)

= √(p) √(qq*) √(p*)

= √(p) ||q|| √(p*)

= √(pp*) ||q||

= ||p|| ||q||

 

 

- 역 사원수

 

행렬 곱셈처럼 사원수 곱셈은 교환법칙을 만족하지 않지만, 영 사원수가 아닌 모든 사원수에는 역 사원수가 존재한다.

다음과 같이 정의된다.

 

역 사원수는 다음과 같은 특징을 가지고 있다.

 

- 극형식

q = (q1, q2, q3, q4) = (u ,q4)이고 단위 사원수일 때

위의 공식에 의해 다음을 만족한다.

||q|| = √(pp*) = √(||u||² + q4²)

||q||² = ||u||² + q4² = 1

 

여기서 ||u||²도 양수이므로 (q4)²는 무조건 1보다 작거나 같을 수 밖에 없다.

(q4)² <= 1

|q4| <= 1

-1 <= q4 <= 1을 만족하게 된다.

 

0 <= θ <= π 일 때, -1 <= cosθ <= 1을 만족하기 때문에 해당 범위에서 q4를 cosθ로 나타낼 수 있다.

 

||u||² + cos²θ = 1 이므로

||u||² = 1 - cos²θ = sin²θ

 

0 <= θ <= π 일 때, sinθ는 무조건 양수이기 때문에

||u|| = |sinθ| = sinθ 로 나타낼 수 있다.

 

 

||u||를 구했으니 이제 u를 구해야한다.

u와 같은 방향의 단위벡터를 n이라고 하면, // (u, q4)가 단위 사원수인 것이지 u가 단위벡터는 아니다.

n = u / ||u|| = u / sinθ 이므로 u = sinθn이다.

 

0 <= θ <= π 일 때 단위 사원수 q = (q1, q2, q3, q4) = (u ,q4) = (sinθn, cosθ)

 

θ를 -θ로 대체하면 sinθ의 부호가 변경되어 사원수 벡터부의 부정하기 때문에 켤레 사원수가 된다.

(sin(-θ)n, cos(-θ)) = (-sinθn, cosθ)

 

 

- 단위 사원수와 회전

 

- 회전 연산자

q = (u, w)가 단위 사원수이고 v가 3차원 점 또는 벡터라고 했을 때 v를 순사원수 p = (v, 0)으로 간주할 수 있다.

또한 q가 단위 사원수이므로 q-1 = q*가 성립한다.

 

qpq-1 (= qpq*)를 구해보면 다음과 같다. // 과정은 일단 생략한다.

qpq* = ((w² - u · u)v + 2(u · v)u + 2w(u x v), 0)

여기서 실수부는 0이므로 이 연산의 결과는 벡터나 점임을 알 수 있다.

 

단위 사원수 q에 대해 다음과 같이 표현 가능하다.

n은 길이가 1이고 u와 방향이 같은 단위벡터이고, 0 <= θ <= π 일 때, q = (sinθn, cosθ)로 표현가능하다.

 

qpq* = (cos²θ - sin²θ)v + 2(sinθn · v)sinθn + 2cosθ(sinθn x v)

= (cos²θ - sin²θ)v + 2sin²θ(n · v)n + 2cosθsinθ(n x v)

 

아래와 같은 삼각함수 항등식을 활용해서 정리해보면

cos²θ - sin²θ = cos(2θ)

2cosθsinθ = sin(2θ)

cos(2θ) = 1 - 2sin²θ

 

qpq*= cos(2θ)v + (1-cos(2θ))(n · v)n + sin(2θ)(n x v)

이식은 회전연산과 정확히 일치한다.

이는 벡터나 점 v를 축n에 대해 각도 2θ만큼 회전을 의미한다.

 

일반화해서 θ만큼 회전하려고 할때 q는 다음과 같다.

결론 : q = (sin(θ/2)n, cos(θ/2))일 때, qpq*는 p를 n축에 대해 θ만큼 회전함을 의미한다.

 

 

- 사원수 회전 연산자 > 행렬 변환

 

q = (u, w) = (q1, q2, q3, q4)가 단위사원수일때 사원수 회전연산자에 의해

q는 단위 사원수이므로 (q1)² + (q2)² + (q3)² + (q4)² = 1

(q4)² = 1 -( (q1)² + (q2)² + (q3)² + (q4)² )이다.

 

아래와 같이 단순화할 수 있다.

 

각 성분을 벡터와 행렬의 곱형태로 표기할 수 있다.

 

(q1)² + (q2)² + (q3)² + (q4)² = 1을 이용하고, 정리하면 다음과 같다.

 

 

 

- 행렬 > 사원수 회전 연산자 변환

바로 위에서 해당 행렬을 다음과 같이 구했다.

여기에 해당하는 q = (q1, q2, q3, q4)를 구해야한다.

 

가장 먼저 대각 성분들을 모두 더한다. 행렬의 대각 성분들의 합을 행렬의 대각합(trace)이라고 부른다.

이제 대각선을 기준으로 반대편에 있는 성분들을 조합해 보면 항들이 적절히 소거되어 q1, q2, q3를 구할 수 있다.

 

- 합성

p와 q가 단위사원수이고 회전 연산자가 각각 Rp, Rq라고 하면, v' = Rp(v)로 두었을 때, 두 회전 사원수의 합성의 정의는 다음과 같다.

 

p와 q가 단위 사원수이므로 곱 pq도 단위 사원수이다. // ||p|| = ||q|| = 1 => ||pq|| = ||p|| ||q|| = 1

 

곱 pq는 합성 Rq(Rp(v))로 주어지는 알짜회전(net rotation, 합성의 결과로 나온 최종적인 회전)을 나타낸다.

 

 

* 사원수 보간

- 사원수 내적의 정의와 보간 공식

 

사원수는 실수 네 개의 순서쌍이므로, 기하학적으로 사원수를 하나의 4차원 벡터로 간주할 수 있다.

단위 사원수는 4차원 단위구(unit sphere)구면에 놓인 4차원 벡터이다.

외적을 제외한 3차원 벡터 연산들은 4차원 또는 n차원까지 일반화 시킬 수 있으므로 두 사원수에 대해 내적은 다음과 같이 정의할 수 있다.

 

p = (u, s), q = (v, t)라고 할 때, 내적은 다음과 같이 정의된다.

p · q = u · v + st = ||p|| ||q|| cosθ

 

θ는 두 사원수 사이의 각도(4차원 구면에 놓인 4차원 벡터 사이의 각도)이며, p와 q가 둘다 단위 사원수라면

p · q = cosθ이다.

 

또 이때 각도는 다음과 같다. θ = arccos(p · q)

 

내적을 통해서 둘 사이의 각도를 확인 할 수 있으므로 애니메이션같은 두 방향 사이의 한 방향을 구면 보간으로 구하는 경우 유용하게 활용될 수 있다. 여기서 구면 보간을 하는 이유는 보간 결과가 단위 사원수가 되기 위함이다.

 

 

다음 그림과 같은 상황에서 어떻게 보간을 하는지 확인해보자.

목표는 a와 b사이를 각도 tθ만큼 보간하는 것이다.

이를 위해서 p = c1 a + c2 b를 만족하는 가중치 c1과 c2를 구해야한다.

여기서 ||p|| = ||a|| = ||b|| 을 만족한다.

 

위의 식에서 양변에 a내적을 해주면

a · p = c1(a · a) + c2(a · b)

cos(tθ) = c1 + c2 cosθ

 

위의 식에서 양변에 b내적을 해주면

p · b = c1(a · b) + c2(b · b)

cos(tθ) = c1 cosθ + c2

 

이 두 식을 가지고 c1과 c2를 구해야한다.

일단 행렬로 나타내면 다음과 같다.

이 방정식은 A가 가역행렬인 행렬 방정식 Ax = b의 형태이다.

c1, c2는 크라메법칙이나 가우스 소거법을 활용하여 구할 수 있다. 여기선 크라메법칙을 사용한다.

 

크라메 법칙은 xi = det Ai / det A이며(여기서는 x1 = c1이며, x2 = c2이다.), Ai는 A의 i번째 열벡터에 b( = (c1, c2))를 대입한 것이다. 

 

아래와 같은 피타고라스의 정리와 삼각함수 덧셈 공식을 적용하면 

 

앞서 구한 c1과 c2를 다음과 같이 단순화 된다.

 

 = c1

 

 

= c2

 

 

결론적으로 구면 선형 보간(spherical linear interpolation, slerp) 공식을 다음과 같이 정의할 수 있다.

만일 a와 b사이의 각도 θ가 0에 가까우면 sinθ도 0에 가까워지고, 그러면 유한한 수치 정밀도 때문에 나눗셈에서 문제가 발생할 수 있다.(정밀도에 의해 sinθ = 0일 때, 0으로 나누면 문제가 생긴다.) 그런 경우에는 두 사원수에 보통의 선형 보간을 적용하고 그 결과를 정규화하면 된다.

 

 

 

그림과 같이 각도 θ가 0에 가까울 때,

a, b를 선형보간을 사용하여 p'을 구하고 정규화하면 p를 얻을 수 있다.

 

 

 

 

 

 

일반 선형보간을 항상 적용하면 문제가 생긴다. 선형보간 후 단위구에 투영해보면 회전율(rate of rotation)이 선형이 아니다.

 

위 그림으로 보면 l1 = l2 = l3 = l4로 선형 보간을 하면 구면에서 회전율이 달라서(θ1 != θ2) s1 != s2임을 알 수 있다.

따라서 선형보간을 사용하면 구간마다 속도가 다르다.

 

 

- 회전에 대한 특별한 성질과 보간방향

 

사원수의 회전과 관련된 흥미로운 특징이 하나 있다.

q = (n sin(θ/2), cos(θ/2))이고,

s는 스칼라 값이라고 할 때,

(s q)* = s q*을 만족한다.

 

그러면 사원수 -q에 대한 회전연산을 다음과 같이 정의된다.

R -q (v) = -qv(-q)*

= (-1)qv(-1)q*

= qvq*

= R q (v)

 

q와 -q는 같은 회전을 나타낸다는 뜻이 된다.

 

사원수로 직접 표현해보면 다음과 같다.

q = (n sin(θ/2), cos(θ/2))

-q = (-n sin(θ/2), -cos(θ/2))

= (-n sin(π - θ/2), cos(π - θ/2)) // 삼각함수의 항등식 활용

= (-n sin((2π - θ)/2), cos((2π - θ)/2)) 

 

R q (v)는 n축으로 θ만큼 회전을 뜻하고, R -q (v)는 -n축으로 2π -θ만큼 회전을 의미한다.

 

이는 보간 시 a, b(n축으로 θ만큼 회전 or -n축으로 2π -θ만큼 회전)에서 b와 -b가 같은 방향을 나타내기 때문에

slerp(a, b, t)와 slerp(a, -b, t) 두 보간중에 하나를 선택해야한다. 

 

하나는 회전량이 최소가 되지만, 다른 하나는 먼 길을 돌아가게 된다.

따라서 b와 -b 중 어느 것이 더 짧은 호를 따라 보간되는지 확인 후 선택해야한다.

 

두 사원수 중 4차원 단위구 구면상의 호가 더 짧은 쪽을 찾으려면,

||a - b||² 과 ||a - ( - b)||² = ||a + b||² 을 비교하면 된다.

||a + b||² < ||a - b||² 이면 -b가 b보다 a에 더 가까운 것이며 -b일 때, 호가 더 짧다. 

 

기하학적으로 보면 아래와 같다. 이는 4차원 단위구 구면에 놓인 4차원 벡터인 사원수 입장에서 표현한 것이다.

 

 

- 최종 사원수 p와 q사이 보간 과정

 

1. q와 -q는 같은 회전을 나타내지만, 보간의 경로는 다르다.

따라서 더 짧은 호를 따라 보간하기 위해서 p-q의 크기와 p-(-q)를 비교한다.

 

2. p-q > p+q라면 -q로 보간 반대 상황이면 q로 보간한다. 이때 결정한 사원수를 r이라고 하자.

 

3. p와 r을 내적하여 사이각도를 구한다.

 

4.1. 만약 사이각도가 매우 작다면, 선형보간을 사용한다. 이때 선형보간 후 단위 사원수로 정규화를 해주어야 한다.

4.2. 사이각도가 매우 작지 않다면, 공식을 활용하여 구면 선형보간을 사용하여 보간 해준다.

 

 

 

 

'수학 > 선형대수학' 카테고리의 다른 글

내적  (0) 2022.11.16
Gimbal lock(짐벌락)  (0) 2022.06.11
여러 변환 정리  (2) 2021.11.12
행렬 대수 정리  (0) 2021.11.12
벡터 대수 정리  (0) 2021.11.12

+ Recent posts