Linear Interpolation (線形補間)

Tutorial

Beginner

+0XP

10 mins

(12)

Unity Technologies

Linear Interpolation (線形補間)

ゲームを作っていると、2 つの値を直線的に補間するのが便利な場合があります。これには Lerp という関数を使います。

本チュートリアルは Beginner Scripting プロジェクトに含まれています。

前のチュートリアルは:Look At

次のチュートリアルは:Destroy

Languages available:

1. Linear Interpolation (線形補間)

ゲームを作っていると、2 つの値を直線的に補間するのが便利な場合があります。これには Lerp という関数を使います。線形補間とは、2 つの与えられた値の間のある割合の値を見つけることです。例えば、3 と 5 の間を 50%ずつ直線的に補間すると、4 という数字が得られます。これは、4 が 3 と 5 の間の真ん中、50% であるためです。

Unity には様々なタイプの Lerp 関数が用意されており、それらを使用することができます。先ほどの例では、Mathf.Lerp 関数が相当し、以下のようになります:

// In this case, result = 4
float result = Mathf.Lerp (3f, 5f, 0.5f);

Mathf.Lerp 関数は、3 つの浮動小数点パラメーターを受け取ります。1 つは補間元の値、もう 1 つは補間先の値、そして最後の浮動小数点は補間する距離を表します。この場合、補間値は 0.5、つまり 50% となります。これが 0 の場合、この関数は「from」の値を返し、1 の場合、この関数は「to」の値を返します。

Lerp 関数の他の例として、Color.Lerp や Vector3.Lerp があります。これらは、Mathf.Lerp と全く同じように動作しますが、「from」と「to」の値がそれぞれ Color と Vector3 の型になっています。いずれの場合も、3 番目のパラメーターは、どれだけ補間するかを表す float です。これらの関数の結果、与えられた 2 つの色のブレンドである色と、与えられた 2 つのベクトルの間の距離の何パーセントかの値を示すベクトルを見つけることができます。

別の例を見てみましょう:

Vector3 from = new Vector3 (1f, 2f, 3f);
Vector3 to = new Vector3 (5f, 6f, 7f);

// Here result = (4, 5, 6)
Vector3 result = Vector3.Lerp (from, to, 0.75f);

この場合、4 は 1 と 5 の間の 75%、5 は 2 と 6 の間の 75%、6 は 3 と 7 の間の 75% であるため、結果は(4、5、6)となります。

Color.Lerp を使う場合も同じ原則が適用されます。Color 構造体では、色は赤、青、緑、アルファの 4 つの浮動小数 (float) で表されます。Lerp を使用すると、Mathf.Lerpや Vector3.Lerp と同様に、これらの浮動小数が補間されます。

状況によっては、Lerp 関数を使用して値を時間と共に平滑化することができます。次のようなコードを考えてみましょう:

void Update ()
{
    light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f);
}

光の強さが 0 から始まった場合、最初の更新後に 4 に設定され、次のフレームでは 6、7、7.5 というように設定されていきます。このように、数フレームに渡って、ライトの強度は 8 に向かって変化しますが、その変化の割合は目標に近づくにつれて遅くなります。これは数フレームの間に起こることに注意してください。これをフレームレートに依存しないようにするには、次のようなコードを使用します:

void Update () { light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f * Time.deltaTime); }

void Update ()
{
    light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f * Time.deltaTime);
}

これは、強度の変化がフレーム単位ではなく、1 秒単位で起こることを意味します。

値を滑らかに変化させる場合、SmoothDamp 関数を使用するのが最善であることが多いことに注意してください。目的地に対して滑らかに到達するために Lerp を使うのは、自分が求める効果がはっきりしている場合のみにしてください。

Complete this Tutorial