개발하는 리프터 꽃게맨입니다.

[수학] 사원수: 4차원 수로 설계한 3차원 회전 본문

컴퓨터 그래픽스/수학

[수학] 사원수: 4차원 수로 설계한 3차원 회전

파워꽃게맨 2024. 7. 30. 19:28

사원수 대수

 

사원수는 복소수와 동일하게 허수를 사용하는 수집합이다.

복소수는 하나의 실수부와 하나의 허수부로 구성되었다면,

사원수하나의 실수부와 세 개의 허수부로 구성된다.

 

사원수는 세 허수부를 구성하는 단위를 각각 i, j, k 로 표시한다.

 

아일랜드의 수학자 해밀턴이 창시한 이 수 체계는 복소수가 허수 단위 i를 도입했듯 새로운 단위 j, k를 도입한 것이다. 복소수에서는 허수라고 하여 i² = 1 이라는 수를 만들었고 복소평면으로 2차원 평면에 수를 표현하였다. 여기서 해밀턴은 i와는 다르지만 j² = -1 인 수를 추가하여 3차원 공간을 표현하고자 했다. 그러면 대충 실수부 1개와 허수부 2개로 이루어진 삼원수 a + bi + cj 꼴의 수 체계가 나오게 된다. 그러나 삼원수는 존재하지 않는다. 삼원수에서는 교환법칙, 결합법칙, 나눗셈 정의 및 여러가지 역설들이 발생하기 때문이다.

 

그래서 한 단계 더 나아가 허수 k를 추가한 수 체계가 사원수이다. 

 

비록 단위는 i, j, k 등으로 다르게 표시하지만, 이들은 모두 허수 i와 동일한 성질을 가진다.

 

그러나 세 허수 단위 각각은 서로 다른 존재이다.

허수 단위들의 곱셈 규칙을 살펴보자.

두 허수의 곱은 다른 허수에 대응된다.

허수들끼리의 곱은 교환법칙이 성립하지 않으므로 이에 주의해야 한다.

 

허수들을 곱하는 순서눈 i -> j -> k -> i 순서로 대응된다.

 

이 식으로부터 ij = k 가 된다.

k² = -1 이므로 아래와 같은 식이 유도된다.

어떤 사원수 q는 다음과 같이 나타낼 수 있따.

q = a + bi + cj + dk

 

사원수의 집합 기호는 H이다. 이는 사원수를 고안한 헤밀턴의 이름을 따왔다.

사원수는 복소수와 유사하게 덧셈과 곱셈이 존재하며, 체와 유사한 구조를 지닌다.

 

사원수의 덧셈

사원수의 덧셈은 실수부는 실수부끼리 그리고 동일한 형태의 허수부끼리 더하는 형태로 진행된다.

 

사원수의 덧셈은 체의 공리 5가지를 만족한다.

 

  • 사원수의 덧셈은 닫혀있음
  • 사원수의 덧셈은 교환법칙을 만족함
  • 사원수의 덧셈은 결합법칙을 만족함
  • 사원수의 덧셈은 항등원이 존재함
    q = 0 + 0i + 0j + 0k

  • 사원수의 덧셈은 역원이 존재함
    반대수가 존재함

사원수의 곱셈

사원수의 곱셈은 해밀턴 곱으로도 불리며 모든 요소를 교차해 곱하는 방식으로 진행된다.

이는 항이 4개인 수식을 서로 곱하는 것과 동일하게 전개된다.

 

임의의 두 사원수 q1과 q2를 곱셈한 결과는 다음과 같다.

 

사원수의 곱셈은 총 5개의 체의 공리를 만족한다.

  • 곱셈에 대해 닫혀 있음
  • 곱셈에 대한 결합법칙이 성립함
  • 덧셈과 곱셈에 대한 분배법칙이 성립함
  • 곱셈에 대한 항등원이 존재함
    (a = 1, b = 0, c = 0, d = 0)
  • 곱셈에 대한 역원이 존재함
    켤레를 활용해 계산

