i라는 이상한 숫자가 필요했을까?우리가 잘 아는 실수(real number)는 √(-1)을 계산할 수 없다.
그래서 수학자들은 상상의 수를 도입했는데, 이게 바로 허수(i)이다.
z = a + bi (a는 실수, b는 허수 계수)복소수는 실수부와 허수부로 구성되며, 복소수끼리의 곱셈을 통해 놀라운 현상이 발견되었다.
바로, 회전(Rotation)이다.
복소수를 극좌표 형태로 표현하면 r(cosθ + i sinθ)로 나타낼 수 있다.
이걸 두 개 곱하면 이렇게 된다:
z₁ · z₂ = r₁r₂ [cos(θ₁+θ₂) + i sin(θ₁+θ₂)]
즉, 회전 각도가 더해진다!
=> 복소수의 곱은 단순히 크기만 곱해지는 게 아니라, 회전을 포함한다.
그래서 2D에서 복소수의 곱을 이용하면 회전을 구현할 수 있다.
여기서 문제가 발생한다.
2D에서 복소수 하나로 회전을 표현할 수 있었지만,
3D는 x, y, z 세 축을 모두 고려해야 한다.
수학자들은 고민 끝에 다음과 같은 확장을 생각해낸다.
쿼터니언 = w + xi + yj + zk
이 네 개의 수를 조합한 게 Quaternion (4차원 복소수)이다.
3D 회전에서 흔히 사용하는 방법은 Euler 회전(x, y, z축으로 각각 회전)이다.
하지만 이 방식에는 치명적인 문제가 있다.
3축 중 두 축이 겹치면 하나의 회전 축이 사라지고,
원하는 방향으로 회전할 수 없게 되는 회전 자유도 상실 문제가 발생한다.
예: 비행 시뮬레이터에서 피치, 요, 롤 중 한 방향이 통째로 무력화됨
이를 해결하기 위해 고안된 방식이 바로 쿼터니언 회전이다.
회전 자체를 수학적으로 하나의 연산으로 표현하므로 축이 겹쳐도 문제가 없다.
Q = w + xi + yj + zk
q * v * q⁻¹ 형태로 계산한다q = cos(θ/2) + (x*i + y*j + z*k) * sin(θ/2)
v를 회전시키고 싶다면:v' = q * v * q⁻¹
v는 순수 허수 (0 + xi + yj + zk) 형태로 표현됨게임 엔진에서 객체의 변환은 일반적으로 SRT로 표현된다:
이 중 Rotation 부분에서 Quaternion을 사용하면:
| 이유 | 설명 |
|---|---|
| 🎢 Gimbal Lock 방지 | 3축 회전에서 축 겹침 문제 해결 |
| 🔄 회전 조합 | 쿼터니언 곱으로 회전 연속 처리 |
| 🔧 연산 효율 | 행렬보다 적은 계산량으로 회전 표현 가능 |
| 🔗 SLERP 사용 가능 | 쿼터니언 사이를 부드럽게 보간 가능 |