티스토리 뷰

벡터

벡터는 좌표와 방향을 나타낸다. 유니티에서는 Vector2,Vector3,Vector4 를 사용한다. Vector4는 쉐이더를 다룰 때 사용하고 평소에는 쓸일이 없다. Vector2는 x와 y 좌표를 나타내고 Vector3는 이것에 z 축을 추가한 것이다. 유니티에서는 왼손 좌표계를 사용하여 z 축의 증가 방향이 앞쪽을 향하게 된다. Vector3 의 forward(앞) 값을 보면 z 축이 1 증가한 값을 나타내는 것을 알 수 있다.


유니티에서 사용하는 기즈모



기즈모의 각 부위를 클릭하면 카메라가 해당 방향으로 이동하여 물체를 바라본다.


자주쓰는 벡터 값

Static 값들을 편하게 사용하자. 벡터를 생성할 때 new Vector3(0,0,0) 이런식으로 생성한다. 하지만 new 키워드를 사용하지 않고 미리 정의된 값을 사용할 수도 있다.

유니티 벡터 Static 정의 API

new Vector3(1,1,1) 는 Vector3.one 과 같다.

new Vector3(0,0,-1) 는 Vector3.back 과 같다.

new Vector3(0,-1,0) 는 Vector3.down 과 같다.

new Vector3(0,0,1) 는 Vector3.forward 과 같다.

new Vector3(-1,0,0) 는 Vector3.left 과 같다.

new Vector3(1,0,0) 는 Vector3.right 과 같다.

new Vector3(0,1,0) 는 Vector3.up 과 같다.

new Vector3(0,0,0) 는 Vector3.zero 와 같다.


벡터 연산

위의 Static으로 정의된 값 이외의 값이 필요하다면, 연산으로 만들 수 있다. 예를 들어 (0,2.5,0) 이란 값이 필요하다면 Vector3.up * 2.5 하면된다.

만약 (-1,-1,0) 이란 값이 필요하다면 Vector3.left + Vector3.down 을 하면 된다.

하지만 Vector3.left * Vector3.down 즉, 두 벡터를 곱한다고 해서  (0,0,0) 이 나오진 않는다. 벡터끼리 곱셈과 나눗셈을 할 수 없기 때문이다.


Vector Magnitude(크기)

벡터는 그 자체로 특정 좌표를 나타내기도 하지만 방향을 나타내기도 한다. 


Magnitude는 이런 벡터의 길이(크기)를 반환 해준다. (3 , 2) 벡터의 길이는 피타고라스의 정리로 구할 수 있다. 빗변의 제곱은 가로 제곱과 높이제곱의 합이다. 즉, (3 , 2)의 Magnitude는 루트(3² + 2²)이다. 


두 좌표의 거리 구하기

a좌표와 b좌표간의 거리를 구하려면 먼저 a 에서 b를 빼 c를 구한 후(c = a - b) c의 Magnitude 값을 얻는다. 이 과정을 한방에 해주는 것이 Vector3.Distance(a,b)이다. Distance는 파라미터로 받은 두 좌표를 뺄셈하여 결과 벡터를 얻은 뒤, 이 결과 벡터의 Magnitude 값을 반환한다.

결과적으로 Distance는 Magnitude를 포함하므로 루트 연산을한다. 그런데 루트 연산은 CPU 부담이 된다. 작은 양의 괜찮겠지만 많아질 수록 부담은 크게 늘어난다. RPG 게임을 예로 들어보자, 캐릭터에 적들이 달려온다. 캐릭터는 수많은 적들 중 가장 가까운 상대에게 공격을 가한다고 할 때. 수 많은 적들 중 누가 가장 가까운지를 먼저 계산해야 한다. 캐릭터와 적간의 거리를 구하기 위해 Magnitude를 사용한다고 하면, 그리고 적들이 10마리라고 한다면 매 프래임마다 Magnitude 연산을 20번해야 한다. 적들이 100마리라면 매 프래임마다 200번의 루트 연산을 해야한다.


루트 연산을 하지 않고 거리를 비교하려면

단순히 두 오브젝트 간 거리를 비교하고자 한다면 굳이 Magnitude 를 사용해 루트 연산을 하지 않는 방법이 있다. sqrMagnitude를 사용하는 것이다. sqrMagnitude는 루트 연산을 하지 않은채 값을 반환한다. 루트(3² + 2²) 에서 루트 연산만 제거하여 3² + 2² 값만 반환 한다. 반환한 값이 거리를 의미하지 않지만 방향은 표현할 수 있고 루트만 씌운다면 거리가 된다. 즉 sqrMagnitude 값이 크다는 것은 거리가 멀다는 것이다. 이것으로 거리를 비교할 수있는 것이다.

예를 들어 좌표 d(2 , 5) 과 좌표 e(3 , 4) 둘중 무엇이 좌표 f(0, 0, 0)에 가까운지 비교를 해야 한다면 각각의 거리를 구하여 비교하지말고말고(CPU 부담때문에), 벡터의 각 요소를 제곱하여 더한 값을 비교하는 것이다. d(2, 5)의 sqrMagnitude 값은 2² + 5² 이다. e(3, 4)의 sqrMagnitude 값은 3² + 4² 이다. d는 29 이고 e는 25 이므로 d가 f에 더 가깝다고 할 수있다.


댓글