단, 사원수의 곱셈은 교환법칙이 성립하지 않는다.

체의 구조를 만족하지 않기에 유사체 혹은 꼬인체 등으로 말한다.

 

따라서 사원수끼리 곱셈식을 전개할 때는 교환법칙이 성립하지 않는 것에 유의해야 한다.

 

사원수의 노름 Norm

사원수의 크기는 복소수와 동일하게 각 계수를 제곱한 값을 더하고 제곱근을 취한다.

이는 절댓값 기호를 써서 표기한다. 

 

사원수 중 크기가 1인 사원수를 단위 사원수라고 한다.

허수부의 계수가 음수인 사원수를 켤레 사원수라고 부르며 *기호를 붙여서 표기한다.

사원수와 켤레 사원수의 곱은 복소수와 켤레 복소수 간의 성질과 동일하다.

임의의 사원수에 그 켤레를 곱하면 크기의 제곱 값이 나온다.

따라서 단위 사원수 q 와 q* 의 곱은 항상 1이다.

 

복소수와 동일하게 사원수의 역원도 아래와 같이 구할 수 있다. 

여기서 크기가 1인 단위 사원수의 곱셈의 역원은 켤레 복소수가 됨을 알 수 있다.


사원수와 벡터

4개의 요소를 사용하는 사원수는 4개의 수 집합이 직교하는 4차원의 공간으로 시각화가 가능하다.

그런데 4차원 공간은 우리의 인식범위를 넘어가기에 상상하는 것 조차 힘들고 시각적으로 표현도 불가능하다.

 

그래서 사원수를 다룰 때는 4차원 공간을 1차원과 3차원으로 분리하고 3차원 공간의 성질을 관찰하는 것이 효과적이다.

 

사원수를 다룰 때는 허수부를 사용하는 3개의 계수를 벡터로 묶고, 나머지 실수부는 별도로 관리한다.

그렇다면 사원수는 다음과 같이 나타낼 수 있다.

따라서 사원수를 튜플로 나타내면 위와같이 두 가지 요소로 구성할 수 있다.

 

이 순서쌍의 원소를 차례대로 실수부, 허수부라고 하자.

혹은 이들을 스칼라부, 벡터부라고도 부른다.

 

이제 위와 같은 순서쌍을 이용해서 사원수의 덧셈과 곱셈을 표현해보자.

 

사원수 순서쌍의 연산

이제 두 사원수의 곱셈을 알아보자.

 

재밌게도 두 사원수의 곱은 내적과 외적으로 정리할 수 있다. 

 

사원수에서 실수부가 0인 사원수를 특별히 순허수 사원수라고 부른다.

순허수 사원수는 세 허수로만 구성된 수를 말하는데, 이는 3차원 벡터 공간에 대응되는 개념이다.

 

즉, 3차원 공간의 벡터 v = (x, y, z) 는 순허수 사원수에 대응된다고 할 수 있다.

이번에는 순허수 사원수 q1, q2의 곱셈을 전개해보자.

그러면 위 곱셈식에서 실수부를 전부 0으로 만들어주면 된다.

그러면 순허수 사원수의 곱셈식은 다음과 같이 정리된다.

 

 

 

 

사원수의 회전

 

오일러각과 사원수간의 관계를 파해쳐보자.

 

sin cos 함수와 자연지수함수 e 간의 등식이 성립하기 위해서는 크기가 1이고 제곱을 해서 -1 이 되는 수가 필요했다.

복소수 체계에서는 허수 i가 존재했기 때문에

 

다음의 오일러 공식을 전개할 수 있었다.

사원수에서도 복소수와 같이 크기가 1이고 제곱한 값이 -1인 수가 있다면 오일러 공식을 만족할 것이다.

먼저 크기가 1인 순허수 사원수를 qn 이라고 지정하고 직접 확인해보자.

 

앞서 봤던 순허수의 곱셈공식은 아래와 같다.

만약 qn을 제곱한다고 하면 그 값은 아래와 같을 것이다.

