리깅: Slerp — 회전을 매끄럽게 보간하는 법
회전을 애니메이션할 때 가장 순진한 방법은 시작 자세와 끝 자세의 숫자들을 선형 보간(lerp)으로 섞는 것이다. 두 점 사이를 직선으로 채우는 그 방식은 위치를 옮길 때는 완벽하지만, 회전을 다루는 순간 이상하게 어그러진다. 왜 그런지, 그리고 그것을 어떻게 고치는지가 이 글의 전부다. 고치는 도구의 이름이 구면 선형 보간, 줄여서 slerp(슬러프)다.
직선 보간이 회전에서 무너지는 이유
회전은 방향을 가진 양이다. 3차원 회전을 사원수(쿼터니언)로 적으면, 단위 사원수 하나가 회전 하나에 대응하고, 모든 단위 사원수는 반지름이 1인 초구(4차원 공간의 구면) 위에 놓인다. 즉 회전 하나는 "구 위의 한 점"이다.
두 회전 와 을 lerp로 섞으면 어떻게 될까. lerp는 두 점을 잇는 직선 위를 걷는다. 그런데 그 직선은 구를 관통해 지나가는 현(弦)이다. 걷다 보면 구면에서 벗어나 안쪽으로 파고들었다가 다시 나온다. 결과 벡터의 길이가 1이 아니게 되어, 매번 다시 정규화해서 구면으로 끌어올려야 한다. 문제는 속도다. 현 위를 일정한 속도로 걸으면, 그것을 구면에 투영했을 때의 각속도는 일정하지 않다. 가운데에서 빠르고 양 끝에서 느려진다. 눈으로 보면 회전이 중간에 확 당겨졌다가 끝에서 뭉그러지는 것처럼 보인다.
우리가 원하는 것은 분명하다. 구면 위에서, 두 점을 잇는 최단 경로(대원의 호)를 따라, 일정한 각속도로 움직이는 것. slerp는 정확히 이 세 조건을 동시에 만족하도록 설계된 함수다.
기호부터 정리하자
보간을 시작하기 전에 등장인물을 확정한다.
- — 출발 점. 구 위의 단위 벡터.
- — 도착 점. 역시 구 위의 단위 벡터.
- — 보간 매개변수. 이면 출발, 이면 도착. 보통 . 가 시간이라고 생각하면 편하다.
- — 두 점 사이의 사잇각. 원점에서 와 로 뻗은 두 반지름이 벌린 각이다.
사잇각 는 내적으로 얻는다. 두 벡터가 모두 단위 길이이므로 그 내적이 곧 사잇각의 코사인이다.
여기서 은 성분끼리 곱해 더한 값이다. 두 회전이 같으면 , 정반대면 가 된다. 이 하나가 앞으로 나올 모든 식의 심장이다.
호 위를 걷는 식 세우기
이제 구면 위에서 에서 까지 각도 만큼 벌어진 호를 상상하자. 우리는 이 호를 에 비례해 나눠 걷고 싶다. 즉 시각 에서의 점은 출발점에서 각도 만큼 진행한 자리에 있어야 한다.
결과 점 를 와 의 가중합, 즉 꼴로 쓴다고 하자. 두 조건을 붙인다. 첫째, 결과가 항상 단위 길이일 것. 둘째, 결과가 와 이루는 각이 정확히 일 것. 이 두 조건에서 두 계수 가 유일하게 결정된다. 삼각형의 사인 법칙을 두 번 쓰면 깔끔하게 풀리고, 그 결과가 slerp 공식이다.
천천히 읽어 보자. 계수는 두 개의 사인 비율이다. 앞의 계수는 남은 각 의 사인을, 앞의 계수는 지나온 각 의 사인을 쓴다. 둘 다 로 나눠 정규화한다. 사인이 나오는 이유는, 이 계수들이 사실 삼각형의 대변 길이 비율이기 때문이다. 각도가 등장하는 자리에 삼각함수가 오는 것은 우연이 아니다 — 원 위의 호를 다루는 순간 사인과 코사인은 반드시 따라온다.
양 끝과 절반을 대입해 검산하기
좋은 공식은 극단에서 스스로를 증명한다.
을 넣으면 의 계수 이 되어 사라지고, 의 계수는 . 결과는 정확히 . 출발점이다.
을 넣으면 반대로 의 계수가 으로 사라지고, 결과는 . 도착점이다.
이면 두 계수가 모두 로 같아진다. 정확히 호의 한가운데, 두 점의 정중앙에 선다. lerp라면 이 지점이 구 안쪽으로 가장 깊이 파고든 자리였을 것이다. slerp는 그 자리를 구면 위에 정확히 얹는다.
왜 계수가 "빗변을 세운" 사인 비율인가
이 그림이 slerp 계수의 정체를 한눈에 보여 준다. 비스듬한 벡터를 호 위로 바로 세웠을 때, 그 성분이 곧 slerp 계수가 된다는 뜻이다.

