현실 세계에서의 회전은 중심축을 설정하고 그것을 기준으로 물체를 돌리는 것을 의미한다.
그러나 가상 세계에서의 회전을 포함한 변환은 물체가 직접 움직이는 것이 아니라 물체를 담은 공간이 움직이는 것을 의미한다.
무한대로 뻗어있는 구간을 회전시키려면 표준기저벡터를 사용해야 한다.
평면에 속해있는 모든 벡터는 이 표준기저벡터 (1, 0)과 (0, 1)의 선형 조합으로 만들어지기 때문이다.
이처럼 공간의 변환이란 원 공간을 떠받들고 있었던 표준기저벡터를 변경시켜 새로운 공간을 창조시키는 작업이다.
그렇다면 표준기저벡터를 변경하면 어떻게 될까?
벡터 공간에 속한 모든 벡터들이 표준기저벡터가 변화된 모습에 따라서 다시 재배치된다.
이것이 바로 공간 변환의 원리이다.
이 원리를 바탕으로 회전을 어떻게 구현하는지 알아보자.
1. 회전 변환의 원리
- 회전 변환을 적용해 변환된 물체는 외형이 변하지 않는다.
- 따라서 두 표준기저벡터가 변했을 때 이 벡터가 가진 성질을 그대로 유지시켜 주면 회전 변환이 이루어질 수 있다.
2. 2차원 공간에서 두 표준기저벡터가 가지는 성질은 다음과 같이 2가지로 나뉜다.
- 각 표준기저벡터가 가지는 크기는 1로 고정되어 있다.
- 두 표준기저벡터는 서로 직교하여 90도 각을 이룬다.
그렇다면 2차원 평면에서 크기가 1인 벡터를 나열하면 어떻게 될까?
이 벡터들이 모이면 동그란 원이 만들어진다.
이때 반지름이 1인 원을 단위원이라고 한다.
이런 단위원 상에 위치한 두 벡터를 임의로 뽑으면 첫 번째 성질인 단위(크기)가 1인 두 개의 벡터를 뽑아올 수 있다.
이 두 개의 벡터 중에서 직각을 이루는 부분을 발견해 가져온다면 표준기저벡터가 가진 성질을 유지하는 2개의 새로운 벡터를 가지게 된다. 이것이 바로 회전의 기본적인 원리이다.
이 원호의 점을 어떻게 가져올 수 있을까?
이를 위해서는 삼각함수에 대해서 이해해야 한다.
원호 좌표 위의 한 점을 표현할 때 직교좌표계의 x, y를 사용해 나타낼 수도 있지만,
회전이라는 행동의 관점에서 보면 기준 위치에서 만큼의 각을 가지고 회전했는지를 회전한 각과 반지름을 사용해서 표현할 수 있다.
각도를 기준으로 위쪽 선에서 아래쪽 선으로 수선의 발을 내리면 직각 삼각형을 만들 수 있다.
이 직각 삼각형은 빗변, 밑변, 높이 세 가지로 구성되어 있으며 이 요소를 조합해서 만든 비를 삼각비라고 한다.
대표적인 삼각비는 높이/빗변, 밑변/빗변, 높이/밑변이 있다.
여기서 파생된 것이 삼각함수이다.
삼각함수란?
삼각형이란 도형은 모든 각이 90도 이내여야 한다는 제약이 있다.
이런 성질을 이용해 원으로 확장해서 함수로 표현한 것이 삼각함수이다.
삼각함수에서 높이/빗변은 sin(θ), 밑변/빗변은 cos(θ), 높이/밑변은 tan(θ)로 나타낼 수 있다.
그렇다면 원 위에 위치한 하나의 벡터를 삼각함수를 사용해 가져오는 방법은 무엇일까?
단위원의 반지름이 1일 때 삼각형의 빗변은 자동으로 1이 돼버린다.
따라서 밑변/빗변은 밑변/1이 되어 최종적으로 밑변이 되고 (= x, cos(θ))
높이/빗변은 높이/1이 되어 높이가 되고(= y, sin(θ))
높이/밑변은 tan(θ)이 된다.
결론적으로 단위원에서
sin(θ) = 높이 = y
cos(θ) = 밑변 = x
이 되는 것이다.
그렇기에 직교하는 두 개의 표준기저벡터에 임의의 각 θ가 주어졌을 때 그것이 어떻게 변하는지를 삼각함수를 이용해 도출해 낼 수 있게 된다.
두 삼각형이 합동인 상황이라면 두번째 표준기저벡터가 회전된 좌표는 (-sinθ, cosθ)가 된다.
이를 통해 회전 된 평면 공간이란 결국 두 표준기저벡터 (1,0) (0,1)을 두 벡터 (cosθ, sinθ), (-sinθ, cosθ)로 재구성 한 공간이라고 이야기할 수 있다.
어떤 임의의 점 (x,y)를 각 θ만큼 회전시킨다면 따로 계산을 할 수 있는데, 이 변환의 과정이 복잡하기 때문에 이를 더 쉽게 해결하기 위해 활용하는 것이 바로 행렬(Matrix)이다.
2차원 평면에서의 회전 행렬(Rotation Matrix)가 있을 때 첫번째 표준기저벡터와 두번째 표준기저벡터를 하나씩 열로 꽂아준 것과 같아진다. 이것을 행렬의 설계 원리라고 할 수 있다.
그런데 실제로 사용할 3차원 공간에서의 회전은 좀 더 까다롭다.
3차원 공간에서 임의의 2차원 평면을 설정하고 그것에 따라서 돌려줘야하기 때문이다.
게임에서는 이를 구현하기 위해서 크게 두가지 방식을 사용한다.
- 3차원 공간에서의 회전
1. 축-각 회전 (Axis-Angle Rotation)
<특징>
- 3차원 공간에서 임의의 회전축을 하나 설정하고 돌릴 점이 속해있는 평면을 하나 만들어, 이 평면에 따라서 회전을 시켜주는 방식이다.
- 대표적으로 로드리게스 회전 공식을 사용해서 계산한다.
<단점>
- 행렬로 변환하기가 까다롭기 때문에 렌더링 파이프라인의 중간에 위치한 파이프라인 흐름이 끊기게 되는 단점이 있다.
2. 오일러 각 회전 (Euler Angles Rotation)
<특징>
- x, y, z로 구성된 세 개의 표준기저벡터를 중심축으로 잡고 지정된 순서에 따라서 하나씩 돌려 총 3번 돌려주는 방식이다. 하나의 회전을 일부러 3번의 회전으로 쪼개서 진행한다.
- 기본 회전축은 기본적인 표준기저벡터를 사용하기 때문에 회전축의 정보는 생략하고 얼만큼의 각도로 돌아갔는지만 저장하게 된다.
- 따라서 행렬로 표현하기가 쉬워 더욱 직관적이고, 데이터가 적게 사용되는 방식이기 때문에 대부분의 3차원 소프트웨어에서 물체의 회전을 표현할 때 주로 사용된다.
<단점>
- 한 번의 회전을 3번에 걸쳐서 진행하기 때문에 임의의 축에 대해서 부드럽게 움직이는 회전을 계산하기가 어렵고 비효율적이다. (매 움직임마다 세 번씩 끊어서 다시 계산해야 함)
- 가끔씩 한 축의 회전이 증발하는 짐벌락 현상이 발생한다.
따라서 3차원 회전을 안정적으로 구현하기 위해서는 다차원의 수체계를 사용해서 해결해야 한다.
이를 바로 사원수(쿼터니언, Quaternion)이라고 한다.
'수학 > [강의] 게임 수학의 이해' 카테고리의 다른 글
회전의 수학 : 사원수 (0) | 2023.07.24 |
---|---|
물체의 수학 : 벡터의 내적과 외적 (0) | 2023.07.24 |
물체의 수학 : 삼각형과 정점 (점, 면에 대한 수학) (0) | 2023.07.24 |
물체의 수학 : 이동 변환 구현 원리 (0) | 2023.07.24 |
공간의 수학 : 개요 (0) | 2023.07.21 |