숏컷 코드
position = lerp(current, target, t)
rotation = slerp(currentRot, targetRot, t)문법과 예시
Lerp를 매 frame 현재값에 다시 적용하면 "일정 속도 이동"이 아니다
current = Lerp(current, target, deltaTime * speed) 형태로 매 frame 반복하면 지수적 감쇠(exponential decay) 곡선을 그립니다. 목표에 가까워질수록 이동량이 작아지므로 이론적으로 목표 지점에 정확히 도달하지 않습니다. 이것은 버그가 아니라 특성이지만, "0.5초 만에 정확히 도착해야 한다"는 요구에는 맞지 않습니다. 그 경우에는 t = elapsedTime / duration으로 명시적 시간 기반 t 값을 계산해야 합니다. 또 이 방식은 frame rate가 달라지면 도착 감각이 바뀌기 때문에, 항상 deltaTime을 곱하거나 SmoothDamp 같은 frame-rate independent 함수를 써야 합니다.
// 지수적 수렴 (느낌 우선, 도착 시간 보장 없음)
current = Lerp(current, target, 1 - exp(-speed * deltaTime))
// 시간 기반 (도착 시간 정확, t는 0→1)
t = elapsedTime / duration
current = Lerp(start, target, t)회전에 Lerp를 쓰면 큰 각도 전환에서 방향이 틀어진다
쿼터니언 두 개를 직접 선형 보간(Lerp)하면 각속도가 일정하지 않고, 두 회전이 서로 반대 방향을 표현하는 쿼터니언일 때 최단 경로가 아닌 방향으로 회전할 수 있습니다. Slerp(Spherical Linear Interpolation)는 쿼터니언을 구면상에서 보간하므로 각속도가 일정하고 항상 최단 경로를 따라 회전합니다. 단, Slerp는 Lerp보다 삼각함수 연산 비용이 높습니다. 회전 변화가 작거나 성능이 중요한 경우 Nlerp(normalize 후 Lerp)가 근사값으로 충분하기도 합니다.
// 작은 각도 변화: Nlerp로 근사
Quaternion.Lerp(a, b, t) // Unity에서 내부적으로 normalize
// 큰 각도 전환 또는 일정 각속도 보장:
Quaternion.Slerp(a, b, t)damping은 도착 보장보다 반응 감각이 목표인 경우에 쓴다
damping은 목표를 향해 점점 느리게 수렴하는 감각을 만드는 기법으로, 카메라 추적, UI follow, spring-like movement에 자주 쓰입니다. Unity의 SmoothDamp는 목표 도달 시간과 최대 속도를 인수로 받아 frame-rate independent하게 감쇠 곡선을 계산합니다. 카메라가 캐릭터를 너무 빠르게 따라가면 멀미감이 생기고, 너무 느리면 답답합니다. damping 계수는 게임 감각 설계의 영역이므로, 수식보다 플레이테스트로 튜닝하는 것이 일반적입니다.
// SmoothDamp: smoothTime이 짧을수록 빠르게 따라옴
cameraPos = Vector3.SmoothDamp(
cameraPos, targetPos,
ref velocity,
smoothTime: 0.15f,
maxSpeed: 10f
)감각 설계 목표에 따라 보간 방식이 결정된다
"정해진 시간 안에 도착해야 하는가", "일정 속도로 이동해야 하는가", "부드럽게 수렴하면 충분한가"를 먼저 결정해야 보간 함수 선택이 가능합니다. 문을 여는 애니메이션은 정해진 시간에 완료되어야 하므로 시간 기반 Lerp, 카메라 추적은 부드러운 수렴이 우선이므로 SmoothDamp, 캐릭터 방향 전환은 최단 경로 회전이 중요하므로 Slerp가 맞습니다. 이 선택은 수학적 취향이 아니라 플레이어가 느끼는 감각 품질 문제입니다.
보간 방식을 고를 때 핵심
| 상황 | 적합한 선택 |
|---|---|
| 정해진 시간 안에 위치 이동 완료 | 시간 기반 Lerp(start, end, t) |
| 일정 속도 이동 | MoveTowards 계열 |
| 카메라 추적, 부드러운 follow | SmoothDamp 또는 지수적 수렴 |
| 큰 각도 회전, 일정 각속도 | Quaternion.Slerp |
| 작은 각도, 성능 중요 | Quaternion.Lerp (Nlerp 근사) |
| 정해진 시간 안에 회전도 끝나야 할 때 | 지속시간 기반 t를 따로 관리 |
특이 케이스와 주의할 점
흔한 실패는 Lerp(current, target, deltaTime * speed)를 만능 이동 공식처럼 쓰는 것입니다. 이 방식은 일정 속도도,
고정 도착 시간도 보장하지 않습니다. 먼저 "정해진 시간", "일정 속도", "부드러운 수렴" 중 어떤 감각이 필요한지 정하고
그에 맞는 함수를 고르세요.
참고 링크
2 sources