삼각함수에 아크(arc)는 삼각함수의 역함수를 나타내는 것이다.

삼각함수는 각도 -> 변의 비율 을 알수 있다면

역삼각함수는  변의 비율 -> 각도 를 알수 있다.

 

그럼 역삼각함수중 왜 아크탄젠트를 알아야 되는것인가??

우선 탄젠트에 대해 알아보자 

Atan를 사용해도 음수값을 알수 없기에 범위가 한정적이다.

 

탄젠트는 높이(y) 밑변(x)라는 직관적인 값 덕분에 사용하고 싶었지만 음수값이 나오지않기에 사용을 못했지만

개발자들이 사용하기 위해 x,y자체가 양수인지 음수인지를 통해 360도를 다 구분할 수 있게 구현한 것이다.

 

Atan2(y,x) 라는 메서드로 구현한 것이다.

이를 통해 (x,y)에서 Math.Atan2(y,x) 함수를 사용하여 벡터가 x축과 이루는 각도를 [ -pi , pi ] 까지의 값을 얻을수있다.

(p.s pi는 180도가 되도록 표현하는 것을 호도법 , 그리고 그 단위를 라디안이라고 부름 , 즉 라디안에서 pi = 180 이라고 생각하면됨)


그럼 Atan2(y,x) 메서드를 어디에 사용해야되느냐?

2D에서 점 또는 벡터에 대한 각도를 찾는데 사용된다.

즉,  객체가 특정 방향을 향하도록 만들거나 두 점 사이의 각도를 계산할때 유용해진다.

 

예시) 몬스터가 90도 범위의 시야각을 가지고 있을때, 캐릭터가 범위 안에 있는지 없는지 판정을 어떡해 구현해야되는가?

우선 몬스터-캐릭터의 거리를 구해야하기에 벡터의 뺼셈을 이용해야 된다.

(벡터의 뺼셈을 이용하여 두 벡터간의 거리를 구할 수 있다. [목표 지점의 벡터 - 이동 및 바라보는 객체의 벡터] )

 

구해진 벡터(x,y)를 Atan2(y,x) 메서드에 인자값으로 넣을경우 각도가 반환되는데 -45 ~ 45도 사이에 있으면 몬스터 시야에 캐릭터가 있다고 판단하면된다.

(중요 :: Atan2(y,x)로 반환된 각도의 단위는 라디안이기에 degree로 바꿔줘야한다)


 

예시2) 2D 게임에서 마우스 위치를 기준으로 좌우반전 구현

마우스 위치를 기준으로 캐릭터가 좌우 반전 하고 있는 모습

 

두 벡터의 거리를 알기위해 [ 마우스의 위치 - 캐릭터의 위치 ] 벡터 뺼셈을 이용하여 거리(방향벡터)를 구하고

해당 벡터를 Mathf.Atan2(y,x) * Mathf.Rad2Deg 를 이용하여 각도값을 반환한다.

 

반환된 각도값은 두 객체간의 각도를 나타낸다. 

Atan2의 반환 각도 범위는 [ -pi , pi ]여서 좌표계에 이렇게 각도를 표시하였다.

이 그림을 보면 1사분면,4사분면에 있을때는 절대값이 90도를 안넘기에 스프라이트를 반전하지 않아도 되고

2사분면,3사분면에 있을때는 절대값이 90도를 넘기에 스프라이트를 반전하게 된다.

이런식으로 flip을 적용시킨다.

 


결론 :

1. Atan2는 각도를 알기 위해 y와 x의 비율을 통해 각을 알아내는 함수이고 [-180 , 180] 범위에서 각도 반환값을 제공한다.

2. Atan2를 사용한뒤 객체에 회전값을 입력할떄 Rad2Deg를 사용해야한다.

(유니티 내부는 쿼터니언 inspector는 오일러이기 때문에)

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

게임수학 :: 삼각함수 기초 (작성중)  (0) 2024.10.08

우리가 흔히 알고 있는 삼각함수 이다.

학교에서 가르켜주니까 그냥 배웠던 경우가 더욱 많을것이고 나도 그렇게 삼각함수를 배웠다.

 

게임개발시 수학은 막 전공자들 급으로 깊게 파고 들지않아도 되지만 기본은 알고있어야한다.

왜냐하면 이 삼각함수로 적이 내 시야각에 있는지, 적과 나의 거리가 얼마나 되는지 정말 많은것에 사용되기 때문이다.

 

삼각함수 : 각도를 통해 삼각형들의 각 변의 비율을 알아 낼 수 있는 함수

말이 딱딱하게 들릴 수 있는데 간단히 생각해보면 이해가 간다.

 

예시로 sin(30) = 1/2 인것은 알고 있을것이다. 또한 sinA = 높이 / 빗변 로 표현 할수있다.

sin(30) = 1/2 , sinA = 높이 / 빗변 2개의 정보를 알고 있으면 

빗변의 길이는 높이의 2배이구나! 라는 것을 알수 있기 때문이다. 

 

 

+ Recent posts