유니티는 회전 처리를 하는데 쿼터니언(사원수)을 사용한다. 하지만 사원수는 어려운 개념이니 유니티를 사용하는 입장에서는 그렇구나... 하고 넘어가도록 하자.
관련 함수 및 기타
1. Quaternion.Euler(Vector3) : 이해가 쉬운 Vector3 값(진짜 벡터값이 아닌 형식)을 자동으로 Quaternion 값으로 변환해주는 함수. 반환값은 Quaternion.
(x, y, z)와 같은 Vector3 형태를 인수로 입력한다. 형식은 벡터이지만 우리가 쓰는 각도를 의미한다.
ex1)
Quaternion rotation = Quaternion.Euler(10, 10, 10);
ex2)
Vector3 rot = new Vector3(10, 10, 10);
Quaternion rotation = Quaternion.Euler(rot);
2. Quaternion.LookRotation(Vector3, Vector3)
물체의 z축이 Vector3의 방향을 바라보는 회전 상태를 반환. 이때 Vector3는 Local 좌표를 기반으로 한다는 것에 주의
또한 첫 번째 인수의 벡터는 위의 Euler 함수와는 다르게 진짜 Vector라는 것을 주의!
ex1) 해당 스크립트가 포함된 오브젝트가 target 오브젝트 방향을 바라보도록 회전한다.
Transform target;
Quaternion rotation = Quaternion.LookRotation(target.position - transform.position);
두 번째 인자에는 오브젝트의 위쪽이 향하는 방향을 지정할 수 있다.
생략할 경우 자동으로 Vector3.Up으로 처리
ex2) 두 번째 인자
Transform target;
Quaternion rotation = Quaternion.LookRotation(target.position - transform.position, Vector3.down);
오브젝트의 머리가 항상 Global 좌표의 아래쪽을 향하게 된다. (오브젝트가 위아래로 뒤집힘)
3. Quaternion.Lerp(Quaternion A, Quaternion B, float t) (t : 0~1.0)
두 쿼터니언 A와 B 사이에 있는 t * 100% 만큼의 값을 찾는다.
Quaternion a = Quaternion.Euler(new Vector3(10, 10, 10));
Quaternion b = Quaternion.Euler(new Vector3(30, 30, 30));
// a와 b의 x,y,z의 중간값인 (20, 20, 20)이 나올것
Quaternion rot = Quaternion.Lerp(a, b, 0.5f);
3. Quaternion.eulerAngles 와 Quaternion.localEulerAngles
해당 Quaternion 값을 Vector3으로 변환 후 Vector3를 반환한다.
Quaternion 형의 변수를 선언한 후 .eulerAngles와 .localEulerAngles를 사용하면 Vector3 형태를 바로 적용이 가능하다.
Quaternion rot;
// 각도를 (10, 10, 10)으로 설정한다.
rot.eulerAngles = new Vector3(10, 10, 10)
eulerAngles는 Global 좌표계를 이용하고, localEulerAngles는 Local 좌표계를 이용한다.
* 각끼리의 계산
1. 두 쿼터니언 -> 두 벡터 -> 벡터로 변환된 각 끼리 계산 -> 결과 벡터 -> 쿼터니언
2. 쿼터니언끼리 곱셈을 하면 각의 요소(x ,y, z)끼리 더해진다(행렬)
'Game Development > Unity' 카테고리의 다른 글
충돌 처리 (0) | 2021.07.18 |
---|---|
인스턴스화 (0) | 2020.12.13 |
평행이동과 좌표계 관련 (0) | 2020.12.13 |
벡터 (0) | 2020.12.13 |
Time.deltaTime (0) | 2020.12.13 |