같은 벡터의 내적은 크기의 제곱이고

평행한 벡터의 외적은 0벡터이기 때문에 위와같이 전개된다.

 

그렇다면 오일러 공식의 전개 과정에 허수 i대신 순허수 사원수의 벡터 n 을 사용할 수 있다.

이렇게하면 자연상수의 지수함수로 사원수의 회전을 표현하는 것이 가능해진다.

 

이를 수식으로 정리하면 다음과 같다.

최종적으로 얻은 사원수 형태는 차원 공간에서 회전축 

을 중심으로 회전 변환하는 성질을 가지는데, 이를 회전 사원수라고 한다.

 

회전 사원수를 q, 크기가 1인 순허수 벡터를 n (a, b, c) 라고 했을 때, 단위 사원수의 노름은 구하면 항상 1이다.

 

즉, 회전 사원수는 항상 단위 사원수다.

 

이번에는 회전 사원수의 켤레 사원수가 가지는 의미를 알아보자.

회전 사원수의 켤레 사원수는

원 회전 사원수의 반대방향 회전을 의미한다.

 

이는 오일러 공식으로도 확인할 수 있다.

그러므로 회전 사원수의 켤레 사원수는 반대 방향 회전이라고 볼 수 있다.


회전 사원수를 이용한 3차원 공간에서의 회전

이번에는 회전 사원수 q를 사용해 임의의 회전축 n에 대해 3차원 공간의 벡터를 각 세타만큼 회전시켜보자.

 

우리가 일반적으로 사용하는 3차원 공간의 벡터 v는 순허수 사원수에 대응되는 개념이다.

벡터 v의 값을 (x, y, z) 로 표시하고, 회전축 n의 값을 (a, b, c)로 지정해보겠다.

 

회전 사원수 q를 사용해 벡터를 회전시키는 방법은 회전 사원수를 벡터 왼쪽에 배치하고 둘을 곱하는 것이다.

이 때, 사원수의 곱셈은 교환법칙이 성립하지 않기 때문에 곱하는 순서에 항상 신경쓴다.

 

만약, 벡터가 3차원 좌표라면 실수부가 0인 사원수로 확장시켜야 할 것이다.

 

계산 결과를 살펴보면 회전 사원수와 벡터를 곱한 결과는 순허수 사우너수가 아닌 일반 사원수가 나온다.

따라서 이 곱의 결과는 순허수 사원수와 1:1로 대응했던 3차원 공간을 벗어나게 되므로 3차원 공간의 요소로 사용할 수 없게 된다.

 

따라서, 3차원 공간에서 벡터를 회전시키는 용도로 사용하기 위해서는 항상 사원수 곱의 결과가 순허수 사원수여야만 한다.

 

이를 만족시켜주는 회전 사원수의 곱셈은 어떤 형태인지 확인해보자.

 

회전 사원수의 vec{n} 은 회전축의 역할을 수행한다.

 

이는 앞서 살펴본 로드리게스 회전 공식에서 언급한 축각 회전에 대응하는 벡터다.

우리가 회전시킬 벡터를 v라고 하자.

이제, 회전축 n에 수평인 성분과 수직인 성분으로 나눠보자.

이제 각 세타만큼 회전시킨 벡터를 v' 라고 한다.

우리가 원하는 벡터 v'는 v의 수직성분을 벡터를 세타만큼 회전시킨 다음에 v의 수평성분을 더해주면 얻을 수 있다.

 

따라서 3차원 공간에서의 회전은 다음과 같은 식이 될 것이다.

오일러 공식을 활용해 수식을 정리해보자.

여기서 회전 사원수와 벡터를 다음과 같이 간단히 정리할 수 있다.

 

여기서 실수부분의 내적값은 0이 되기에 아래와같이 정리할 수 있다.

이런 회전공식을 사용하면 회전 사원수의 곱으로 얻어지는 사원수는 항상 순허수 사원수가 된다.

즉, 항상 3차원 벡터 공간에 대응됨을 확인할 수 있다.

 

