Quick Comparison
두 단위 쿼터니언 사이를 일정한 각속도로 최단 회전하려면 SLERP를 사용합니다. q와 −q가 같은 자세라는 중복을 처리하기 위해 내적이 음수이면 한쪽 부호를 먼저 뒤집습니다. t는 0부터 1까지의 진행률입니다.
| 방법 | 계산 | 회전 보간의 성질 |
|---|---|---|
| Lerp | (1−t)q₀+tq₁ | 일반적으로 단위 길이를 보존하지 않음 |
| Nlerp | normalize((1−t)q₀+tq₁) | 부호 정렬 후 단위 자세를 얻지만 각속도는 일반적으로 일정하지 않음 |
| Slerp | 단위 구면의 대원호를 따라 보간 | 부호 정렬 후 최단 경로, t에 대한 각속도가 일정함 |
단위 구면 위의 각도
쿼터니언은 실수 네 성분의 제곱합이 1인 단위 구면 위의 점으로 볼 수 있습니다. q₀,q₁을 정규화하고 부호를 정렬한 뒤 내적 s=q₀·q₁을 구합니다. φ=acos(s)는 쿼터니언 구면의 각도이며 실제 두 자세 사이의 최단 회전각은 2φ입니다.
q₀,q₁은 단위 쿼터니언
q₀·q₁<0이면 q₁을 -q₁로 교체
s=clamp(q₀·q₁,0,1)
φ=acos(s)
Slerp(q₀,q₁,t)
= sin((1-t)φ)/sinφ q₀ + sin(tφ)/sinφ q₁φ=0에서는 두 자세가 같아 위 식을 직접 계산하지 않습니다. 아주 작은 φ에서는 분모 sinφ 때문에 오차가 커질 수 있어 Nlerp로 근사하는 분기를 둡니다. 부호 정렬 후 실제 회전 차이가 180°이면 φ=90°라 sinφ=1입니다. 실제 180° 회전과 쿼터니언의 서로 반대인 두 점을 같은 특이 조건으로 혼동하지 않습니다.
직교 성분으로 유도하기
서로 다른 두 입력에 대해 q₁의 q₀ 방향 성분을 빼면, q₀와 q₁이 만드는 평면 안에서 q₀에 직교하는 방향을 구할 수 있습니다. 이 평면과 단위 구면이 만나는 원을 대원이라 하며, 그 원의 일부가 대원호입니다.
e = (q₁-s q₀)/sinφ
q₀·e=0, ‖e‖=1
q(t)=cos(tφ)q₀+sin(tφ)eq₀와 e가 정규직교하므로 q(t)의 길이는 1입니다. t가 일정하게 증가하면 구면 위 각도도 tφ로 일정하게 증가합니다. e를 대입하고 삼각함수 덧셈 공식을 적용하면 앞의 사인 가중치 식이 됩니다. 직교 성분을 빼는 원리는 직교 투영과 같습니다.
120° 회전의 중간 자세
성분 순서는 (w,x,y,z)이며 z축으로 0°에서 120°까지 회전합니다. 쿼터니언의 축각 표현에 따라 절반 각도를 저장합니다.
q₀=(1,0,0,0)
q₁=(1/2,0,0,√3/2)
s=1/2, φ=60°
t=0.25 → q=(cos15°,0,0,sin15°) → 실제 회전 30°
t=0.5 → q=(√3/2,0,0,1/2) → 실제 회전 60°
t=1 → q=q₁ → 실제 회전 120°같은 t=0.25에서 성분 Lerp와 Nlerp를 계산하면 차이가 보입니다.
Lerp 결과=(7/8,0,0,√3/8)
제곱 길이=13/16
Nlerp 결과=(7/(2√13),0,0,√3/(2√13))
실제 회전각=2 atan2(√3,7)≈27.80°Nlerp도 부호가 정렬된 두 입력 사이의 같은 짧은 원호를 따라가지만 진행률에 따른 위치가 다릅니다. 중간 t=0.5에서는 SLERP와 같은 자세가 될 수 있으므로 중간값 하나만 보고 전 구간의 각속도가 같다고 판단하지 않습니다.
최단 경로와 부호
q₁을 −q₁로 바꾸어도 도착 자세는 같습니다. 하지만 그대로 성분 보간하면 완전히 다른 경로를 택할 수 있습니다.
q₀=(1,0,0,0), q₁=(-1,0,0,0)
→ 두 입력은 모두 항등 회전
부호를 맞추지 않은 t=0.5의 Lerp는 (0,0,0,0)
→ 정규화 불가능
q₀·q₁=-1이므로 q₁을 뒤집으면 q₁=q₀
→ 전 구간 같은 자세 유지실제 자세 차이가 정확히 180°일 때에는 양쪽 회전 방향이 같은 길이여서 최단 경로가 하나로 정해지지 않습니다. 이때 내적이 0인 입력의 부호나 애플리케이션의 축 선택 정책이 경로를 결정합니다. 최단 경로 보간은 바퀴가 여러 번 도는 회전 횟수를 복원하지 못합니다. 그런 동작은 누적 각도·중간 자세·회전 방향을 추가 입력으로 보관해야 합니다.
계산 순서와 시간
1. 입력이 유한하고 길이가 0이 아닌지 확인한 뒤 q₀,q₁ 정규화
2. 내적이 음수이면 q₁ 부호 뒤집기
s=clamp(q₀·q₁,0,1)
3. s가 1에 충분히 가까우면 Nlerp 사용
그렇지 않으면 φ=acos(s)로 Slerp 계산
4. 부동소수점 길이 오차를 정규화로 보정근접 분기는 안정성을 위해 선택하는 근사입니다. 예를 들어 출처의 PBRT는 s가 0.9995보다 큰 경우 Nlerp를 사용합니다. 이 값은 수학적 경계가 아니며 요구 오차와 정밀도에 맞춰 고릅니다. 해당 근사 구간에서는 정확한 SLERP의 일정 각속도 성질을 그대로 주장하지 않습니다.
T초 동안 일정하게 회전하려면 고정된 시작·끝 자세에 대해 t=clamp(경과시간/T,0,1)을 사용하며 T는 양수여야 합니다. 현재 자세를 매번 새 시작점으로 삼아 고정 비율만큼 보간하면 남은 각도를 비율로 줄이는 동작이 됩니다. 위치의 반복 Lerp와 같은 시간 차이는 선형 보간에 있습니다.
여러 키프레임 구간을 각각 SLERP로 연결하면 경계 자세는 이어져도 각속도·회전축까지 매끄럽게 이어진다는 보장은 없습니다. 고차 회전 곡선과 여러 뼈의 가중 회전 합성은 두 자세 사이의 보간과 별도 문제입니다.
참고 링크
1 sources