Unity3D - LINEAR INTERPOLATION

原文地址:http://unity3d.com/learn/tutorials/modules/beginner/scripting/linear-interpolation

水平有限,翻译粗略,欢迎吐槽 :)

 

When making games it can sometimes be useful to linearly interpolate between two values. This is done with a function called Lerp. Linearly interpolating is finding a value that is some percentage between two given values. For example, we could linearly interpolate between the numbers 3 and 5 by 50% to get the number 4. This is because 4 is 50% of the way between 3 and 5.

制作游戏时,在两个值之间进行线性插值有时候很有用。Lerp函数能够实现该功能。线性插值就是要找出两个给定值之间位于一定百分比的某个值。举例来说,在数字3和数字5之间以50%进行线性插值能够得到数字4。这是因为数字4位于数字3到数字5的50%处。

 

In Unity there are several Lerp functions that can be used for different types. For the example we have just used, the equivalent would be the Mathf.Lerp function and would look like this:

在Unity中有若干个用于不同类型的Lerp函数。对于我们之前刚刚举得例子来说,等价的Mathf.Lerp函数看起来如下:

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

 

The Mathf.Lerp function takes 3 float parameters: one representing the value to interpolate from; another representing the value to interpolate to and a final float representing how far to interpolate. In this case, the interpolation value is 0.5 which means 50%. If it was 0, the function would return the ‘from’ value and if it was 1 the function would return the ‘to’ value.

函数Mathf.Lerp有三个浮点型参数:一个表示插值的起始值,另一个表示插值的结束值,最后一个浮点数表示要插值多少。在上面的代码中,插值量是0.5,也就是50%。如果插值量是0,则函数就会返回起始值。如果插值量是1,则函数就会返回结束值。

 

Other examples of Lerp functions include Color.Lerp and Vector3.Lerp. These work in exactly the same way as Mathf.Lerp but the ‘from’ and ‘to’ values are of type Color and Vector3 respectively. The third parameter in each case is still a float representing how much to interpolate. The result of these functions is finding a colour that is some blend of two given colours and a vector that is some percentage of the way between the two given vectors.

其他Lerp函数的例子有Color.Lerp以及Vector3.Lerp。他们的工作方式和Mathf.Lerp函数几乎一致,除了起始值和结束值分别是Color和Vector3类型。他们的第三个参数仍旧是表示插值多少的一个浮点值。这些函数的结果是找出一个由两个给定颜色经过一定比例混合的颜色值以及两个给定向量之间位于一定百分比处的一个向量值。

 

Let’s look at another example:

让我们来看看另一个例子:

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);

 

In this case the result is (4, 5, 6) because 4 is 75% of the way between 1 and 5; 5 is 75% of the way between 2 and 6 and 6 is 75% of the way between 3 and 7.

在上面的情况下结果将是(4, 5, 6),因为数字4位于数字1到数字5的75%处,数字5位于数字2到数字6的75%处,数字6位于数字3到数字7的75%处。

 

The same principle is applied when using Color.Lerp. In the Color struct, colours are represented by 4 floats representing red, blue, green and alpha. When using Lerp, these floats are interpolated just as with Mathf.Lerp and Vector3.Lerp.

当使用Color.Lerp时其原理也是一样的。在Color结构体中,颜色是由4个分别表示红,蓝,绿和alpha的浮点值构成的。当使用Lerp时,这些浮点值的插值方式就像Mathf.Lerp与Vector3.Lerp一样。

 

Under some circumstances Lerp functions can be used to smooth a value over time. Consider the following piece of code:

在一些情况下Lerp函数能够用于随时间流逝而平滑一个值。来看下面的代码:

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

 

If the intensity of the light starts off at 0 then after the first update it will be set to 4. The next frame it will be set to 6, then to 7, then to 7.5 and so on. Thus over several frames, the lights intensity will tend towards 8 but the rate of it’s change will slow as it approaches its target. Note that this happens over the course of several frames. If we wanted this to not be frame rate dependent then we could use the following code:

如果光的强度从0开始,那么在第一次更新后它的值将是4。下一帧它的值将是6,接着是7,然后是7.5等等。因此在若干帧后,光的强度将会趋近于8,但是它的变化速率在接近目标值时将减慢。需要注意这个过程是发生在若干帧里的。如果我们想要这个过程不依赖帧率的话,那么我们可以使用下面的代码:

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

This would mean the change to intensity would happen per second instead of per frame.

这样就意味着强度的改变是依赖于每秒的,而不是每帧。

 

Please note that when smoothing a value it is often best to use the SmoothDamp function. Only use Lerp for smoothing if you are sure of the effect you want.

请注意,通常来说最好使用函数SmoothDamp来平滑一个值。只有在你确定函数Lerp能够达到你想要的效果时才去使用它。

posted @ 2015-03-22 21:04  EnigmaJJ  阅读(632)  评论(0编辑  收藏  举报