게임 개발에서의 삼각함수

절대 빠져선 안될 중요한 개념!

삼각함수는 객체의 움직임이나 물리 엔진 등의 다양한 곳에서 사용된다.

게임에서 삼각함수가 어떻게 사용되는지 보면서 이해해 보자.


직각 삼각형과 삼각함수

출처: https://m.blog.naver.com/jae3777/222477893422

출처: https://m.blog.naver.com/jae3777/222477893422

삼각함수를 이해하기 위해서는 먼저 직각 삼각형에 대해 이해해야 한다. 빗변, 밑변, 높이라는 3개의 요소가 있음을 확인하자.

sin, cos, tan은 각 변 끼리의 비율을 나타낸다는 것을 확인할 수 있다. 만약 세타가 30도면

$$ \sin 30° = \frac{1}{2} = 0.5 $$

이므로, 이는 높이가 빗변의 길이의 절반이라는 뜻이 된다. 코사인과 탄젠트도 이런 식으로 이해할 수 있다.


라디안 (호도법)

라디안(Radian)은 각도를 측정하는 단위로, 원의 반지름과 화의 길이 사이의 관계를 기반으로 정의되는 값이다.

출처: https://www.tcpschool.com/codingmath/circular

출처: https://www.tcpschool.com/codingmath/circular

각도를 활용하는 많은 곳에서 라디안은 정말 많이 사용된다.

라디안은 원의 각도를 측정하는 데 있어 매우 자연스럽고 꽤 직관적인 단위다.

지금 당장 60분법에 익숙한 많은 사람들에겐 조금 어색할 수 있지만 꼭 알아두어야 한다.

출처: https://news.samsungdisplay.com/17916

출처: https://news.samsungdisplay.com/17916

길을 가다가 경사로를 만나면, %단위로 기울기를 표시하는 것을 봤을 것이다.

이는 0.1 라디안에 매우 근사한다.

일상 속에서 라디안을 이렇게도 찾을 수 있다.


Sin과 Cos의 활용

객체를 특정 각도로 이동시키려 할 때 사용할 수 있다. 만약 객체가 속도 v 로 각도 θ방향으로 이동할 때

유니티에서 해당 코드를 작성한다면 다음과 같다.

float velocity = 5.0f;
float angle = 45.0f * Mathf.Deg2Rad; // 각도를 라디안으로 변환
float xMovement = velocity * Mathf.Cos(angle);
float yMovement = velocity * Mathf.Sin(angle);

tan은 이들에 비해 비교적 덜 사용된다.

$$ \tan \theta = \frac{sin \theta} {cos \theta} $$

가 되기 때문에 단순히 탄젠트가 필요한 경우는 모두 사인과 코사인의 비로 대체될 수 있다.

그리고 탄젠트는 90°에 가까울수록 무한대로 발산하므로 사용에 주의를 요한다.


역삼각함수

역삼각함수란 삼각함수의 역함수로, 비율로부터 각도를 구할 수 있다. 기존 삼각함수가 비율로부터 각도를 구했다면, 이는 그 반대인 것이다. 따라서 역함수라고 부른다.

  1. arcsin
  1. arccos
  1. arctan
  1. arctan2

역삼각함수의 사용 예시

arcsin

arcsin은 특정한 값들의 비율에서 각도를 구할 때 사용한다. 비행기 속도의 비율을 통해 어떤 각도로 상승하고 있는지 계산하는데 쓸 수 있다.

비행기의 속도가 일정하다고 가정할 때, 상승 각도를 구하기위해 다음의 방법을 사용할 수 있다. 상승 각도 θ = asin(상승 속도 / 총 속도)가 된다.

이를 유니티에서 코드로 나타대면 다음과 같다.

float verticalSpeed = planeVelocity.y;     // y축 속도 (상승 속도)
float totalSpeed = planeVelocity.magnitude; // 총 속도
float angleOfClimb = Mathf.Asin(verticalSpeed / totalSpeed) * Mathf.Rad2Deg; // 상승 각도 (도 단위)

y축 값이 변하는 속도와 그 객체의 실제 속도의 비를 이용해서 상승각을 구할 수 있다.