lerp関数(線形補間)について

自分が使ってきていた式と違う式を見たのでメモ。

始点と終点の二つの数値の間で、指定した補間値による数値を取得することができる。

関数にしてループで使用する。
返ってきた値をまた始点に設定して使用すると、終点に達するまでの数値を取得し続けることができる。

用途としては、主にオブジェクトを滑らかに移動させたり、色や透明度などのプロパティを変化させる場合などに使用する。

/**
 * t 補間値 0〜1 の数にする
 * limit 始点と終点の差がこの数値以下になったら、終点の値にする
 */
function lerp(start, end, n, limit = 0.001) {
  let current = (1 - n) * start + n * end;
  if (Math.abs(end - current) < limit) current = end;
  return current;
}

// 今までこんな感じのを使っていた
function lerp2(start, end, n, limit = 0.001) {
  let current = start + (end - start) * n; // この行の式が違う
  if (Math.abs(end - current) < limit) current = end;
  return current;
}

新しく知ったのは 点に1から補間値を引いている数値を乗算している。
今勉強しているglslでは、0〜1を結構頻繁に使っている感じがする。

使用例

// 使用例

let reqId;

let start = 0;
const end = 100;
const n = 0.5;

function animation() {
  reqId = window.requestAnimationFrame(animation);
  start = lerp(start, end, n);

  if (start === end) {
    window.cancelAnimationFrame(reqId);
  }
}

animation();

1回目のループ 50 が返ってくる。

返ってきた値は次のループの start に代入されるので、

2回目のループ 75 が返ってくる。
3回目のループ 87.5
4回目のループ 93.75

start と end の差が limit(0.001) 以下になると、end の値を start に代入してループ終了。

ページの先頭へ