Unity 개발

[Unity] 쿼터니언(Quaternion), 오일러 앵글(Euler Angle)

내공부방 2023. 1. 31. 20:44
반응형

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;
    }
}
반응형