이제 최종적으로 v'을 얻어내보자.

 

여기서 평행판 벡터의 성질을 하나 알아야 한다.

 

회전축과 평행한 벡터의 경우 외적값이 0이 된다. 

사원수간의 교환법칙이 안되는 이유였던 외적이 사라지게 되므로

회전축과 평행한 벡터는 교환법칙이 성립한다.

 

더하여

 

인 이유는 식 내부에 외적이 존재했기 때문이다.

그러므로 위 식을 전개할 시, 허수부의 외적의 부호가 서로 반대이기 때문에 교환법칙이 성립하지 않는다.

그러나, 

이 수식은 말이 된다.

p*는 -세타 만큼 회전시키는 변환이므로 외적의 계수인 sin의 부호가 바뀌는 효과가 있다.

그러므로 위 등식이 성립하는 것이다.

자 이제 기존 식으로 돌아와서

위와같이 정리할 수 있다.

 

그런데 평행한 벡터와 수직한 벡터의 합은 원벡터이므로 아래와 같이 최종적으로 아래와같이 정리할 수 있다.

이제 이 식을 사원수로 표현해보자.

깔끔하게 식이 정리됐다.

 

여기서 회전 사원수의 값은 변화시키고자 하는 각의 절반만큼 적용된 것을 확인할 수 있다.

즉, 회전사원수의 각은 각/2 을 사용한다.

만약, 이 식이 3차원 좌표를 자유롭게 회전시킬 수 있다면, 연산 후 결과의 실수부가 0이어야만 한다.

그렇다면, 회전 사원수 실수부를 w 허수부를 r로 하여 전개해보겠다.

 

그러면 다음과 같이 전개할 수 있다.

 

여기서 실수부가 0인지 확인해보겠다.

실수부를 전개하면 스칼라 삼중곱 형태만 남게된다.

벡터 r과 벡터 v를 내적하면 항상 벡터 r에 직교하는 벡터가 나온다.

즉, 내적의 결과와 r를 내적하면 항상 0이 나온다.

 

스칼라 삼중곱이 세 벡터가 만들어내는 평행육면체의 부피라는 것을 앞서 설명했을 것이다.

스칼라 삼중곱을 이루는 벡터 중 두 벡터가 같으므로 해당 연산의 결과는 부피가 0인 평행육면체를 만들어낼 것이다.

 

어쨌거나, 실수부가 0임을 확인했다.

이것은 우리가 만들어낸 회전 공식이 항상 3차원 공간의 벡터에 대응되는 것이라고 여길 수 있다.

 

이제 허수부를 전개해보자.

식이 굉장히  복잡하지만 최종적으로 아래와 같은 간단한 식이 완성되었다.

여기서 r v의 외적부분을 t로 치환하면 최종적으로 회전공식은 다음과 같다.

이로써 사원수를 사용해 3차원 공간 벡터 v를 임의의 회전축 n을 중심으로 회전시키는 최종 수식이 완성됐다.

만약 이를 코드로 완성시킨다면 다음과 같다.

 

여기서 한가지 재밌는 사실은 사원수 회전 공식을 이용하면, 로드리게스 회전 공식이 유도된다는 것이다.

식을 삼각함수로 바꾼다음 세타로 식을 전개해보자.

 

 

연속하여 회전

회전 사원수는 회전축 벡터를 n이라고 했을 떄 축-각 회전을 구현한다.

그러면 두 개의 다른 각을 연속해서 회전시키는 경우를 알아보자.

 

만약 알파만큼 회전시킨 다음 베타만큼 회전시키는 경우가 있다고 하자.

 

여기세 벡터 v'를 위 식으로 치환해보자.

 

즉, 두 각을 연속해서 회전시키는 것은

두 각을 합 한 뒤 회전시키는 것과 동일한 벡터를 가리킨다.

즉, 회전 사원수와 회전 사원수의 곱을 두 각을 합한 사원수에 대응시키면, 더욱 효율적인 회전 로직이 완성될 것이다.


 

사원수의 변환

