공부/인프런 - 청강대_이득우

5. 회전에 대한 수학 1 – 삼각함수와 회전변환

셩잇님 2022. 11. 28. 16:44
반응형

 

 

회전에 대한 수학 1 – 삼각함수와 회전변환 😚

 


이번 영상에서는 회전에 관해 이야기해 보겠습니다. 회전이란 무엇일까요? 앞선 영상에서 트랜스폼이란 크기, 회전, 이동이라는 3가지 변환을 순서대로 변환해주는 합성 변환이라고 했습니다. 이 중에서 회전은 별도로 주제를 빼서 설명해 드릴 만큼 독특한 변환입니다.

 

우리가 현실 세계에서 회전한다면 중심축을 설정하고 물체를 돌리면 됩니다. 하지만 앞선 영상에서도 게임에서는 가상세계의 변환이라는 것은 공간이 돌아간다는 개념이라고 했습니다. 따라서 가상세계에서 회전을 구현하기 위해서는 물체가 돌아가기보단 공간이 돌아가야 합니다. 그렇다면 이 무한대로 뻗어있는 벡터 공간을 어떤 방식으로 돌릴 수 있을까요? 지난 시간에서는 표준 기저 벡터에 관해 설명했습니다.

 

 

예를 들어 어떤 벡터 공간을 집이라고 한다면 이를 떠받들고 있는 주춧돌로 표준 기저 벡터를 설명할 수 있습니다. 왜냐하면 벡터 공간의 모든 벡터는 결국 표준 기저 벡터의 선형 조합으로 만들어지기 때문입니다.

 

그렇다면 이 표준 기저 벡터를 변경하면 어떻게 될까요? 벡터 공간에 속한 모든 원소가 표준 기저 벡터가 변화된 모습에 따라 모두 다시 재배치가 될 것입니다. 이것이 바로 공간 변환의 원리라고 할 수 있습니다. 이 원리를 바탕으로 회전을 어떻게 구현하는지 알아보겠습니다.

 

 

회전 변환이 가지고 있는 특징 중 하나는 물체의 모습이 변하지 않는다는 것입니다. 따라서 두 표준 기저 벡터가 어떻게 변했을 때 두 표준 기저 벡터가 가지고 있던 성질을 그대로 똑같이 유지해 주면 바로 회전 변환이 될 수 있습니다. 즉, 회전 변환을 적용해 변환된 물체는 외형이 변하지 않는다. 표준 기저 벡터가 가지고 있던 성질을 그대로 유지해 변환시켜준다.

 


 

그렇다면 2차원 평면을 구성하는 두 표준 기저 벡터는 어떤 성질을 가졌는지 살펴보겠습니다. 자 그림에서 보는 것처럼 먼저 각 표준 기저 벡터의 크기는 항상 1입니다. 그리고 두 표준 기저 벡터는 서로 직교하고 있습니다. 이렇게 두 표준 기저 벡터가 가지고 있는 크기가 1, 서로 직교하는 성질을 우리가 계속 유지해 주면 우리는 회전 변환을 만들 수 있습니다. 2차원 평면에서 크기가 1인 벡터를 나열하면 어떻게 될까요? 그림에서 보는 것처럼 모이면 동그란 원이 만들어지게 됩니다.

 

이렇게 반지름이 1인 원을 단위 원이라고 합니다. 이러한 단위 원상에 있는 두 벡터를 임의로 뽑는다면 첫 번째 조건인 크기가 1인 두 개의 벡터를 가져올 수 있습니다. 이러한 두 개의 벡터 중에서 서로 직각을 이루는 어떤 쌍을 우리가 발견하여 가져온다면 이것은 바로 표준 기저 벡터가 가지고 있는 성질을 그대로 유지하는 두 개의 새로운 벡터라고 할 수 있습니다. 이것이 바로 2차원 공간의 회전변환 원리라고 할 수 있습니다. 3차원, 4차원도 마찬가지입니다. 그렇다면 우리는 원호의 점을 어떻게 가져올 수 있을까요? 이를 가져오기 위해서는 바로 오늘의 주제인 삼각함수에 대해 이해해야 합니다.

 


 

