[TIL] Unity Vector 연산1

Dreamer·2024년 10월 8일

1. 오늘 주제

음.. 오늘은 방향에 대해 작성해보려고 한다. 원래는 어제 작성하려고 했던건데, 오늘부터 개인 프로젝트를 들어가야 되서 시간 있을때 정리해보려고 한다. Vector 연산 하는 방식에 대해 간략하게 작성해보려고 한다. 일단은 object에 가하는 힘의 크기, object 간 거리, object 간 방향 을 구하는 방법부터 알아보자.

2. Vector 연산

  1. Vector 덧셈
// 단순히 a+b=c 으로 연산 한다.
// 두 가지 힘의 벡터를 더하면 두 힘을 합한 값과 동일한 새로운 벡터가 생성
// 동시에 다수의 서로 다른 컴포넌트에 힘을 가할 때 유용
// 로켓이 추진력에 의해 앞으로 가고 있지만 역풍으로 인해 영향을 받는 경우를 구현하기 유용
Vector2 a = new Vector2(3, 5);
Vector2 b = new Vector2(2, -1);
Vector2 c = a + b; // c = <5, 4>

벡터가 힘을 나타내는 단위일 때 벡터를 힘의 크기인 강도와 방향으로 간주하면 더욱 직관적으로 이해할 수 있다. 2D, 3D, 4D 모두 동일한 개념이다.

  1. Vector 뺄셈
// 한 오브젝트에서 다른 오브젝트까지의 거리와 방향을 구하고자 할 때 많이 사용
// 주의할 점은 벡터의 뺄셈에서는 두 파라미터의 순서가 매우 중요하다는 점
Vector2 a = new Vector2(3, 5);
Vector2 b = new Vector2(2, -1);
// c와 d의 크기는 같지만 반대 방향을 가리킨다.
Vector2 c = b - a; // c = <-1, -6>
Vector2 d = a - b; // c = <1, 6>
// 숫자의 경우 음의 벡터를 더하는 것은 양의 벡터를 빼는 것과 동일
Vector2 c = a - b; // == a + -b와 같다.

음의 벡터는 오리지널 벡터와 크기가 같고 같은 선상에서 정반대 방향을 가리키는 벡터를 말한다.

  1. A와 B의 방향 및 거리
Vector2 a = new Vector2(3, 5);
Vector2 b = new Vector2(2, -1);
// 공백 내 한 포인트의 값을 다른 포인트의 값에서 빼면
// 그 결과는 한 오브젝트에서 다른 오브젝트를 가리키는 벡터이다.
// a의 위치에서 b의 위치를 가리키는 벡터
Vector2 heading = b - a;
// a 위치와 b 위치 사이의 거리(크기)
float distance = heading.magnitude; // 루트 연산
// 발사체를 유도하기 위한 방향 벡터를 정규화 할 수 있다.
Vector2 direction = heading / distance; // 정규화 된 방향 벡터
// Vector2 direction = heading.normalized; // 똑같다.

// 거리를 구하는 연산방식에서 루트 연산을 하면 CPU 소모가 크다.
// 따라서 루트 연산을 안하는 방법으로 연산 하는 것이 좋다.
// 내부 연산은 (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) 공식을 따른다.
float distance1 = Vector2.Distance(a, b);
// 또는
float distance2 = (a - b).sqrMagnitude; 
// Vector2.Distance와 같은 결과이다.
// 단순히 거리를 비교 용도로만 사용해야 하는 경우(근접한지)에는 사용해야 한다. 
// 더 효율적인 거리 비교 연산 방식
if (heading.sqrMagnitude < maxRange * maxRange) {
    // 대상이 범위에 들어왔으면..
}

3D의 경우 대상을 향하는 방향이 지상 방향일 수 있다.
예를 들어 땅 위에 서있는 플레이어가 공중에 떠있는 대상의 방향으로 접근해야 하는 경우에 플레이어 포지션을 대상의 포지션에서 빼면 결과 타겟 방향으로 위쪽을 향하게 되는데, 문제는 대상을 중심으로 바라보는 것이 아니라 대상이 위치한 방향으로만 바라보게 하려면 Y 좌표를 0으로 고정해야한다.

Vector2 heading = target.position - player.position;
heading.y = 0; // 공중에 떠 있건, 지상에 박혀 있건 그건 중요하지 않아.

3. ref

https://docs.unity3d.com/kr/current/Manual/VectorCookbook.html

profile
새로운 시작

0개의 댓글