1️⃣ 복소수의 탄생 – 왜 i라는 이상한 숫자가 필요했을까?

우리가 잘 아는 실수(real number)는 √(-1)을 계산할 수 없다.
그래서 수학자들은 상상의 수를 도입했는데, 이게 바로 허수(i)이다.

  • i² = -1
  • 복소수: z = a + bi (a는 실수, b는 허수 계수)

복소수는 실수부와 허수부로 구성되며, 복소수끼리의 곱셈을 통해 놀라운 현상이 발견되었다.
바로, 회전(Rotation)이다.


2️⃣ 복소수의 곱 = 회전?!

복소수를 극좌표 형태로 표현하면 r(cosθ + i sinθ)로 나타낼 수 있다.
이걸 두 개 곱하면 이렇게 된다:

z₁ · z₂ = r₁r₂ [cos(θ₁+θ₂) + i sin(θ₁+θ₂)]

즉, 회전 각도가 더해진다!
=> 복소수의 곱은 단순히 크기만 곱해지는 게 아니라, 회전을 포함한다.

그래서 2D에서 복소수의 곱을 이용하면 회전을 구현할 수 있다.


3️⃣ “그럼 3D에서는?”

여기서 문제가 발생한다.

2D에서 복소수 하나로 회전을 표현할 수 있었지만,
3D는 x, y, z 세 축을 모두 고려해야 한다.

수학자들은 고민 끝에 다음과 같은 확장을 생각해낸다.

쿼터니언 = w + xi + yj + zk
  • w: 실수부
  • x, y, z: 허수부
  • i² = j² = k² = ijk = -1

이 네 개의 수를 조합한 게 Quaternion (4차원 복소수)이다.


4️⃣ 왜 쿼터니언을 쓰는가?

3D 회전에서 흔히 사용하는 방법은 Euler 회전(x, y, z축으로 각각 회전)이다.
하지만 이 방식에는 치명적인 문제가 있다.

❌ 짐벌락(Gimbal Lock) 현상

3축 중 두 축이 겹치면 하나의 회전 축이 사라지고,
원하는 방향으로 회전할 수 없게 되는 회전 자유도 상실 문제가 발생한다.

예: 비행 시뮬레이터에서 피치, 요, 롤 중 한 방향이 통째로 무력화됨

이를 해결하기 위해 고안된 방식이 바로 쿼터니언 회전이다.
회전 자체를 수학적으로 하나의 연산으로 표현하므로 축이 겹쳐도 문제가 없다.


5️⃣ 쿼터니언의 구조와 특징

Q = w + xi + yj + zk
  • 회전 방향과 회전 각을 동시에 표현할 수 있다
  • 단위 쿼터니언을 사용하면 회전만 표현 (크기 보정 필요 없음)
  • 두 쿼터니언을 곱하면 회전이 이어진다 (회전의 조합)
  • 벡터를 회전시키려면 q * v * q⁻¹ 형태로 계산한다

6️⃣ 쿼터니언의 회전 공식 요약

  1. 회전축 (x, y, z)와 회전각 θ가 주어지면
  2. 쿼터니언은 다음과 같이 구성된다:
q = cos(θ/2) + (x*i + y*j + z*k) * sin(θ/2)
  1. 어떤 벡터 v를 회전시키고 싶다면:
v' = q * v * q⁻¹
  • 여기서 v는 순수 허수 (0 + xi + yj + zk) 형태로 표현됨

7️⃣ 그래픽에서의 쿼터니언 사용 예시

  • Transform 컴포넌트에서 Rotation 값을 쿼터니언으로 저장
  • SLERP(Spherical Linear Interpolation)로 부드러운 회전 구현
  • 카메라 회전, 본(Bone) 회전, 물체의 자연스러운 회전 등에 필수

8️⃣ 쿼터니언과 SRT

게임 엔진에서 객체의 변환은 일반적으로 SRT로 표현된다:

  • Scale
  • Rotation
  • Translation

이 중 Rotation 부분에서 Quaternion을 사용하면:

  • Gimbal Lock 회피
  • 부드러운 인터폴레이션(SLERP)
  • 짧고 효율적인 계산

📌 왜 Quaternion을 배워야 할까?

이유설명
🎢 Gimbal Lock 방지3축 회전에서 축 겹침 문제 해결
🔄 회전 조합쿼터니언 곱으로 회전 연속 처리
🔧 연산 효율행렬보다 적은 계산량으로 회전 표현 가능
🔗 SLERP 사용 가능쿼터니언 사이를 부드럽게 보간 가능

profile
李家네_공부방

0개의 댓글