原文地址: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能够达到你想要的效果时才去使用它。

最新文章

  1. 解决android:background背景图片被拉伸问题
  2. [转帖]The Lambda Calculus for Absolute Dummies (like myself)
  3. RobotFramework - 基础入门
  4. 第二次冲刺-Runner站立会议01
  5. php策略模式的研究
  6. Python【第七篇】面向对象进阶
  7. Qt中QWidget加入到父类QWidget不能显示的问题
  8. 【Java每日一题】20170301
  9. 什么是JDK?什么是JRE?JDK与JRE的区别和用途
  10. Mysql优化系列--Innodb引擎下mysql自身配置优化-转
  11. Spark的性能调优
  12. SGU 141.Jumping Joe 数论,拓展欧几里得,二元不等式 难度:3
  13. Cocoa Touch(二):数据存储CoreData, NSKeyArchiver, NSOutputStream, NSUserDefaults
  14. Python 与 Javascript 比较
  15. Java之Poi导出Excel文档
  16. Bootstrap(Web前端CSS框架)
  17. ServletContext结合Servlet接口中的init()方法和destroy()方法的运用----网站计数器
  18. 360 so动态脱壳
  19. c# 访问Mysql
  20. Java基础学习总结(59)——30 个java编程技巧

热门文章

  1. 【AC自动机/fail树】BZOJ3172- [Tjoi2013]单词
  2. 十. 图形界面(GUI)设计11.对话框
  3. winform如何保持TreeView节点展开和折叠的状态
  4. 关于JS中原型链中的prototype与_proto_的个人理解与详细总结
  5. nodeJs常用API
  6. Restful Web Service部署到weblogic 12c
  7. ASP.NET MVC file download sample
  8. php之变量覆盖漏洞讲解
  9. Digg工程师讲述Digg背后的技术
  10. 基于Opencv自带BP网络的车标简易识别