임준일의 개인 블로그

#6 벡터 본문

Unity

#6 벡터

임준일 2023. 1. 25. 23:17
벡터

 

벡터는 방향과 크기를 가진다.

 

벡터는 절대적인 위치로 표현하거나 상대적인 위치로 표현할 수 있다.

 

  • 상대 좌표 : (내가 어디있는지 모르지만) 현재 좌표에서 (1, 1) 만큼 더 간다.
  • 절대 좌표 : 게임 세상 속에서 나의 좌표는 (1, 1) 이다.

 

벡터가 표현하는 화살표의 길이가 벡터의 크기이다.

 

▼ 벡터의 크기는 모든 원소를 제곱하여 더한 값의 제곱근이다.

 

스칼라 곱

 

벡터는 스칼라 곱을 사용해 배수를 취할 수 있다.

ex) (1, 1) x 5 = (5, 5)

 

Vector3 * 스칼라;

Vector3 a = new Vector3(3, 6, 9);
a = a * 10;

결과 : a는 (30, 60, 90) 이 된다.

 

벡터 정규화(방향 벡터로 만들기)

 

방향 벡터는 크기가 1인 벡터로, 방향을 표현한다.

 

어떤 벡터를 크기가 1인 방향 벡터로 만드는 것을 정규화라고 한다.

 

즉, 해당 벡터와 방향은 같지만 크기가 1인 벡터를 생성한다.

 

Vector3.normalized;

Vector3 a = new Vector3(3, 3, 3);
Vector3 b = a.normalized;

결과 : b는 대략 (0.6, 0.6, 0.6) 이 된다.

 

벡터의 덧셈, 뺄셈

 

벡터끼리의 덧셈이 가능하다.

ex) (1, 1) + (2, 2) = (3, 3)

 

벡터끼리의 뺄셈이 가능하다.

ex) (1, 1) - (2, 2) = (-1, -1)

 

벡터의 크기

 

벡터의 크기(길이)를 구한다.

 

Vector3.magnitude;

Vector3 a = new Vector3(3, 3, 3);
float b = a.magnitude; // b는 대략 5.19... 가 된다.

 

벡터의 내적

 

벡터 b를 벡터 a로 투영한 길이를 구한다.

 

 

B - A는 A에서 B로 향하는 벡터이다.

 

벡터 A에 벡터 B를 내적한 (A · B) 결과는 두 벡터의 크기와 두 벡터 사이의 각도로 결정된다.

 

방향 벡터 A에 방향 벡터 B를 내적한 (A · B) 결과를 통해 두 벡터 사이의 각도 차이를 알 수 있다.

 

Vector3.Dot(a, b);

Vector3 a = new Vector3(0, 1, 0); // 위쪽으로 향하는 벡터
Vector3 b = new Vector3(1, 0, 0); // 오른쪽으로 향하는 벡터
float c = Vector3.Dot(a, b); // 수직인 벡터끼리 내적하면 결과는 0이다.

 

벡터의 외적

 

두 벡터 모두 수직인 벡터를 구한다.

 

 

벡터 A에 벡터 B를 외적한 (A x B) 결과는 A와 B 모두에 수직인 벡터이다.

 

Vector3.Cross(a, b);

// 외적 결과 c는 앞쪽과 오른쪽 모두에 수직인 위쪽(Y) 방향벡터
Vector3 c = Vector3.Cross(a, b); // c는 (0, 1, 0) 이다.

 

쿼터니언(Quaternion)

 

회전을 나타내는 타입이다.

 

인스펙터 창에서 트랜스폼 컴포넌트는 X, Y, Z를 가지는 Vector3로서 위치와 회전, 그리고 스케일을 나타낸다.

 

트랜스폼 컴포넌트의 회전 값은 Vector3 타입이 아니라 Quaternion 타입이다.

 

쿼터니언은 한번에 회전하는 방식이기 때문에 짐벌락 현상이 없다.

 

짐벌락

 

Vector3를 사용하는 오일러각은 짐벌락이 생길 수 있으므로 유니티는 회전을 Quaternion 타입으로 표현한다.

 

짐벌락 현상은 회전을 세 번 나누어 실행하는 도중에 축 두 개가 겹쳐 하나의 축으로 잠금되기 때문이다.

 

새로운 회전 데이터 생성

 

Quaternion.Euler() 메서드로 Vector3 값에서 쿼터니언 회전값을 생성할 수 있다.

 

Quaternion.Euler(Vector3);

// (0, 60, 0) 회전을 표현
Quaternion rotation = Quaternion.Euler(new Vector3(0, 60, 0));

 

회전을 Vector3(오일러각)로 가져오기

 

Quaternion 타입은 저장된 회전값을 Vector3 타입의 오일러각으로 변환한 변수 eulerAngles를 제공한다.

 

Quaternion rotation = Quaternion.Euler(new Vector3(0, 60, 0));

// Vector3 타입의 값으로 (0, 60, 0)이 나온다.
Vector3 eulerRotation = rotation.eulerAngles;

 

현재 회전에서 더 회전하기
Quaternion a = Quaternion.Euler(30, 0, 0);
Quaternion b = Quaternion.Euler(0, 60, 0);

// a만큼 회전한 상태에서 b만큼 더 회전한 값을 표현한다.
Quaternion rotation = a * b;