Programing/Unity(C#)

[C#] 특정 방향(벡터)의 각도(angle) 구하기

hye3193 2024. 8. 7. 19:05

발사 지점에서 플레이어를 향해 레이저를 발사시키는 기능을 만드는데, 발사 지점의 position과 플레이어의 position을 받아와 발사지점에서 플레이어까지의 벡터는 구했으나, 레이저를 방향에 맞게끔 회전시키는 작업을 해 줘야 했다

 

아크탄젠트(atan)를 이용해서 구해야 하는 건 알았으나, 정확한 사용방법을 잘 모르겠어서 검색하다가 발견했다

https://wumbo.net/formulas/angle-between-two-vectors-2d/

 

Angle Between Two Vectors 2D Formula

Call the function. The angle is equal to radians or converting to the circle constant notation by multiplying by , the angle is equal to radians.

wumbo.net

레이저는 발사지점의 중앙에서 위쪽을 향하는 형태가 0도로 설정되어 있으므로, Vector2.up (0, 1)과 발사지점에서 플레이어 위치까지의 벡터를 가지고 연산을 해 주었다

Vector2 v = targetPos - mainPos;
go.transform.localRotation = Quaternion.Euler(0, 0, Mathf.Atan2(-v.x, v.y) * Mathf.Rad2Deg);

targetPos: 플레이어 위치

mainPos: 발사지점 정중앙 위치

 

추가로, 위 문서 링크를 발견한 스택오버플로우 질문글(https://stackoverflow.com/questions/13458992/angle-between-two-vectors-2d)에서의 답변과 내 연산이 다른 것 같아 이해가 안 되었어서 밑에 정리해 두었다

다르다고 느낀 이유는 나는 방향을 나타내는 벡터를 가지고 연산을 하려고 했고, 질문글에서는 위치를 나타내는 벡터를 가지고 연산을 하려고 한 거라 그런 거고 결국 똑같다!

v, w는 각각 벡터이다

이런 식으로 되어 있을 때, 저 세타 값을 구하기 위해

해당 공식에 각 벡터를 적용시키면 Atan2(b.Y - a.Y, b.X - a.X) 값이 나오게 된다