# 회전 계산

## 회전 계산

> 회전이란 크기가 1인 수와의 곱이다.&#x20;

### 공간 변환의 원리

* 공간의 변환이란 원 공간을 떠받들고 있었던 표준기저벡터를 변경시켜 새로운 공간을 창조하는 작업&#x20;
* 벡터 공간에 속한 모든 원소들이 표준기저벡터가 변화된 모습에 따라 모두 재배치된다. 이것이 공간변환의 원리

### 회전 변환의 원리

* 회전 변환을 적용해 변환된 물체는 외형이 변하지 않는다.&#x20;
* 표준기저벡터가 가지고 있던 성질을 그대로 유지시키면 회전변환을 만들 수 있다.

#### 2차원 공간에서 두 **표준기저벡터가 가지고 있는 성질** &#x20;

![](https://1912740209-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3GVYdZvmqQyBVq29ebqk%2Fuploads%2FgBepkrd02BFUZJL20Y3u%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202023-09-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.49.01.png?alt=media\&token=90072606-369f-409e-8e55-3c1a4e254320)

* 각 표준기저벡터가 가지고 있는 크기는 1이다.
* 두 표준기저벡터는 직교하고 있다. (1, 0), (0, 1) -> 두 지점이 직각을 이뤄야함

### 삼각함수로 회전의 변환 계산하기

<figure><img src="https://1912740209-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3GVYdZvmqQyBVq29ebqk%2Fuploads%2FbiTA29Dehjs4owGJBpgb%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202023-09-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.15.54.png?alt=media&#x26;token=dfe4472a-5b9d-43f1-bbfc-f516a1e99997" alt=""><figcaption></figcaption></figure>

* 첫 번째 기저벡터 **`(1, 0) → (cos(θ), sin(θ))`**&#xB85C; 변환이 된다.
* 첫 번째와 직교하는 두번쩨 기저벡터가 각 세타만큼 회전한 값은 **`(-sin(θ), cos(θ))`**&#xAC00; 된다.
  * 두 삼각형이 합동이기 때문이다.
* 따라서 회전된 평면 공간이란 두 표준기저벡터 **(1, 0), (0, 1) → (cos(θ), sin(θ)), (-sin(θ), cos(θ))**&#xB85C; 재구성한 공간이 된다.&#x20;

{% hint style="info" %}
**두 삼각형이 합동이라는 것**은 두 삼각형이 **모든 변의 길이, 대응하는 각도의 크기, 대응하는 변과 각도의 순서가 모두 일치**할 때, 그 두 삼각형은 합동이라고 한다.
{% endhint %}

## 행렬로 회전의 변환 계산하기

> 삼각함수의 복잡한 회전 변환 계산을 좀 더 쉽게 하기 위해 고안한 방법

### 2차원 평면의 회전 행렬

* 하나의 열에 삼각함수로 기저벡터가 변화된 값을 넣어 표현한다.

![](https://1912740209-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3GVYdZvmqQyBVq29ebqk%2Fuploads%2FbeMaDbFCuY5mGBxkolTJ%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202023-09-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.21.24.png?alt=media\&token=c577dfeb-56a8-48ba-9866-0e08f7b52656)

### 3차원 공간에서의 회전

> 임의의 2차원 평면을 설정하고 그것을 회전시키는 방식

#### **축-각 회전 (Axis-Angle Rotation)**

> 3차원 공간에서 임의의 회전축을 설정, 돌릴 점이 속해있는 평면을 만든 후  평면에 따라서 회전을 시켜준다.

* 대표적인 방법으로 **로드리게스 회전 공식**이 있다.
* 내적과 외적을 사용해서 계산하는 방식
* ![](https://1912740209-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3GVYdZvmqQyBVq29ebqk%2Fuploads%2Faua5pMvuTUCaTGURhJsw%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202023-09-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.30.00.png?alt=media\&token=7f92a421-d79a-4b85-b044-14923883d915)
* 행렬로 변환하기 어려워 전체 렌더링을 구성하는 렌더링 파이프라인의 흐름이 끊기게 된다.&#x20;
* 효율이 떨어져 잘 사용하지않음&#x20;

#### **오일러 각 회전 (Euler Angles Rotation)**&#x20;

> (x, y, z) 세개의 표준기저벡터를 중심축으로 잡고 지정된 순서에 따라 하나씩 돌려주는 방식&#x20;

* 하나의 회전을 3개로 쪼개서 회전하는 방식
* 기본 회전축은 인지하고 있는 표준기저벡터를 사용하므로  회전축에 대한 정보는 생략하고 얼만큼 돌아갔는지 각의 대한 정보만 저장하는 방식
* 직관적이고 데이터가 적게 사용되기 때문에 대부분의 소프트웨어에서 물체의 회전을 표현할 때 사용함
* 3번씩 끊어서 계산하기 때문에 임의의 축에 대해 부드럽게 움직이는 회전을 계산하기 어렵다.
* 한축의 회전이 증발해버리는 짐벌락 현상이 발생하기도 한다.

### 사원수 (쿼터니언)

> 3차원 회전을 안정적으로 구현하기 위해 다차원적인 수 체계를 이용해 해결한다.&#x20;

* 사원수란 네 개의 원소로 이루어진 수
* 수 에는 연산이 존재하여 단순 집합과는 차이가 있다. (집합은 원소의 묶음을 의미)
* 사원수는 하나의 실수와 세 개의 허수로 구성됨
  * `a + bi + cj + dk`, 하나의 실수 a와 세 개의 허수 i, j, k
* 3가지 허수를 3차원 x, y, z에 대응을 시키고 나머지 한 차원을 0으로 대입&#x20;
* 크기가 1인 사원수와의 곱은 4차원 공간에서의 회전을 의미한다.
* 사원수를 사용해 빠르게 벡터를 회전시킬 수 있다.
* 사원수 체계를 이해하기 까다롭고 직관적이지 않아 사용하기 어렵다.
* 사원수는 행렬로 변환이 용이하다.&#x20;
* 회전과 관련된 모든 계산은 내부적으로 사원수 체계에서 진행된다. &#x20;
* 하지만 유저인터페이스 단에서는 지정된 각을 다루기 편하도록 오일러 방식으로 변환해서 보여준다.
