취준/기술면접
벡터 정규화(Nomarlized)
빵어
2024. 11. 20. 20:37
벡터 정규화
벡터 정규화란 벡터를 방향을 유지하되, 크기가 1인 벡터(단위벡터)로 만드는 것이다
벡터를 정규화하는 방법
벡터를 단위벡터로 만드는 방법은
각 성분을 그 벡터의 크기로 나눠주면 된다
x = 2, y = 2, z = -1
인 벡터가 있다고 했을 때,
벡터의 크기는
√(x^ + y^ + z^)
따라서 예제의 벡터 크기는
√(2^ + 2^ + (-1)^) = √9 = 3
크기인 3으로 나누면 정규화된 벡터가 된다
x = 2/3, y = 2/3, z = -1/3
이걸 유니티에서 간단히 코드로 하면
Vector3 vec = new Vector3(2, 2, -1);
vec = vec.normalized;
정규화는 크기가 0인 벡터에는 적용이 불가하다
만약 크기가 0인 벡터에 정규화를 시도하면 동작하지 않는다
따라서 벡터 크기가 작을 수 있는 경우엔, 벡터 크기가 0인지 확인 후 정규화하는 것이 바람직하다
if(vec.magnitude > 0) // magnitude: 벡터의 크기
vec = vec.normalized;
else
vec = Vector3.zero;
벡터를 정규화하는 이유
벡터를 이용해 이동을 구현할 경우, 벡터의 크기가 달라지면 일정하게 속도를 유지하기 어렵다.
예를 들어 플레이어 이동 벡터의 크기가 3, 몬스터 이동 벡터의 크기가 5.5이고
개발자가 플레이어의 속도를 100으로, 몬스터의 속도를 50으로 하고 싶어 한다 가정했을 때
각각 얼마를 곱해줘야 원하는 속도가 나올까?
계산하기에 번거롭거나 예상하기 힘들다.
하지만 각각의 벡터를 정규화해 크기를 1로 만들 경우
플레이어 이동 벡터의 100을 곱하고, 몬스터 이동 벡터에 50을 곱해주기만 하면 끝난다.
벡터를 정규화하는 이유
- 계산을 단순화하기 위해서
- 벡터를 활용한 동작의 예측과 일관성을 위해서
- 유지보수를 위해서 - 이동 벡터의 경우, 속도만 조정하면 되므로 코드가 간단해짐
- 벡터의 방향만 필요할 경우 (광선의 방향 등)
- 유니티 API 함수에서 정규화된 벡터를 기대하는 경우가 많으므로 (Vector3.RotateTowards 등)