오일러 각에서 사원수로의 변환

사원수를 활용해서 3차원 회전을 구현하긴 했지만, 사원수 자체는 직관적이지 않다.

보통은 회전을 설계할 때는 오일러 각 방식이 더 편리하기 떄문에, 오일러 각의 값을 사원수로 변환해주는 기능이 있다면 유용하게 사용할 수 있을 것이다.

 

오일러 각의 회전은 x, y, z 기저축이 회전축의 역할을 수행한다.

그렇다면 사원수 회전에서 사용하는 회전축 벡터 n을 x, y, z 기저축으로 변경하면 될 것이다.

 

회전축을 x축하면서 좌표를 세타만큼 회전시키는 회전 사원수 q는 다음과 같이 설계할 수 있다.

따라서 오일러 각을 구성하는 롤, 피치, 요 회전에 대응하는 각 사원수는 다음과 같이 설계할 수 있다.

 

오일러 각을 앞서 롤, 피치, 요 순서대로 적용했으므로 이를 계산하면 다음과 같이 전개할 수 있다.


사원수에서 오일러 각으로의 변환

이제 사원수에서 오일러 각으로 변환해보자.

위 식에서 실수부분을 w 각 허수부를 x, y, z 로 치환해보겠다.

그리고 요 롤 피치의 절반각을 y, r, p 로 표기하고

이들의 sin 값을 sy, sr, sp

이들의 cos 값을 cy, cr, cp

로 지정해 식을 전개하면 다음과 같다.

사원수로부터 오일러 각을 구하려면 사원수를 잘 조합해 단일 각에 대한 삼각함수가 나오도록 식을 설정해야 한다.

 

롤 회전에 대한 삼각함수를 만들어주는 wz + xy 의 값을 계산해보자.

 

sin과 cos의 배각공식을 이용하여 간략하게 정리할 수 있다.

 

즉, 2(wz + xy) 는

같은 꼴로 정리할 수 있다.

 

같은 방식으로 1 - 2(z² + x²) 를 계산하면 

으로 정리할 수 있다.

 

그렇다면 위식을 아래식으로 나눠보자.

그러면 롤에대한 탄젠트 값이 나올 것이다.

이제 롤 회전의 값을 arctan 함수를 사용해 구할 수 있다.

이번에는 피치 회전각을 구해보자.

피치 회전에 대한 삼각함수를 만들어주는 wx - yz 값은 다음과 같이 전개된다.

 

따라서 피치 회전각은 다음과 같이 구할 수 있다.

단, arcsin의 정의역은 [-1, 1] 범위로 제한되어 있으므로 wx - yz 값이 [-0.5, 0.5] 값을 벗어나지 않는지 확인해야 하고,

벗어나는 경우에는 범위 내 가장 가까운 값으로 설정해야 한다.

 

남은 요 회전은 롤 회전과 유사한 방식으로 tan 함수 값을 구한 후 arctan 함수를 사용한다.


사원수에서 회전 변환행렬로의 변환

사원수에서 회전 변환행렬로 변환하는 식을 계산해보자.

회전 변환행렬은 로컬 축으로 구성되어 있기 때문에 사원수를 사용해 회전된 세 로컬 축의 값을 구하면 쉽게 해결할 수 있다.

 

즉, 로컬축 (1, 0, 0) (0, 1, 0) (0, 0, 1) 을 각각 회전 사원수 (w, (x, y, z)) 로 회전시키면 회전된 로컬 축을 얻어낼 수 있다. 이들을 구해서 정리하면 다음과 같다.

 

이들로 3x3 행렬을 구축하면 회전 변환행렬을 만들 수 있다.


회전 변환행렬에서 사원수로의 변환

회전 변환행렬의 요소를 조합해 사원수를 구성하는 x, y, z, w 의 값을 개별로 구해보자.

정방행렬의 대각 성분을 모두 더한 값을 트레이스라고 한다.

회전 변환행렬의 대각행렬 값을 모두 더한 트레이스 t는 다음과 같이 계산된다.

 