핵심 직관은 이렇다. 와 은 서로 직교하지 않는다(사잇각이 라 비스듬하다). 그래서 결과를 이 둘의 합으로 나타낼 때, 만큼 회전한 점을 축과 축으로 "비스듬하게" 분해해야 한다. 직교좌표에서라면 계수가 코사인·사인이겠지만, 축이 기울어져 있으면 그 기울기 를 보정해 줘야 하고, 그 보정이 바로 분모의 다. 분자의 와 는 각 축에서 잰 성분이다. 사인 법칙을 기하로 옮긴 그림이 이것이다.
대원 호를 눈으로 보기
초록 굵은 선이 slerp가 걷는 대원의 호다. 붉은 점선이 lerp가 걷는 현이다. 현은 구 안쪽으로 파고들어 있고, 그 위를 등속으로 걸어 봤자 구면에 투영하면 속도가 들쭉날쭉해진다. slerp는 처음부터 구면을 떠나지 않는다. 보라색 가 두 반지름이 벌린 사잇각이며, slerp는 이 각을 로 정확히 등분해 걷는다.
등속을 보장한다는 말의 뜻
시각 에서의 점이 출발점과 이루는 각은 다. 이를 로 미분하면 각의 변화율은 로 상수다.
즉 가 시간이라면 각속도가 처음부터 끝까지 일정하다. 이것이 slerp가 "일정한 속도로 대원 호를 따라 움직인다"고 말할 때의 정확한 의미다. lerp에는 이 성질이 없다.
사원수의 이중 덮개와 최단 경로
회전을 사원수로 다룰 때 반드시 걸리는 함정이 하나 있다. 사원수 와 는 같은 회전을 나타낸다. 하나의 회전에 반대편 점 두 개가 대응하는 셈이다. 이것을 이중 덮개라고 부른다.
그래서 에서 로 slerp하기 전에 내적의 부호를 확인해야 한다. 만약 이면, 두 점이 구의 반대편 반구에 있어서 slerp가 먼 길(각도 )을 돌아가려 한다. 이때는 도착점을 에서 로 뒤집는다. 같은 회전을 나타내면서도 가까운 쪽에 있는 대표를 고르는 것이다.
이 한 줄을 빼먹으면 캐릭터의 팔이 짧은 길을 두고 반 바퀴를 크게 휘두르는 사고가 난다. 실무에서 slerp 버그의 태반이 이 부호 검사 누락이다.
0으로 나누는 문제와 lerp로의 안전한 후퇴
공식의 분모는 다. 두 회전이 거의 같으면 이고 이라, 그대로 계산하면 0에 가까운 수로 나누게 되어 수치가 폭발한다.
다행히 이 극한에서 slerp와 lerp는 서로 구별되지 않는다. 각이 아주 작으면 호와 현의 차이가 사라지기 때문이다. 그래서 실무 구현은 (또는 )가 어떤 임계값보다 크면, 즉 두 점이 충분히 가까우면, slerp 대신 정규화한 lerp로 조용히 후퇴한다.
여기서 은 아주 작은 양수(예: )다. 이 분기 덕분에 slerp는 두 자세가 붙어 있을 때도 안전하게, 겉보기에는 매끄럽게 동작한다.
정리하며
slerp를 한 문장으로 줄이면, "직선이 아니라 호를 따라, 각도를 로 등분해 걷는 보간"이다. lerp가 두 점을 현으로 잇는다면, slerp는 같은 두 점을 구면 위의 최단 호로 잇고, 그 위를 등속으로 지나간다. 공식의 두 사인 계수는 기울어진 두 축에서 잰 성분이고, 분모의 는 그 기울기를 보정하는 상수다. 여기에 부호 검사로 최단 경로를 고르고, 작은 각에서 lerp로 후퇴하는 두 안전장치를 더하면, 3차원 회전을 자연스럽게 이어 붙이는 견고한 도구가 완성된다.
함께 읽기 — 이 글이 쓰는 기초 수학
출처
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기