본문 바로가기

Unity/▶ Unity Composition

[Unity Composition]#6. Vector

728x90
반응형

유니티는 Vector2, Vector3, Vector4 타입을 지원한다. 새로운 벡터값을 정의하기 위해선 다음과 같은 메서드를 이용한다.

  • new Vector2(x,y);
  • new Vector3(x,y,z);
  • new Vector4(x,y,z,w);

new 메서드와 Vector3 메서드는 다음을 참고한다.

https://udangtangtang-cording-oldcast1e.tistory.com/notice/83

 

💫유니티 메서드💫

유니티 인터페이스 인스펙터 선택한 게임 오브젝트의 정보와 컴포넌트가 나열되는 곳. 컴포넌트  게임 오브젝트 중 다양한 부품들을 일컫는 말. 트랜스폼 3D 공간에서의 위치를 결정하는 컴포

udangtangtang-cording-oldcast1e.tistory.com

생선된 벡터값의 각 원소는 다음과 같이 개별적으로 접근과 수정이 가능하다.

Vector3 v = new Vector3(1,2,3);
//방향이 (1,2,3)인 3차원 벡터 선언

v.x = 10; //x 방향의 벡터를 수정
v.y = 20; //y 방향의 벡터를 수정
v.z = 30; //z 방향의 벡터를 수정
참조타입(.) 이용하여 접근 및 수정을 할 수 있다.

Vector3의 연산

스칼라곱

Vector3 v = new Vector3(1,2,3);
//방향이 (1,2,3)인 3차원 벡터 선언

v = v*10;
//연산 결과로 v벡터는 (10,20,30)이 된다.

벡터의 덧셈과 뺄셈

Vector3 v1 = new Vector3(1,2,3);//방향이 (1,2,3)인 3차원 벡터 선언
Vector3 v2 = new Vector3(4,5,6);//방향이 (4,5,6)인 3차원 벡터 선언

Vector3 v3 = v1+v2;
//연산 결과로 v3벡터는 (5,7,9)가 된다.

벡터의 덧셈과 뺄셈은 일반적인 산수처럼 사용하면 된다.

벡터의 거리 계산

Vector3.Distance(vec1,vec2);
  • 인자로 받은 두 개의 벡터 간의 거리를 계산한다.
  • 참조 타입을 이용하여 벡터에 접근한다.

벡터의 정규화

Vector3.normarlized;
  • 참조 대상의 특정 벡터와 방향은 같지만 크기는 1인 벡터(단위 벡터)를 생성한다.
  • 참조 타입을 이용하여 벡터에 접근한다.
Vector3 v = new Vector3(5,5,5);
//방향이 (5,5,5)인 3차원 벡터 선언

Vector3 nor = v.normarlized;
//v와 방향은 같지만 크기가 1인 벡터 nor을 생성함.

벡터의 크기

Vector3.magnitude;
  • 벡터의 크기를 구한다.
  • 참조 타입을 이용하여 벡터에 접근한다.
Vector3 v = new Vector3(5,5,5);
//방향이 (5,5,5)인 3차원 벡터 선언

float size = v.magnitude;
//벡터 v의 크기를 size 변수에 저장

벡터의 내적

Vector3.Dot(vec1,vec2);
  • 벡터 b를 벡터 a에 투영한 길이를 구한다.
  • Vector3에 참조하여 함수를 사용한다.
Vector3 v1 = new Vector3(1,2,3); //방향이 (1,2,3)인 3차원 벡터 선언
Vector3 v2 = new Vector3(4,5,6); //방향이 (4,5,6)인 3차원 벡터 선언

float rst = Vector3.Dot(v1,v2);
//벡터 v1,v2의 내적값을 rst 변수에 저장

 

벡터의 외적

Vector3.Cross(vec1,vec2);
  • 두 벡터 모두에 수직인 벡터를 구한다.
  • Vector3에 참조하여 함수를 사용한다.
Vector3 v1 = new Vector3(1,2,3); //방향이 (1,2,3)인 3차원 벡터 선언
Vector3 v2 = new Vector3(4,5,6); //방향이 (4,5,6)인 3차원 벡터 선언

float rst = Vector3.Cross(v1,v2);
//벡터 v1,v2의 외적값 rst 변수에 저장

Vector3 응용

Vector3 curr = new Vector3(1,0,-1); //방향이 (1,0,-1)인 3차원 벡터 선언
Vector3 dest = new Vector3(4,5,6); //방향이 (4,5,6)인 3차원 벡터 선언

두 지점 사이의 거리

Vector3 dir = dest - curr;
//curr에서 dest로 향하는 벡터
float Distance = dir.magnitude;
//curr에서 dest까지의 거리

 

curr에서 dest로 향하는 벡터를 구하고 magnituted 메서드를 이용하여 벡터의 거리를 계산할 수 있지만 Distance 메서드를 이용하여 바로 계산할 수 도 있다.

벡터의 방향

Vector3 dir = dest - curr;
//curr에서 dest로 향하는 벡터

//정규 벡터 구하기
dir.normalized;

쿼터니언

쿼터니언은 회전을 나타내는 타입이며 원소로 x,y,z,w를 가지는 값으로, 사원수로 부른다.

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

 

단, rotation은 Vector3타입이 아닌 Quaternion 타입이다.

Vector3 position 위치
localScale 로컬 스케일
Quaternion rotation 회전
transform.position = new Vector3(0,0,10);
transform.localScale = new Vector3(1,1,1);

//rotation은 Vector3타입이 아닌 Quaternion 타입이므로 에러 발생
transform.rotation = new Vector3(30,60,90);

 

쿼터니언은 한번에 회전하는 방식이므로 오일러각과 달리 짐벌락 현상이 없으며 90도 회전을 제대로 표현할 수 있다. 따라서 게임에서 회전을 구현할 때 쿼터니언을 사용한다.

 

다만, 쿼터니언은 복잡한 계산법을 기반으로 하기 때문에 유니티 내부에서는 쿼터니언으로 처리하지만 인스펙터 창에서는 컴포넌트의 회전을 Vector3로 다룬다.

쿼터니언 예제

새로운 회전 데이터 생성

Quaternion.Euler(Vector3);

(0,60,0) 회전을 표현하는 쿼터니언 회전 데이터를 생성하는 코드는 다음과 같다.

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

 

728x90
반응형
댓글