描画補完処理について探ってたところ、unityのRigidbodyInterpolationが勉強になりそうだったので、理解のため調べてました。
RigidbodyInterpolationについては以下の記事で詳しく書かれています。
https://ekulabo.com/rigidbody-interpolate
こちらの記事でも軽く触れられてますが、それぞれのオプションの振る舞いについて具体的な例題+図式を交えて書いてみようと思います。
といっても基本的にはこちらのアンサーの簡約+図式化になります。
https://answers.unity.com/questions/767134/physics-what-is-interpolate-extrapolate-discrete-c.html
例題
- 物理演算処理(fixedUpdate)がt=0.0s, t=0.5s, t=1.0s, t=1.5s, ...というような一定タイミングで計算されるとする。
- ここでt=1.2sのときに描画処理を行われた際、実際どのように描写されるか?
none(デフォルト設定)
最も直近であるt=1.0s時のパラメータを使って描画します。一切補間処理をしないので当然負荷も軽いですが、見た目がカクカクしがち。
extrapolate(外挿補間)
オブジェクトのvectorなどを使えば、次に来る位置は予測できます。このオプションではそれを利用してt=1.2時の位置を予測描画します。
none
に比べてスムーズになりますが、あくまで予測なので状況によっては変な位置に描画される可能性があります。
interpolate
このオプションに設定してると最新ではなく、敢えて1ステップ古いパラメータを使って描画してると考えられます。
例えば描画タイミングがt=1.0sだった時、最新のパラメータは1.0sのものになりますが、そこであえて一個前のデータであるt=0.5sのときのパラメータを使用します。そうすることでt=1.2sの時は、0.5~1.0sの2点間での補間によって算出可能になります。(t=1.2sを一ステップ前の基準で考えるとt=0.7s相当)
算出済データを使うのでextrapolate
と比べて補間精度が高くなります。ただし負荷も高めとのこと。
注意
interpolationの具体的振る舞いについては公式リファレンスでも詳細が無いため、あくまで想像になることに注意。ただ、
Interpolation will always lag a little bit behind but can be smoother than extrapolation.
という公式の表現や、こちらの記事での実験画面でもinterpolateオプションでは遅れて描画されていることから、過去データを使っていることは間違いないようです。