부트캠프

위치와 회전 계산하기

noyyo 2023. 11. 22. 11:17

적 AI를 구현하면서 위치 및 회전을 계산해야 하는 경우가 굉장히 많았다.

그럴 때 사용할 수 있는 여러가지 방법을 소개한다.

 

◆ 거리 및 각도 계산

●Vector3.Distance : 두 벡터 사이의 거리를 계산할 수 있다.

 

●Vector3.SqrMagnitude : 벡터의 크기가 제곱되어 있는 값이다. 그냥 크기는 제곱근 연산을 추가로 필요로 하기 때문에 연산을 줄이기 위해 사용하는 값이다.

 

●Vector3.Angle : 두 방향벡터 사이의 각도를 계산할 수 있다. 리턴값의 범위는 0~180으로 +-를 포함한 값을 얻고 싶다면 Vector3.SignedAngle 를 사용해야한다.

 

●Vector3.MoveTowards : 현재 위치를 목표 위치로 최대 거리차만큼 이동시킨 벡터이다. Update와 같은 구문에서 deltaTime에 따라 이동할 때와 같이 특정 거리만큼 움직여야 할 때 사용한다.

 

●Vector3.Project : 한 벡터를 다른 방향 벡터의 방향으로 투영한 벡터를 반환한다. 대표적으로 특정 방향에 대한 정규화를 시키는 데 사용할 수 있다.

 

●Random.onUnitSphere : 원점을 중심으로 반지름이 1인 구체의 한 지점을 Vector3로 반환해준다. insideUnitSphere는 구체의 내부의 지점까지 포함해서 반환한다. insideUnitCircle도 있다. 다만 onUnitCircle은 없으니 필요하면 직접 삼각함수로 계산해야한다.

 

●Mathf.Asin, Mathf.Acos, Mathf.Atan2 : x, y, z 축 값으로 각도를 구할 때 사용한다. Asin은 y축 Acos은 x축 Atan2는 (x, y)인 점을 기준으로 각도를 구할 수 있다. 축 회전이나 필요한 각도가 어떤 축을 기준으로 하느냐에 따라서 사용할 함수가 달라질 수 있다.

반대로 각도를 통해 위치를 구할 때는 Sin Cos Tan를 이용하면 된다.

 

●Transform.TransformPoint : 로컬 좌표계에서 해당 위치만큼 떨어진 지점을 월드 좌표계의 위치로 반환한다. 특정 오브젝트를 기준으로 위치를 잡을 때 사용하면 좋다. 반대로 월드 좌표계에서의 지점을 로컬 좌표계로 변환하는 InverseTransformPoint 메소드도 있다.

 

◆회전 계산

●Quaternion.AngleAxis : 특정 축을 기준으로 각도만큼 회전시킨 쿼터니온을 반환한다. 로컬 좌표계의 어떤 축을 중심으로 회전하고 싶다거나 할 때 유용하다.

 

●Quaternion * Quaternion : 쿼터니온끼리 곱연산을 하면 해당 회전을 더한 것과 같다. 예를 들어 x축으로 60도 회전한 쿼터니온과 y축으로 30도 회전한 쿼터니온을 곱하면 x축 60도 y축 30도로 회전한 쿼터니온이 된다. AngleAxis를 월드 좌표계를 기준으로 각 축마다 했다고 생각해도 된다.

 

●Quaternion * Vector3 : 해당 방향 벡터를 회전시킨 벡터를 반환한다. 정규화된 방향 벡터를 회전시킨 방향 벡터를 얻거나 특정 위치를 원점을 기준으로 회전시킨 위치를 얻을 때 사용한다. Transform.TransformPoint와 같이 사용해서 로컬 좌표계에서 특정 위치를 원점을 기준으로 회전시킨 로컬 위치의 월드 좌표를 얻거나 그 반대도 가능하다.

☆주의할 점으로 순서가 Vector3 * Quaternion이면 안된다.

 

●Quaternion.RotateTowards : 한 회전에서 다른 회전으로 최대 회전각도만큼 회전시킨 값이다. Update등에서 deltaTime에 맞춰 회전해야 하는 등의 목표 회전으로 특정 값만큼 회전할 때 쓰인다.

 

●Quaternion.LookRotation : 주어진 up 방향과 forward 방향을 바라보는 회전을 반환한다.

 

●Quaternion.FromToRotation : 특정 방향벡터에서 다른 방향벡터로 회전시키기 위한 회전을 반환한다. 적이 플레이어를 바라보기 위한 회전을 구한다던가 하는 상황에서 사용할 수 있다.

 

●Vector3.RotateTowards : 현재 방향 벡터에서 목표 방향 벡터로 최대 각도와 최대 크기만큼 회전시킨 벡터를 반환한다. 여기서 각도는 라디안으로 넣어줘야 한다. 개인적으로 해당 메소드는 쓸 일이 없었다.

 

●Transform.TransformDirection : 로컬 좌표계에서 주어진 방향을 월드 좌표계의 방향으로 반환한다. 특정 오브젝트를 기준으로 어떤 방향인지를 알고 싶을 때 사용하면 좋다. 반대 작업을 수행하는 InverseTransformDirection 메소드가 있다.

'부트캠프' 카테고리의 다른 글

프로젝트 마무리  (1) 2023.12.15
Animator 알아보기  (0) 2023.11.28
공격 범위를 DecalProjector를 이용해 표시하기  (1) 2023.11.18
애니메이션의 상태판단  (0) 2023.11.15
중간발표  (0) 2023.11.13