여기에 1을 더하면 제곱근을 씌울 수 있는 형태가 나온다.

회전 사원수는 실수부가 0인 단위 사원수이다.

 

즉, 회전 사원수의 크기는 항상 1이므로 다음과 같이 정리할 수 있다.

즉, t + 1 에 대한 식은 아래와 같이 정리할 수 있다.

 

즉, 식은 다음과 같이 정리할 수 있다.

제곱근을 사용해서 실수 w를 t에 관한 식으로 정리하면 다음과 같다.

제곱근을 씌운 t+1 을 r 로 치환하여 정리하였다.

여기서 구한 w값을 이용해 나머지 x, y, z 식도 구해보자.

위 식에서 대칭된 요소끼리의 차를 구해보자.

 

각각의 차를 계산하여 정리하면 다음과 같아진다.

그러면 아래와 같이 사원수를 얻어낼 수 있다.

float root = 0.f; 
float trace = InMatrix[0][0] + InMatrix[1][1] + InMatrix[2][2]; 

root = sqrtf(trace + 1.f); 
W = 0.5f * root;
root = 0.5f / root;  

X = (InMatrix[1][2] - InMatrix[2][1]) * root; 
Y = (InMatrix[2][0] - InMatrix[0][2]) * root;  
Z = (InMatrix[0][1] - InMatrix[1][0]) * root;

켄 슈메이크 알고리즘

그러나 이 방식으로 사원수를 구할 때는 예외 사항이 있다.

트레이스 값이 -1이면, root가 0이 되어서 나눗셈이 정의되지 않고

트레이스 값이 -1보다 작으면 root의 해가 존재하지 않는다.

 

이러한 경우 w가 아닌 다른 요소를 이용해서 계산해야 한다.

 

대각 성분들을 더하고 빼보자.

11행 - 22행 - 33행의 결과는

-1 + 4x² 이다.

 

이 값을 s라고 하자.

이를 이용해서 x, y, z 를 구할 수 있다.

x를 구했으면

대각성분을 구해서 xy, xz 에 대한 식을 얻은 다음에

x로 나눠주면 된다.

 

그리고 x, y, z를 모두 구했다면, xw, yw, zw 등의 값을 통해서 w값을 구할 수 있다. 

 

그렇다면 켄 슈메이크 알고리즘에 대해 정리해보자.

 

만약, 트레이스의 값이 -1보다 큰 경우에는 w값을 구할 수 있다.

그러나 t가 -1 에 가까워 질수록 오차가 커지기 때문에

트레이스의 값이 0보다 큰 경우에만 w 값을 구하는 로직을 사용한다.

 

아닐 경우에는 예외적인 공식으로 변환을 수행한다.

w를 제외하고 가장 큰 x, y, z 요소를 파악한다.

이는 각 대각행렬의 요소 값을 비교하면 확인할 수 있다.

어떤 두 대각성분의 값을 빼면

결과적으로 두 개의 미지수만이 남는다. 그 둘 값을 비교하여 가장 큰 x, y, z 요소를 파악한다.

 

그 다음 x, y, z 중 가장 큰 요소를 찾았다면, 위에서 말한 대각성분을 더하고 뺴서 x, y, z 값 중 하나를 얻어낼 수 있을 것이다.

그리고 해당 값을 이용해 나머지 x, y, z 값을 찾으면 될 것이다.

 

마지막으로 w 값은 xw, yw, zw 값을 이용해서 구할 수 있다.

 

사원수의 보간

 

사원수가 오일러 각에 비해서 가지는 장점은 다음과 같다.

 

  • 오일러 각과 쉽게 변환이 가능하며 회전행렬 제작이 용이하다.
  • 임의의 축에 대한 회전 표현이 가능하기 때문에 짐벌락 현상을 방지할 수 있다.
  • 임의의 축에 대한 회전 보간 값을 구할 수 있다.
  • 4개의 숫자로 회전을 표현하기 때문에 저장 공간을 효율적으로 쓸 수 있다
  • 행렬과 상호 변환이 가능하다.