원호 위의 한점을 표현하기 위해 우리는 직교좌표 계상에서 X, Y라는 데이터를 사용해서 표현했습니다. 그러나 회전이라는 행동에 관점에서는 기존 위치에서 얼마만큼의 각을 사용해서 회전했는지, 회전한 각과 반지름을 사용해서 표현할 수 있습니다.

 

 

이 그림에서 수선을 내리면 직각삼각형이 만들어집니다.

 

 

이 직각삼각형은 빗변, 밑변, 높이의 3가지 부분으로 구성되어 있습니다. 이것들을 조합해서 만든 비를 삼각비라고 합니다.

 

 

대표적인 삼각비로는 높이/빗변, 밑변/빗변, 높이/밑변이 3가지 종류가 있습니다.

여기서 파생된 것이 삼각함수입니다. 삼각형이란 도형은 모든 각이 90도 이내여야 한다는 제한이 있지만, 이러한 비율을 원으로 확장해서 함수로 표현한 것이 바로 삼각함수입니다.

 

앞에서 얘기한 3가지 종류를 삼각함수에서는 Sin 함수, Cos 함수, Tan 함수라고 이야기합니다. 그렇다면 원 상의 위치한 하나의 벡터를 우리가 삼각함수를 사용해서 가져올 수가 있다고 했습니다. 어떻게 가져올 수 있을까요?

 


 

 

그림을 보면 우리가 사용하는 단위 원의 반지름의 크기가 1이라면, 빗변분의 밑변은 밑면이 되고, 빗변분의 높이는 높이가 됩니다.

 

그렇다면 원 상의 위치한 임의의 한 점의 삼각함수를 표현한다고 하면 Cos(θ), Sin(θ)이라고 이야기할 수 있습니다. 지금 보이는 것은 삼각함수를 설명할 때 많이 사용하는 이미지입니다.

 

X축을 담당하는 변은 밑변입니다. 이것은 코사인함수와 관련있다고 했습니다. 그리고 Y축에 해당하는 것은 높이인데 이것은 사인함수와 관련이 있습니다. 그래서 우리가 각을 계속해서 늘려나간다면 그림에서 보이는 것처럼 파형을 만드는 것을 확인할 수 있습니다. 여기에서 우리가 필요로 하는 것은 직교하는 두 개의 표준 기저 벡터가 임의의 각 세타(θ)가 주어졌을 때 어떻게 변화되는지, 또한 그 좌표를 삼각함수를 통해  어떻게 얻어낼 수 있는가? 라는 것입니다.

 

먼저 첫 번째 표준 기저 벡터인 (1, 0)에 대해 살펴보겠습니다. 이것은 아까 본 것처럼 코사인 θ, 사인 θ에 좌표로 변환됩니다.

그렇다면 첫 번째와 직교하는 두 번째 표준 기저 벡터가 각 θ만큼 회전한 것은 어떻게 될까요?

 

두 삼각형은 합동이기 때문에 두 번째 표준 기저 벡터가 회전한 좌표는 –사인 θ, 코사인 θ가 됩니다. 따라서 회전된 평면 공간이란 결국 두 표준 기저 벡터 (1, 0)과 (0, 1)을 두 벡터 (cos θ, sin θ)와 (-sin θ, cos θ)를 통해 재구성한 공간이라고 이야기할 수 있는 것입니다.

 

 

어떤 점, 벡터 공간의 임의의 점 (X, Y)를 각 θ만큼 회전을 시켰다고 하면 화면에 보이는 것처럼 계산할 수 있습니다. 그런데 결과가 좀 복잡합니다. 수학자들은 이러한 변환을 쉽게 계산하기 위해 새로운 방법을 고안합니다. 그것이 바로 첫 번째 영상에서 언급한 행렬입니다. 그렇다면 이러한 행렬을 어떻게 설계해야 할까요?

 

 

