Post

(TIL) 2025-01-13

(TIL) 2025-01-13

삼각함수(Trigonometric Functions)


삼각함수는 각도와 삼각형의 변 길이 사이의 관계를 나타내는 함수이다. 동경위의 점과 원점, X축에 내린 발이 직각삼각형을 이루기 때문에 삼각함수라고 한다. 주로 직각삼각형의 비율을 기반으로 하며, 수학, 물리학, 공학, 그리고 게임 개발에서 폭넓게 사용된다.

삼각함수

선분 OX의 길이를 r이라고 하면 다음과 같은 삼각함수를 가진다.

삼각함수

삼각비

삼각비

직각삼각형 ABC에서 각 C가 직각이고 각 B를 θ 라 할 때,

엔디안

로 정의한다.

삼각비는 직각삼각형에서 정의된다. θ 가  0<θ<π 의 값을 갖고 반드시 양수값만 갖는다. 그에 비해 삼각함수는 임의의 각에서 대해서도 그 값을 정의 할 수 있다. 삼각비는 직각삼각형에서의 길이의 비이고 삼각함수는 원 위의 좌표의 값이다. 다시말해 좌표평면에 어떤 점이 주어지면 반드시 삼각함수의 값은 하나로 정해진다.

게임에서의 삼각함수의 활용

캐릭터 이동 및 회전

  • 회전 방향 계산 삼각함수는 캐릭터가 특정 방향을 바라보도록 회전할 때 사용된다. 예: atan2 함수를 사용하여 두 지점 간의 각도를 계산하고, 이를 통해 캐릭터의 회전 방향을 설정한다.
1
const angle = Math.atan2(targetY - playerY, targetX - playerX);
  • 원형 경로 이동 캐릭터나 오브젝트가 원형 궤도를 따라 움직일 경우, sin과 cos를 사용하여 좌표를 계산한다.
1
2
const x = centerX + radius * Math.cos(angle);
const y = centerY + radius * Math.sin(angle);

충돌 판정

  • 거리 계산 두 점 사이의 거리를 계산할 때 피타고라스의 정리를 활용하며, 이 과정에서 삼각함수를 사용할 수 있다. 두 점 (x1, y1)과 (x2, y2)의 거리를 계산한다
1
const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
  • 각도 기반 충돌 확인 sin, cos, tan을 사용하여 특정 방향에 있는 오브젝트가 충돌 범위 안에 있는지 확인할 수 있습니다.

시야(FOV, Field of View) 계산

  • 각도 기반 시야 판정 플레이어나 NPC가 특정 각도 범위 내에 다른 캐릭터를 볼 수 있는지 확인할 때 삼각함수를 사용한다.
1
2
3
4
5
6
7
8
//FOV가 90도인 경우
const dotProduct = dirX * targetX + dirY * targetY;
const magnitude =
  Math.sqrt(dirX ** 2 + dirY ** 2) * Math.sqrt(targetX ** 2 + targetY ** 2);
const angle = Math.acos(dotProduct / magnitude);
if (angle < Math.PI / 4) {
  console.log("Target is within the FOV");
}

투사체 경로 계산

  • 곡선 궤적 시뮬레이션 투사체(화살, 총알)가 포물선을 그리며 이동할 때 sin과 cos를 이용해 좌표를 계산한다.
1
2
3
const time = 0.1; // 경과 시간
const x = initialX + velocityX * time;
const y = initialY + velocityY * time - 0.5 * gravity * time ** 2;

이러한 삼각함수의 활용은 게임의 종류와 서버에서의 역할에 따라 다르지만, 대개 물리 연산이나 게임 플레이의 중요한 기초로 사용된다.

역삼각함수


역삼각함수는 “일반적인” 삼각함수의 반대 기능이다.

  • arcsin (sin⁻¹): 사인 값으로 각도를 구함.
  • arccos (cos⁻¹): 코사인 값으로 각도를 구함.
  • arctan (tan⁻¹): 탄젠트 값으로 각도를 구함.

일반적으로, 삼각비를 알지만 각을 모른다면, 대응하는 역삼각함수를 이용하여 각을 구할 수 있다.

This post is licensed under CC BY 4.0 by the author.