비트를 쪼개는 개발자

allen321@naver.com

게임수학

게임수학 - 삼각함수

MozarTnT 2024. 7. 15. 16:39
728x90
반응형

 

 

 

삼각비와 삼각함수

 

 

삼각비란?

 

  • 직각삼각형에서 각도와 변의 길이 사이의 관계를 나타내는 말.

 

  • 삼각비는 사인(sin), 코사인(cos), 탄젠트(tan)의 세 가지 기본적인 함수(삼각함수)로 표현함.

 

  • 값을 모르는 특정 각을 표현함(각도)를 "세타(θ)" 로 표현함

 

 

 

삼각함수란?

 

 

  • 삼각함수는 각도와 관련된 함수로, 주로 직각삼각형의 변의 비율을 설명하는 데 사용함.

 

  • 특정 값을 입력하면 삼각비의 결과를 반환하는 함수라고 볼 수 있음.

 

 

 

  • 사인 (sin): 직각삼각형에서 주어진 각 θ를 반대변의 길이를 빗변의 길이로 나눈 비율 (높이 / 빗변)
  • 코사인 (cos): 직각삼각형에서 주어진 각 θ의 인접변의 길이를 빗변의 길이로 나눈 비율 (밑변 / 빗변)
  • 탄젠트 (tan): 직각삼각형에서 주어진 각 θ의 반대변의 길이를 인접변의 길이로 나눈 비율 (높이 / 밑변)

 

 

 

 

  θ = 0 θ = 45 θ = 90
sin(θ) 0 \( \frac{\sqrt{2}}{2} \) 1
cos(θ) 1 \( \frac{\sqrt{2}}{2} \) 0
tan(θ) 0 1 ∞(0을 나눠야 함)

 

 

 

 

유니티에서의 활용 예시

 

 

  • 삼각함수를 활용하면 나와 적 오브젝트와의 거리를 계산하거나 각도를 받아와 여러 방면에서 활용이 가능하다.

 

 

 

  • 플레이어의 위치 좌표가 (0,0)일때 적 캐릭터 와의 거리를 받아오자.
  • 직선의 거리일 경우에는 눈금을 보면 쉽게 계산이 가능하지만 대각선의 길이는 삼각 함수를 이용해 거리를 구해야 한다.
 public void GetSinAngle()
 {
     var enemyDistance = Mathf.Sqrt(Mathf.Pow(enemyTransform.position.x, 2) + Mathf.Pow(enemyTransform.position.z, 2)); // 빗변의 길이
     Debug.Log("enemyDistance = " + enemyDistance);
     
     var sinTheta = enemyTransform.position.z / enemyDistance;

     var arcSin = Mathf.Asin(sinTheta);

     Debug.Log("Theta = " + arcSin * Mathf.Rad2Deg);
 }

 

 

대각선의 길이(적과 나와의 거리)

  • 적 오브젝트와 나와의 거리를 변수 enemyDistance로 받아온다.
  • 피타고라스 정리를 이용해 적 오브젝트와 나와의 대각선의 길이를 구한다.
  • 가로 길이는 enemyTransform의 position 값의 x축이고, 세로는 z축이다.
  • Mathf.Sqrt 함수를 이용해 제곱근을 구해주고 Mathf.Pow 함수를 이용해 해당 값의 제곱을 계산 한다.
  • Debug.Log를 이용해 해당 값을 받아온다.

 

 

 

 

각도(적과 나와의 각도)

 

  • sin(θ) = (높이/빗변) 임.
  • 높이의 경우는 세로값이므로 조금 전에 알아낸 enemyTransform의 position 값의 z축이고, 빗변의 경우는 조금전에 계산한 대각선의 길이(enemyDistance) 임.
  • 해당 값을 sinTheta에 저장하고 Mathf.Asin 함수를 이용해 아크사인(역사인)을 계산하는 데 사용함. (반환값은 라디안*임)

라디안은 원의 반지름 만큼 길이를 가진 호로 나눈 단위임. 각도를 표기할때 degree를 보통 사용하지만 수학에서는 라디안을 사용하는 경우도 있음. (360도 = 2πrad   //  1rad = 57.2958도 정도)

 

 

  • 해당 라디안 값을 degree 값으로 변환하기 위해 arcSin 값을 Mathf.Rad2Deg 함수를 이용해 몇도 인지 확인함.

 

 

 

 

 

적과의 거리는 7.61정도, 각도는 66.8 도 라고 잘 나오는것을 확인할 수 있음.

 

 

 

 

 

 

 

 

사실 유니티에는 Vector3.Distance 함수와 Vector3.Angle 함수를 이용해 간단하게 원하는 오브젝트와의 거리와 각도를 언제든 호출할 수 있음.

 

(Vector3.Angle의 경우는 Vector에 대한 개념이 필요하기 때문에 다른 글에서 정의하도록 하겠음.)

 

 

 

 

 

 

Vector3.Distance 함수는 간단하게 내 위치와 적의 위치값을 입력하면 거리를 반환해 줌.

 

 public void GetDistance()
 {
     var enemyDistance = Mathf.Sqrt(Mathf.Pow(enemyTransform.position.x, 2) + Mathf.Pow(enemyTransform.position.z, 2)); // 빗변의 길이
     Debug.Log("enemyDistance = " + enemyDistance);

     var unityDistance = Vector3.Distance(transform.position, enemyTransform.position);
     Debug.Log("unityDistance = " + unityDistance);
 }

 

 

 

 

 

 

 

매번 Vector3.Distance 를 사용했지만 삼각함수를 이용해 해당 원리를 직접 한번 구현해 보는것은 한번쯤은 직접 코딩 해보는 것이 좋다고 생각함.

 

 

 

 

 

 

 

 

 

그림 출처 : https://news.samsungdisplay.com/24578/

 

과학·공학의 필수! 주기를 그리는 '삼각함수'

고대 문명에서 발견된 삼각형의 진리 기원전 4,000년경, 티그리스강과 유프라테스강 사이에 형성된 넓고 비옥한 평야에서 세계 4대 문명 중 하나인 메소포타미아 문명이 탄생한다. 메소포타미

news.samsungdisplay.com

 

728x90
반응형

'게임수학' 카테고리의 다른 글

게임수학 - 벡터  (0) 2024.07.16