쿼터니언(Quaternion)이란?
3D 게임 개발, 특히 Unity에서 회전을 다루다 보면 쿼터니언(Quaternion)이라는 개념을 자주 접하게 됩니다.
이 포스팅에서는 쿼터니언의 개념, 수학적 원리, 유니티에서의 활용법, 그리고 실전 팁까지 한 번에 정리해드립니다.
1. 쿼터니언이란?
쿼터니언은 3차원 공간에서의 회전을 표현하는 수학적 도구입니다.
복소수의 확장 개념으로, 4개의 실수(w, x, y, z
)로 구성됩니다.
일반적인 쿼터니언 표현:
Q = w + xi + yj + zk
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): 회전축 단위벡터)
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 게임 개발에서 회전 관련 버그를 효과적으로 예방할 수 있습니다.