지금 이 행렬을 천천히 살펴보면 앞서서 첫 번째 표준 기저 벡터와 두 번째 표준 기저 벡터가 각각 변환 값을 구했습니다. 그것들을 하나씩 열로 꽂아준 결과라고 볼 수 있습니다. 이것이 바로 행렬의 설계 원리입니다. 이렇게 2차원 평면에서 진행하는 회전변환에 대해 알아보았습니다.

 


 

우리가 실제로 사용하는 3차원 공간에서의 회전은 더욱 까다롭습니다. 3차원 공간에서 임의의 2차원 평면을 설정하고 그것에 따라 돌려줘야 하기 때문입니다. 게임에서는 이를 위해서 크게 2가지 방식을 사용합니다.

 

첫 번째 방법으로는 3차원 공간에 임의의 회전축을 하나 설정합니다. 그리고 우리가 돌릴 점이 속해있는 평면을 하나 만들고 그 평면을 따라서 회전을 시켜주는 방법이 있습니다. 이것이 -각 회전입니다.

 

 

두 번째 방법으로는 X, Y, Z 3개의 표준 기저 벡터를 중심축으로 잡고 지정된 순서에 따라서 하나씩 돌려주는 총 3번 돌려주는 방식을 사용합니다. 이것을 오일러 각 회전이라고 합니다.

 

 

첫 번째 축-각 방식의 대표적인 방법으로는 로드리게스 회전공식이 있습니다. 로드리게스 회전은 앞에서 언급한 내적과 외적을 사용해 다음과 같은 공식으로 계산할 수 있습니다.

 

 

공식이 복잡합니다. 저는 학교에서 학생들에게 내적 연산과 외적 연산을 사용하는 연습문제로 굉장히 잘 활용하고 있습니다.

 

 

오일러 각 방식은 하나의 회전을 일부로 3번의 회전으로 쪼개서 진행하는 방식입니다. 기본 회전축은 우리가 다 인지하고 있는 표준 기저 벡터를 사용하고 있으므로 회전축에 대한 정보는 생략하고 얼마나 돌아갔는지 각에 대한 정보만 저장하는 방식입니다. 이 방식은 직관적이고 데이터가 적게 사용되기 때문에 대부분 3차원 소프트웨어에서 물체의 회전을 지정할 때 많이 사용합니다.

 

그런데 이 두 가지 방식 모두 단점이 있습니다. 앞서 언급한 로드리게스 방식은 행렬로 변환하기 까다롭습니다. 행렬로 변환하지 않으면 전체 렌더링을 구성하는 파이프라인의 흐름이 끊기게 됩니다. 그래서 오히려 역으로 효율이 떨어지는 문제가 발생합니다.

 

오일러 각 방식은 손쉽게 행렬로 만들 수 있는 반면에, 한 번의 회전을 3번으로 나누어 진행한다고 말씀드렸습니다. 그러므로 임의의 축에 대해 부드럽게 회전하는 움직임을 표현할 때 움직임마다 3번씩 나누어 계산하기 때문에 비효율적이고 까다롭다는 문제가 있습니다. 그리고 가끔가다 한 축의 회전이 증발해버리는 짐벌락 현상이 발생합니다.

 

* 축-각 방식의 단점

행렬로 변환하기 어려워서 렌더링 파이프라인의 중간에 있는 파이프라인 흐름이 끊기게 된다.

* 오일러 각 방식의 단점

임의의 축에 대해 부드럽게 움직이는 회전을 계산하기가 어렵다.

 

그렇다면 3차원 회전을 어떻게 안정적으로 구현할까요? 수학자와 공학자는 이러한 문제를 해결하기 위해 다차원의 수 체계를 사용해서 해결했습니다. 이것이 바로 사원수(Quaternion)입니다. 다음 영상에서는 사원수에 대해 알아보겠습니다.

 

 

반응형