Minssuy

Rigidbody - Interpolation

Unity for Game Development
By Minssuy
Posted 2026/03/272026년 3월 27일 금요일 AM 12:00
3 min read773 words
Rigidbody - Interpolation

계산과 예측


여러분은 다음 날 아침에, 친구와 놀러 가기로 했습니다. 어떤 옷을 입을지 결정하기 위해 일기예보를 확인해봅니다. 내일 오전 9시는 10°, 10시는 14°라고 합니다. 오전에는 조금 쌀쌀하지만, 시간이 지나면서 기온이 오를 것으로 보입니다. 그래서 외투를 입을지 고민이 됩니다. 그런데 아쉽게도 일기예보는 10시까지만 제공되고 있습니다. 이제 우리는 주어진 정보만으로 판단해야 합니다.

현재 우리가 알고 있는 것은 다음과 같습니다.

  • 오전 9시 : 10°
  • 오전 10시 : 14°

그렇다면, 오전 9시 30분의 기온은 어느 정도일까요?
아마도 12° 정도로 예측을 해볼 수 있겠네요. 이건 꽤나 정확할 가능성이 높습니다.


이번에는, 오전 11시의 기온은 어느 정도일까요?
주어진 정보만으로 판단해보면, 9시에서 10시 사이에 가 상승했으므로, 같은 흐름이 이어진다고 가정했을 때 오전 11시는 약 18° 정도일 것으로 예상할 수 있습니다.


그럼 여기서 질문해보겠습니다.
오전 9시 30분의 예측 기온과, 오전 11시의 예측 기온 중 어떤 값이 더 정확할까요?


내삽과 외삽


아마도 여러분은 오전 9시 30분의 예측 기온이 더 정확할 것이라고 생각하셨을 것입니다.
그렇다면 우리는 왜 이런 판단을 내렸을까요?

그 이유는, 두 경우가 서로 다른 범위에 있기 때문입니다.

오전 9시 30분9시10시 사이, 즉 우리가 알고 있는 데이터의 범위 안에 있습니다.
반면, 오전 11시는 주어진 데이터의 범위를 벗어난 값입니다.

따라서 9시 30분의 경우는 기존 정보를 바탕으로 계산한 값이고, 11시는 그 흐름을 바탕으로 예측한 값이기 때문에 정확도에서 차이가 발생합니다.


앞의 예시를 기준으로 정리해보면 다음과 같습니다.

  • 오전 9시 ~ 10시 사이의 값을 예측한 것 → 내삽(보간) Interpolation
  • 오전 11시처럼 범위를 벗어난 값을 예측한 것 → 외삽 Extrapolation

이것이 이 포스트에서 다뤄볼 내삽과 외삽의 개념입니다.
한국, 일본, 중국 등 개발이나 그래픽스 분야에서는 내삽보다는 보간 이라는 표현이 더 일반적으로 사용됩니다. 지금부터는 보간이라는 용어를 사용하겠습니다.


그럼, 이 개념을 Unity 의 Rigidbody 와 연결해보겠습니다.


Rigidbody - Interpolation


Unity에는 매 프레임마다 실행되는 Update와, 고정된 간격으로 실행되는 FixedUpdate가 있습니다. 물리 연산은 FixedUpdate에서 처리되며, 기본값은 초당 50회입니다. 반면 Update는 프레임률에 따라 가변적으로 실행됩니다.

Default Update, FixedUpdate

이 두 루프는 항상 같은 타이밍에 실행되지 않습니다. 물리 위치는 FixedUpdate마다 갱신되지만, 화면에 그려지는 건 Update(렌더링) 타이밍입니다. 그럼 Interpolation 프로퍼티에 대해서 알아보겠습니다.


비교

백문이 불여일견입니다. 세 가지 옵션을 직접 비교해보겠습니다. 각 큐브의 Interpolation을 다르게 설정하고, TimeScale을 낮춰 슬로우모션으로 확인해보면 어떤 모습으로 보일까요?

TimeScale: 0.3, FPS: 60

차이점이 느껴지시나요? 제 눈으로 본 느낌을 그대로 말해보겠습니다.

  • None : 움직일 때 뚝뚝 끊겨 보이는 떨림이 발생합니다.
  • Interpolate : 부드럽지만, 다른 큐브들보다 살짝 늦게 도착하는 것처럼 보입니다.
  • Extrapolate : 부드럽지만, 바닥에 닿을 때 더 많이 찌그러지는 것처럼 보입니다.

왜 이런 차이를 보이게 되는 걸까요?


None