다른 회전 방식에 비해서 사원수가 가지는 장점은 회전 보간이 가능하다는 점이다.

 

오일러각은 한 기저 축에 대해서만 선형성이 만족하고

행렬방식은 불가능하다.

 

그러나 사원수는 임의의 축에 대해 회전이 가능하기 때문에 어떤 회전이든 회전 보간이 가능하다.

그렇다면 회전 보간을 구현하는 방법에 대해 알아보자.

 

회전 보간을 가장 간단하게 구현하는 방법은 회전 사원수에 대한 회전 보간을 사용하는 것이다.

 

어떤 사원수를 q1이라고 하고, 최종적으로 사원수 q2를 만든다고 해보자.

그러기 위해서는 중간 사원수 q(t)를 얻어야 할 것이다.

 

그렇다면 중간 사원수를 구하는 식은 다음과 같다.

하지만 이렇게 얻은 사원수는 단위 사원수가 아니기 때문에

회전사원수로써 q(t)를 사용하려면 정규화를 거쳐야 한다.

이러한 보간법은 회전을 정확히 반영하지 못한다.

회전은 원 궤적으로 일어나는데 반해, 선형보간법은 점 q1, q2를 잇는 선분위의 점을 얻어내기 때문이다. 좀 더 나은 결과물을 얻기 위해서는 원 궤적 위의 중간 사원수를 얻어야 한다.

 

q1, q2가 이루는 각을 세타라고 하자.

해당 각을 비율 t를 사용해 각각

로 나뉜다.

 

이후에 추가할 예정

 

사원수의 활용

 

이후에 추가할 예정

 

연습문제

 

1. 행렬 곱셈으로 회전에 비해 사원수 회전이 가지는 장점을 서술하세요.

 

2. 아래 식이 성립하는 이유는 무엇인가



3. 사원수가 체의 성질을 만족함을 보여라.

 

4. 임의의 복소수 q = a + bi + cj + dk 가 있을 때, 해밀턴 곱 q*q 를 전개하라.

 

5. 사원수 클래스를 만들고, 사원수의 곱셈, 덧셈, 정규화, 노름, 역원, 켤레 사원수를 얻는 기능이 존재해야 한다.

 

6. 오일러 공식을 사원수 체계를 이용하여 확장하는 과정을 서술하라.

 

7. 회전 사원수의 켤레 사원수가 반대방향 회전임을 설명하라.

 

8. 어떤 벡터 v를 순허수 사원수를 곱해서 세타만큼 회전한 벡터 v'를 구하고자 한다. 그러면 식을 아래와 같이 전개할 수 있다.

 

이 수식의 문제점은 무엇인지 설명하고 해결방법을 서술하시오. (해결 방법으로 최종적인 사원수 회전식을 유도하면 됨)

 

필요한 과정

1) 위 수식의 문제점을 해결하는 회전 수식의 유도

2) 회전 수식이 정말 3차원 회전을 안전하게 수행할 수 있는지에 대한 증명

3) 최종적인 회전공식을 삼각함수 및 오일러 상수를 사용하지 않고 외적 내적으로 표현

 

9. 회전각과 회전축이 주어졌을 때, 사원수를 이용하여 회전한 결과를 출력해보자.

단, 회전 함수의 리턴값은 3차원 벡터여야 한다.

 

10. Rotator 구조체는 롤, 피치, 요에 대한 회전량을 가지고 있다. 만약 회전순서가 롤, 피치, 요 순서로 적용할 때, 이것을 이용해 사원수 회전행렬 q를 만들어내고 아래 좌표를 회전시켜라.

 

11. 회전 사원수를 오일러 각으로 변환시켜보자. 롤 피치 요 값을 각각 출력하면 된다.

 

12. 주어진 회전 사원수를 회전 변환 행렬로 바꾸어 출력해보자.

 

13. 켄 슈메이크 알고리즘의 등장 배경, 논리의 흐름, 코드 작성 및 설명