각속도로 사원수를 회전
이안 밀링턴 Game Physics Engine Development 책을 보고 있다. 거기서 아래 식

어떤 사원수에서 각속도만큼 회전했을 때 업데이트된 사원수를 구하는 식이다. 이 식의 유도 과정을 정리하였다.
책에서는 사원수를 θ로 표현했지만, 유도과정에서 회전각 θ와 기호가 헷갈릴 수 있기 때문에 기호 $q$로 대체해서 기술하겠다.
\[q(t+\Delta t) \approx q(t) + \frac{\Delta t}{2}\omega q(t)\]사원수와 각속도의 관계
사원수와 각속도 표현
단위 사원수는 회전을 표현할 때 각속도 벡터 형태로 나타낼 수 있다:
\[q = \cos\frac{\theta}{2} + \mathbf{u} \sin\frac{\theta}{2}\]여기서:
- $\theta$: 각속도 크기에 따른 누적 회전각 (라디안)
- $\mathbf{u}$: 각속도 벡터의 방향 (단위벡터)
실제로 언리얼엔진에서 사원수를 각속도 정보로 초기화하는 생성자 코드도 참고해보자.
FORCEINLINE TQuat<T>::TQuat(TVector<T> Axis, T AngleRad)
{
const T half_a = 0.5f * AngleRad;
T s, c;
FMath::SinCos(&s, &c, half_a);
X = s * Axis.X;
Y = s * Axis.Y;
Z = s * Axis.Z;
W = c;
}
회전에서 사원수 업데이트까지
1단계: 각속도에서 회전량 계산
각속도 $\omega$는 회전축 방향과 회전 속력을 나타내는 벡터다.
따라서 시간 간격 $\Delta t$ 동안의 회전량은:
\[\Delta\theta = \lvert\omega\rvert \Delta t\]회전축 방향은:
\[\mathbf{u} = \frac{\omega}{\lvert\omega\rvert}\]2단계: 회전을 사원수로 표현
이 회전을 사원수로 표현하면:
\[\Delta q = \cos\frac{\Delta\theta}{2} + \mathbf{u} \sin\frac{\Delta\theta}{2}\]삼각함수의 매클로린 급수:
\[\cos x = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \cdots\] \[\sin x = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \cdots\]고차항을 무시하면:
\[\cos(\Delta\theta/2) \approx 1\] \[\sin(\Delta\theta/2) \approx \frac{\Delta\theta}{2}\]따라서 회전 사원수는:
\[\Delta q \approx 1 + \frac{\Delta\theta}{2}\mathbf{u}\]$\mathbf{u} = \frac{\omega}{\lvert\omega\rvert}$를 대입하면:
\[\Delta q \approx 1 + \frac{\Delta\theta}{2} \cdot \frac{\omega}{\lvert\omega\rvert}\]$\Delta\theta = \lvert\omega\rvert \Delta t$를 추가로 대입하면:
\[\Delta q \approx 1 + \frac{\lvert\omega\rvert \Delta t}{2} \cdot \frac{\omega}{\lvert\omega\rvert} = 1 + \frac{\Delta t}{2}\omega\]3단계: 기존 회전에 적용
이미 회전되어 있는 사원수 $q(t)$에 이 회전을 곱해주면 전체 회전이 업데이트된다:
\[q(t+\Delta t) = \Delta q \cdot q(t)\]$\Delta t$ 근사에서:
\[q(t+\Delta t) \approx \left(1 + \frac{\Delta t}{2}\omega\right)q(t)\] \[q(t+\Delta t) \approx q(t) + \frac{\Delta t}{2}\omega q(t)\]이렇게해서 위 사진의 식으로 유도할 수 있다.
미분방정식 형태로 정리
위에서 구한 업데이트 공식을 다시 정리해보자:
\[q(t+\Delta t) - q(t) \approx \frac{\Delta t}{2}\omega q(t)\]양변을 $\Delta t$로 나누면:
\[\frac{q(t+\Delta t) - q(t)}{\Delta t} \approx \frac{1}{2}\omega q(t)\]$\Delta t \to 0$ 극한을 취하면, 이것이 바로 사원수 회전의 미분방정식이 된다:
\[\dot{q} = \frac{1}{2}\omega q\]