보정을 하지 않습니다. 렌더링 시점에서 가장 최신의 FixedUpdate에서 계산된 물리 위치를 그대로 렌더링합니다. FixedUpdate와 렌더링 타이밍이 어긋나면 오브젝트 위치가 불연속적으로 바뀌면서 떨림(Jitter) 이 발생합니다. 쉽게 말해서, 물리 위치 자체는 정확하지만, 렌더링 타이밍과 맞지 않아 위치가 뚝뚝 끊겨 보이는 겁니다.

None None - Uses the latest FixedUpdate position


Interpolate

직전 두 FixedUpdate의 위치를 사용하여, 그 사이를 보간합니다.

Interpolate Uses the previous two FixedUpdate results and renders one step behind

직전 두 FixedUpdate 위치를 A, B라 하면, A에서 B까지의 구간 중 렌더링 시점이 어디에 해당하는지 비율(α) 을 구하고, A와 B 사이의 위치를 보간하여 렌더링합니다. FixedUpdate가 초당 50번만 실행되더라도, 매 프레임마다 조금씩 다른 위치를 렌더링하기 때문에 움직임이 부드럽게 보입니다. 단, 항상 이미 완료된 과거 두 위치를 기준으로 보간하기 때문에, 렌더링 위치는 실제 물리 위치보다 한 FixedUpdate 스텝만큼 뒤처집니다.
왜 위의 영상에서 Interpolate 로 설정된 큐브가 늦게 떨어지는지 아시겠나요?


Extrapolate

현재 속도를 기반으로 다음 위치를 예측(외삽) 합니다. 일기예보에서 10시까지의 데이터로 11시 기온을 예측했던 것과 같습니다. 주어진 데이터 범위를 넘어서는 예측이기 때문에, 속도나 방향이 급격히 바뀌는 상황에서는 예측이 빗나가면서 오브젝트가 실제 위치를 넘어갔다가 되돌아오는 현상이 발생할 수 있습니다.

Extrapolate Predicts the next position based on current velocity and renders ahead

Extrapolate 로 설정한 큐브가 바닥에 닿았을 때, 왜 다른 큐브들 보다 더 찌그러져 보였는지 아시겠나요? 렌더러는 큐브가 계속해서 아래로 내려갈 것이라고 예측해서 그렸으나, 갑작스런 바닥과의 충돌에 미처 예상을 하지 않았다는 것입니다.


정리


영상을 다시 보겠습니다. 이번엔 최종 결과에 초점을 잡아봅시다.

TimeScale: 0.3, FPS: 60

Physics 실제로 바닥과 충돌한 시간

  1. Extrapolate Cube : 0.920s
  2. None Cube : 0.920s
  3. Interpolate Cube : 0.920s

Render 그림이 바닥에 닿은 시간

  1. Extrapolate Cube : 0.893s
  2. None Cube : 0.904s
  3. Interpolate Cube : 0.914s

여기서 주목할 점은 실제 물리 충돌은 세 큐브 모두 동일한 시간에 발생했다는 것입니다. Interpolation 설정은 물리 연산 자체에는 영향을 주지 않습니다. 그렇습니다. 차이가 나는 것은 렌더링 타이밍 뿐입니다.


물리 충돌은 동일한데, 렌더링 도착 시간이 다른 이유를 정리하면 이렇습니다.

  • Extrapolate : 미래를 예측하므로 실제보다 앞서 그려짐. 이에 따라 바닥을 많이 관통함.
  • Interpolate : 과거 두 위치를 보간하므로 실제보다 뒤처져 그려짐.
  • None : FixedUpdate 위치를 그대로 사용하므로 그 중간.

그렇다면 우리는 언제, 무엇을 써야 할까요?

옵션 상황
None 물리 오브젝트가 카메라에 보이지 않거나, 떨림이 눈에 띄지 않는 경우
Interpolate 플레이어 캐릭터, 카메라가 추적하는 오브젝트 등 부드러운 움직임이 중요한 경우
Extrapolate Interpolate의 약간의 지연조차 허용하기 어려운 경우. 단, 급격한 방향 전환 시 오차가 발생할 수 있음

대부분의 경우 Interpolate를 사용하면 됩니다. 연산이 걱정이라면 괜찮습니다. Interpolate의 핵심 연산은 선형 보간(Lerp)입니다.

result=A+(BA)αresult = A + (B - A) \cdot \alpha

이전 위치 A, 직전 위치 B, 진행 비율 α만 있으면 덧셈과 곱셈 몇 번으로 끝나는 O(1) 연산입니다. Rigidbody 하나당 렌더링 프레임마다 한 번만 실행되므로, 물리 시뮬레이션 자체의 비용에 비하면 무시할 수 있는 수준입니다. 특별한 이유가 없다면 Interpolate를 기본값으로 두는 것이 좋습니다.


Reference


© Powered by Minssuy