1. Quaternion과 Euler Angle의 관계
Euler Angle은 x, y, z 3개의 축을 기준으로 0 ~ 360도 만큼 회전시키는 좌표계이다.
직관적이고 사용하기 편하지만 이 Euler Angle에는 하나의 문제가 존재한다.
바로 짐벌락(Gimballock) 이다
- 짐벌락이란
3개의 축의 자유도로 회전을 표현할 수 있는 짐벌 고리가 겹치면서 두 개의 회전 축이 거의 일치하여 자유도가 2개의 축으로 한정되는 사태
즉 두 개의 회전축이 겹쳐 특정 방향의 회전이 불가능해지는 것
그렇기 때문에 Unity는 객체의 회전값을 저장할 때 쿼터니언(Quaternion)이라는 개념을 사용한다.
Quaternion은 Euler 좌표계의 짐벌락 현상을 해결하기 위해 고안된 좌표계이다.
2. Quaternion과 Euler Angle의 특징
Quaternion
- 4개의 수(x, y, z, w)로 이루어져 있으며 이는 하나의 벡터(x, y, z)와 하나의 스칼라(w)를 의미한다.
- 3개의 축을 동시에 회전시키기 때문에 짐벌락 현상이 발생하지 않는다.
- 점유 메모리 영역이 작고 계산 부하도 낮다(계산하는 데 비용이 적다)
- 한 orientation에서 다른 orientation을 측정하기 때문에 180도 보다 큰 회전을 표현할 수 없고
그렇기 때문에 직관적으로 이해하기가 힘들다.
- 방향과 회전을 표현할 수 있다.
Euler Angle
- 3개(x, y, z)의 축을 기준으로 0 ~ 360도 만큼 회전시키는 좌표계
- 직관적이고 사용하기 편리하다
- 3개의 축을 기준으로 회전하기 때문에 직관적이고 조작하기 쉽다.
- 오일러 각을 계산하는데 비용이 많이 크다
- 3개의 축을 개별적으로 계산하기 때문에 짐벌락이 발생할 수 있다.
2. Quaternion 사용 방법
* 바로 EulerAngle을 사용할 수도 있다.
ex. transform.eulerAngles = new Vector3(x, y, z);
(1) 기본
public class Example : MonoBehaviour
{
void Start()
{
// y축 30도 회전
Vector3 rotationVector = new Vector3(0, 30, 0);
transform.rotation = Quaternion.Euler(rotationVector);
}
}
(2) 방향에 맞춰 회전값 표현 (타겟을 바라보게 회전하고자 한다면)
public class ExampleClass : MonoBehaviour
{
public Transform target;
void Update()
{
Vector3 relativePos = target.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(relativePos, Vector3.up);
transform.rotation = rotation;
}
}
(3) 일정 시간을 두고 서서히 회전
public class ExampleClass : MonoBehaviour
{
private float speed = 5.0f;
void Update()
{
Vector3 relativePos = target.position - transform.position;
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(relativePos, Vector3.up),
speed);
speed += Time.deltaTime;
}
}
'Unity 개발' 카테고리의 다른 글
[Unity] 에러 메시지 정리fatal: unable to access 'https://github.com/.../...git/': SSL certificate problem: unable to get local issuer certificate (0) | 2023.02.23 |
---|---|
[Unity] 그래픽 기초, 렌더 파이프 라인 완벽 이해 (1) | 2023.01.31 |
[Unity, c#] 인터페이스와 추상클래스 (0) | 2023.01.26 |
싱글톤 오브젝트와 정적 멤버 (0) | 2022.12.09 |
Unity 코루틴(Coroutine) (0) | 2022.12.07 |