曲線・補間

線形補間・値域変換

Lerp / Inverse Lerp / Remap

値を混ぜたり範囲を変えて色や大きさへ対応させる。

7 / 10

インタラクティブデモ

デモを準備しています…

線形補間・値域変換

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

Lerp(線形補間)は 2 つの値を比率 tt で混ぜる関数、Inverse Lerp はその逆で「値がどの比率の位置にあるか」を求める関数、Remap は両者を続けて「ある範囲の値を別の範囲へ写す」関数です。ゲームのコードで最も頻繁に登場する 3 つの道具と言っても過言ではありません。

ゲームでの使いどころ

  • 距離に応じた演出:近づくと明るくなる街灯、敵との距離で強くなる警告音、カメラからの距離でフェードする物体(デモ)。
  • HP バーや UI:HP の割合で色を緑から赤へ、ゲージの長さを 0 から最大へ。
  • パラメータの対応付け:アナログスティックの傾き(0〜1)を歩行速度(1.5〜6 m/s)へ、車の速度をエンジン音のピッチへ。
  • アニメーションとブレンド:2 つの姿勢や色、カメラ位置を混ぜる基本操作。イージングは tt を曲げてから Lerp に渡すものです。

しくみ

lerp(a,b,t)=a+(b−a) t=(1−t) a+t b\text{lerp}(a, b, t) = a + (b - a)\,t = (1 - t)\,a + t\,b invLerp(a,b,v)=v−ab−a\text{invLerp}(a, b, v) = \frac{v - a}{b - a} remap(v; ain,bin→aout,bout)=lerp(aout,bout,invLerp(ain,bin,v))\text{remap}(v;\, a_{\text{in}}, b_{\text{in}} \to a_{\text{out}}, b_{\text{out}}) = \text{lerp}\big(a_{\text{out}}, b_{\text{out}}, \text{invLerp}(a_{\text{in}}, b_{\text{in}}, v)\big)
  • t=0t = 0 で aa、t=1t = 1 で bb、t=0.5t = 0.5 でちょうど中間。
  • tt が 0〜1 の外に出ると外挿になり、aa と bb の範囲を超えます。意図しない場合は tt を clamp します。
  • ベクトルや色にも成分ごとに適用できます。ただし回転(四元数)には球面線形補間を使います。

デモでは、プレイヤーと街灯の距離 dd を invLerp(a,b,d)\text{invLerp}(a, b, d) で比率にし、1−t1 - t を明るさと色の Lerp に渡しています。「近い距離 a」「遠い距離 b」を変えても、コード側の明るさの式は一切変わらない点がポイントです。

実装のポイント

  • 数値誤差に強い形:a + (b - a) * t は t=1t = 1 でわずかに bb からずれることがあります。端点を厳密に一致させたいなら (1 - t) * a + t * b を使います。
  • エンジンの関数:Unity の Mathf.Lerp は tt を自動でクランプし、Mathf.LerpUnclamped はしません。GLSL の mix はクランプしません。どちらかを意識して使い分けます。
  • ゼロ除算:Inverse Lerp で a=ba = b のときは 0 除算になります。範囲をユーザーが設定できる場合はガードを入れます。

つまずきやすい点

  • lerp(current, target, 0.1) を毎フレーム呼ぶ:よく見る「なめらかに近づく」書き方ですが、フレームレートによって速さが変わります。時間に依存しない指数減衰の形 1 - exp(-k * dt) を係数に使います。
  • 色の Lerp:sRGB の値をそのまま混ぜると、中間色が暗く濁ります。見た目の自然さが重要なら、線形色空間や OKLab で混ぜます。
  • 角度の Lerp:350° と 10° を混ぜると 180° を経由してしまいます。角度は差を [−180°,180°)[-180°, 180°) に正規化してから補間します。

デモで試すこと

  1. プレイヤー(緑)をドラッグして街灯に近づけたり離したりしてください。左下の数値で「距離 → 比率 → 明るさ」の変換を順に追えます。
  2. 「近い距離 a」と「遠い距離 b」を動かすと、右下のグラフの折れ線(Inverse Lerp の結果)が伸び縮みします。
  3. 「比率を 0〜1 にクランプ」をオフにすると、範囲外で比率が 0 未満・1 超になり、色が不自然な方向へ振り切れる様子が見えます。

参考資料

The Book of Shaders — Shaping Functions ↗

分野全体の資料で、この項目を直接扱っているとは限りません。