Unity - Quaternion

2024. 5. 10. 21:02카테고리 없음

  유니티에서 인스펙터창을보면 Transform을 볼 수 있다. (x,y,z) 세 개의 값으로 각도를 조절할 수 있는데 이를 오일러각(Euler Angle)이라고 부른다. 하지만 내부적으로는 쿼터니언 (x,y,z,w) 즉 4개의 값으로 사용하고있다. 오일러각을 사용했을때 발생하는 짐벌락(Gimbal Lock)현상을 쿼터니언을 이용하면 해결 할 수 있기 때문이다.

https://www.youtube.com/watch?v=yxMQKsab5TQ&t=400s

짐벌락 테스트 영상

 위 영상처럼 축이 겹치게 되는 순간 한 축이 소실되는 현상이 짐벌락 현상이다. 쿼터니언은 축을 하나 더 추가해 4차원으로 한 축이 소실되는 현상을 해결 한 것이다.

Quaternion 함수

  • public staic Quaternion Euler(float x, float y, float z)
armPivot.rotation = Quaternion.Euler(0, 0, rotZ);

 

Quaternion.Euler(float x, float  y, float  z) 메서드는 매개변수로 받은 Vector3 값을 Quaternion 타입으로 변환해서 리턴해준다. 쿼터니언 타입은 Transform.rotation에 할당이 가능하다.

 

  • public static Quaternion LookRoation(Vector3 forward, Vector3.up);

해당 메서드는 벡터를 매개변수로 넘겨주면 오브젝트가 해당 넘겨준 매개변수 Vector3의 방향을 쳐다보게끔 회전한다.

transform.roation = Quaternion.LookRotation(target.position - transform.position);

위와 같은 방식으로 타겟의 위치와 나의 위치벡터를 빼주면 나와 타겟 사이의 벡터가 나온다. 해당 벡터를 인자로 넘기게되면 target을 바라보게 끔 회전하는 쿼터니언 타입을 반환한다.

 

  • public static Quaternion Lerp(Quaternion a, Quaternion b, float t);

두 개의 회전 값으로 float 비율 만큼의 회전값을 리턴한다. 0f<=t<=1f

선형 보간 (Linear interpolate)방식으로 두 지점을 선형으로 연결해서 두 지점사이의 위치를 파악하는 방식이다.

 

  • public static Quaternion Slerp(Quaternion a, Quaternion b, float t);

Lerp와 같이 두 개의 회전 값 사이의 float 비율 만큼의 회전값을 리턴하는 것은 같지만, 구면 선형 보간(Spherically interpolate) 방식을 사용한다. 구면 위에서 선형 보간을 하는 방식이라고 생각하면 된다.

  • public static Quaternion AngleAxis(float angle, Vector3 axis);

axis축 기준으로 angle(Degree)각도만큼 회전시킨 쿼터니언을 반환한다.