절대 빠져선 안될 중요한 개념!
삼각함수는 객체의 움직임이나 물리 엔진 등의 다양한 곳에서 사용된다.
게임에서 삼각함수가 어떻게 사용되는지 보면서 이해해 보자.
출처: https://m.blog.naver.com/jae3777/222477893422
삼각함수를 이해하기 위해서는 먼저 직각 삼각형에 대해 이해해야 한다. 빗변, 밑변, 높이라는 3개의 요소가 있음을 확인하자.
sin
, cos
, tan
은 각 변 끼리의 비율을 나타낸다는 것을 확인할 수 있다.
만약 세타가 30도면
$$ \sin 30° = \frac{1}{2} = 0.5 $$
이므로, 이는 높이가 빗변의 길이의 절반이라는 뜻이 된다. 코사인과 탄젠트도 이런 식으로 이해할 수 있다.
라디안(Radian)은 각도를 측정하는 단위로, 원의 반지름과 화의 길이 사이의 관계를 기반으로 정의되는 값이다.
- 1 라디안은 반지름이 r인 원에 길이가 r인 호를 그렸을 때, 그 호가 나타내는 각도이다
- 완전한 원인 2π 라디안(약 6.28 라디안)에 해당한다
- 1 라디안 약 57.3도에 해당한다
- 각도로 몇도인지 중요하진 않으니 외우진 말자
출처: https://www.tcpschool.com/codingmath/circular
각도를 활용하는 많은 곳에서 라디안은 정말 많이 사용된다.
라디안은 원의 각도를 측정하는 데 있어 매우 자연스럽고 꽤 직관적인 단위다.
지금 당장 60분법에 익숙한 많은 사람들에겐 조금 어색할 수 있지만 꼭 알아두어야 한다.
출처: https://news.samsungdisplay.com/17916
길을 가다가 경사로를 만나면, %단위로 기울기를 표시하는 것을 봤을 것이다.
이는 0.1 라디안에 매우 근사한다.
일상 속에서 라디안을 이렇게도 찾을 수 있다.
객체를 특정 각도로 이동시키려 할 때 사용할 수 있다. 만약 객체가 속도
v
로 각도θ
방향으로 이동할 때
- x축 이동량 =
v * cos θ
- y축 이동량 =
v * sin θ
유니티에서 해당 코드를 작성한다면 다음과 같다.
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°에 가까울수록 무한대로 발산하므로 사용에 주의를 요한다.
역삼각함수란 삼각함수의 역함수로, 비율로부터 각도를 구할 수 있다. 기존 삼각함수가 비율로부터 각도를 구했다면, 이는 그 반대인 것이다. 따라서 역함수라고 부른다.
- arcsin
- 어떤 값들의 비율에서 각도를 구한다.
- arccos
- 두 벡터 사이의 각도를 구한다.
- arctan
- 탄젠트 값으로부터 각도를 구한다.
- arctan2
- 두 좌표로부터 각도를 구한다.
arcsin은 특정한 값들의 비율에서 각도를 구할 때 사용한다. 비행기 속도의 비율을 통해 어떤 각도로 상승하고 있는지 계산하는데 쓸 수 있다.
비행기의 속도가 일정하다고 가정할 때, 상승 각도를 구하기위해 다음의 방법을 사용할 수 있다.
상승 각도 θ
= asin(상승 속도 / 총 속도)가 된다.
이를 유니티에서 코드로 나타대면 다음과 같다.
float verticalSpeed = planeVelocity.y; // y축 속도 (상승 속도) float totalSpeed = planeVelocity.magnitude; // 총 속도 float angleOfClimb = Mathf.Asin(verticalSpeed / totalSpeed) * Mathf.Rad2Deg; // 상승 각도 (도 단위)
y축 값이 변하는 속도와 그 객체의 실제 속도의 비를 이용해서 상승각을 구할 수 있다.