Unity

유니티 쿼터니언(Quaternion)

우대비 2025. 5. 16. 21:03
반응형
유니티 쿼터니언(Quaternion)

쿼터니언(Quaternion)이란?

3D 게임 개발, 특히 Unity에서 회전을 다루다 보면 쿼터니언(Quaternion)이라는 개념을 자주 접하게 됩니다.
이 포스팅에서는 쿼터니언의 개념, 수학적 원리, 유니티에서의 활용법, 그리고 실전 팁까지 한 번에 정리해드립니다.

1. 쿼터니언이란?

쿼터니언은 3차원 공간에서의 회전을 표현하는 수학적 도구입니다.
복소수의 확장 개념으로, 4개의 실수(w, x, y, z)로 구성됩니다.

일반적인 쿼터니언 표현:
Q = w + xi + yj + zk
  • w: 스칼라(실수) 파트
  • x, y, z: 벡터(허수) 파트

2. 왜 쿼터니언을 쓰는가?

  • Gimbal Lock(짐벌락) 방지: 오일러 각(Euler Angle) 방식의 회전은 특정 각도에서 축이 겹쳐 회전이 꼬이는 문제가 있음
  • 부드러운 보간(Slerp): 두 회전 사이를 자연스럽게 보간 가능
  • 연산 효율성: 행렬보다 연산이 빠르고, 메모리 사용량이 적음
참고: 쿼터니언은 직관적으로 이해하기 어렵지만, 3D 회전의 수학적 문제를 매우 우아하게 해결합니다.

3. 쿼터니언의 수학적 원리

  • 단위 쿼터니언(길이 1)은 3D 회전을 표현
  • 두 쿼터니언의 곱은 회전의 합성
  • 역(Conjugate)은 반대 방향의 회전
회전 쿼터니언 생성:
Q = [cos(θ/2), sin(θ/2) * (x, y, z)]
(θ: 회전 각, (x, y, z): 회전축 단위벡터)

4. 유니티에서의 쿼터니언

  • 유니티의 Quaternion 구조체는 w, x, y, z 필드를 가짐
  • Transform의 rotation 프로퍼티는 쿼터니언 타입
// 예시: 오브젝트를 90도 회전
transform.rotation = Quaternion.Euler(0, 90, 0);

// 두 회전 사이 보간
transform.rotation = Quaternion.Slerp(startRot, endRot, t);

// 특정 축을 기준으로 회전
Quaternion rot = Quaternion.AngleAxis(45, Vector3.up);

5. 쿼터니언과 오일러 각 변환

  • Quaternion.Euler(x, y, z): 오일러 각 → 쿼터니언
  • quaternion.eulerAngles: 쿼터니언 → 오일러 각
// 오일러 각에서 쿼터니언으로
Quaternion q = Quaternion.Euler(30, 60, 90);

// 쿼터니언에서 오일러 각으로
Vector3 euler = q.eulerAngles;

6. 쿼터니언 연산 실전 팁

  • 곱셈(합성): q3 = q1 * q2 (q2를 먼저, 그 다음 q1을 적용)
  • 역방향 회전: Quaternion.Inverse(q)
  • 정규화: q.normalized (길이 1로 유지)
  • 보간: Quaternion.Lerp (선형), Quaternion.Slerp (구면)

7. 쿼터니언을 사용할 때 주의할 점

  • 직접 w, x, y, z 값을 수정하지 말고, 유니티의 API를 활용
  • 회전 순서(오일러 각 변환 시)와 축 방향에 주의
  • 디버깅 시 eulerAngles로 변환해서 확인

8. 결론

쿼터니언은 3D 회전을 다루는 데 있어 필수적인 수학적 도구입니다.
유니티에서는 쿼터니언을 직접 다루기보다는, Quaternion.Euler 등 편리한 API를 적극 활용하는 것이 좋습니다.
쿼터니언의 원리를 이해하면, 3D 게임 개발에서 회전 관련 버그를 효과적으로 예방할 수 있습니다.

9. 참고 자료

반응형
LIST

'Unity' 카테고리의 다른 글

FishNet 사용법  (0) 2025.05.20
Unity 렌더링 파이프라인  (0) 2025.05.19
유니티 드로우콜  (0) 2025.05.14
유니티 코루틴의 동작원리  (1) 2025.05.12
TIL: Unity 인벤토리 시스템 구현  (2) 2025.05.01