Unity3D中的线性插值Lerp()函数解析

在unity3D中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间、两个向量之间、两个浮点数之间、两个颜色之间,其函数原型如下:

Material.Lerp 插值

function Lerp(start : Material, end : Material, t : float) : void

在两个材质之间插值

Vector2.Lerp 插值

static functionLerp (from : Vector2, to : Vector2, t : float) : Vector2

两个向量之间的线性插值。按照数字t在form到to之间插值。

t是夹在0到1之间。当t=0时,返回from。当t=1时,返回to。当t=0.5时放回from和to之间的平均数。

Vector3.Lerp 插值

static functionLerp (from : Vector3, to : Vector3, t : float) : Vector3

两个向量之间的线性插值。按照数字t在from到to之间插值。

Vector4.Lerp 插值

static functionLerp (from : Vector4, to : Vector4, t : float) : Vector4

两个向量之间的线形插值。按照数字t在from到to之间插值。t是夹在[0...1]之间的值。,当t = 0时,返回from。当t = 1时,返回to。当t = 0.5 返回from和to的平均数。

Mathf.Lerp 插值

static functionLerp (from : float, to : float, t : float) : float

基于浮点数t返回a到b之间的插值,t限制在0~1之间。当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。

Color.Lerp 插值

static functionLerp (a : Color, b : Color, t : float) : Color

通过t在颜色a和b之间插值。

"t"是夹在0到1之间的值。当t是0时返回颜色a。当t是1时返回颜色b。

插值,从字面意思上看,就是在其间插入一个数值,这种理解是否正确呢?我们先从最简单的浮点数插值函数来分析:

Mathf.Lerp 插值

static functionLerp (from : float, to : float, t : float) : float

基于浮点数t返回a到b之间的插值,t限制在0~1之间。当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。

首先,我们来做一个试验,启动Unity3D,任建一个脚本文件,在其Start()中输入内容如下:

voidStart () {

print(Mathf.Lerp(0.0f,100.0f, 0.0f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 0.1f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 0.2f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 0.3f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 0.4f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 0.5f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 0.6f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 0.7f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 0.8f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 0.9f).ToString());

print(Mathf.Lerp(0.0f,100.0f, 1.0f).ToString());

}

运行Unity,在控制台将打印出:

这个实验是在0到100之间插值,插入什么值,取决于第3个参数,从打印结果可看出,第3个参数是个比例因数,是0.1时表示0到100这个长度的十分之一,同理,0.2表示十分之二,依此类推。从这点上看来,我们起初从字面上所理解的插值就是插入一个数值是可以这样理解的。

如果我们把上面那个脚本里的插值函数里的第一个参数变为100.0f,第二个参数变为110.0f,第三个参数保持不变,大家想想其运行结果该是什么呢?可不要认为是0、1、2、3、4、5、6、7、8、9、10了哟,实际结果是100、101、102、103、104、105、106….,因插值是把值插在原来的两数之间,这说明这个函数首先是根据第三个参数所给定的比例算出净增量,再加上起始数,最终算出插值值的。

在Unity3D游戏开发中,应用最多的是Vector3.Lerp 向量插值,下面我们以此插值来猜推其内部实现机理以及一些应用。

如图,在空间中存在两点A(0,10,0)与B(10,0,-10),我们在A、B两点间插入一C点,假设C点的位置在AB的五分之二处,即AC/AB=0.4,根据相似图形对应边成比例的初中几何知识可知,在⊿ABO中AC/AB=OD/OB,同理在⊿OBF中OD/OB=OE/OF,所以AC/AB=OD/O=OE/OF = 0.4,则C点的X坐标值为:OE=0.4*OF=0.4*10=4。

根据上图,还可知ED/FB=0.4,所以C点的Z坐标值DE=0.4*BF=0.4*(-10)=-4。

C点的Y坐标值请看下图:

Lerp函数在游戏开发过程使用较多,在Unity的帮助文档里就有为我们列举了Vector3.Lerp的两个应用的例子,一个是在1秒时间动画位置移动从start.position开始到end.position结束:

using UnityEngine;

usingSystem.Collections;

public classexample : MonoBehaviour {

public Transform start;

public Transform end;

void Update() {

transform.position =Vector3.Lerp(start.position, end.position, Time.time);

}

}

另一个例子:

//像弹簧一样跟随目标物体

using UnityEngine;

usingSystem.Collections;

public classexample : MonoBehaviour {

public Transform target;

public float smooth = 5.0F;

void Update() {

transform.position =Vector3.Lerp(transform.position, target.position, Time.deltaTime * smooth);

}

}

这个例子中的transform.position是去跟随的那个物体的空间坐标,target.position是目标物体的空间坐标,整句的结果是让跟随物体的坐标不断地变化为它们两者之间的插值,然而随着时间的推移,第三个参数的值最终会为1,所以最终跟随物体的位置会与目标物体重合的。我们以前所玩的游戏中,主人公身上依附着一只宠物如鹰,主人公移动时,鹰会跟随着飞动,主人公移动得快它就飞行跟动得快,始终不会离开主人公,使用Lerp插值函数就可实现。

Vector3.Lerp相关推荐

  1. unity3d Vector3.Lerp解析

    Vector3.Lerp:http://www.ceeger.com/Script/Vector3/Vector3.Lerp.html 手册中描述的不是很详细,什么叫"按照数字t在from到 ...

  2. Vector3.Lerp 和 Vector3.SmoothDamp 使用的注意事项

    这两天在做相机平滑跟随玩家的功能,之前用的DoTween可以解决很大一部分的问题.但是目标位置如果一直在改变的话,就会有奇怪的眩晕感.所以老大说换着Vector3.Lerp 和 Vector3.Smo ...

  3. Unity Vector3.Lerp Vector3.LerpUnclamped 的区别

    Vector3.Lerp 最后的 t 一定是 0 到 1 之间 而 Vector3.LerpUnclamped t 其实是可以超出去的 也就是说 如果你想给俩个确定的 vector3 做一个延长线 那 ...

  4. unity3d问题集 对Vector3.Lerp 插值的理解 - 转自蛮牛

    有时,我们在做游戏时会发现有些跟随动作不够圆滑或者需要一个缓冲的效果,这时,一般会考虑到插值.所以对插值的理解是必需的.(比如摄像机跟随主角) 插值是数学上的一个概念,在这里用公式表示就是:from  ...

  5. Unity3D基础API之Vector3

    Vector3 静态方法 1.Vector3.Angle()--两个向量之间的夹角 public static float Angle(Vector3 from, Vector3 to) 单位:度: ...

  6. Unity的Lerp函数实现缓动

    在Unity里面Lerp函数可以实现缓动效果 下面例子实现点光源的移动 在场景中创建好一个平面,一个点光源,我在这里随便放了一个模型. 然后新建c#脚本,代码如下: using UnityEngine ...

  7. [Unity3D] MoveTowards、Lerp、Slerp

    MoveTowards.Lerp.Slerp 这三个函数相信大家经常遇到,这些都是在做一些过渡操作时需要用到的,那么它们间的具体差别是什么呢?其实要搞清楚它们的区别,只要仔细看官方说明,明白它们的具体 ...

  8. Unity—Lerp插值函数

    转载自CSDN游一法师: 有时,我们在做游戏时会发现有些跟随动作不够圆滑或者需要一个缓冲的效果,这时,一般会考虑到插值.所以对插值的理解是必需的.(比如摄像机跟随主角) 插值是数学上的一个概念,在这里 ...

  9. unity中mathf.Lerp的运用

    在unity3d中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间.两个向量之间.两个浮点数之间.两个颜色之间,其函数原型如下: 1.Material.Lerp 插值 fun ...

最新文章

  1. 程序员客栈携手野狗 体验国内领先的实时后端云协作
  2. 【最全干货】从SGD到NadaMax,十种机器学习优化算法原理及实现
  3. RabbitMQ之RPC实现
  4. .NetCore实践篇:成功解决分布式监控ZipKin聚合依赖问题(三)
  5. 配置并初始化oracle的网络环境
  6. 190522每日一句
  7. 个性化hexo博客,添加评论系统,分享,友情链接功能
  8. Gluster (一)安装
  9. 网络编程:使用tcp协议实现服务器与客户端交互
  10. ARM裸机-13.LCD
  11. 声音频率和乐器知识记录
  12. 【STM32F4系列】【HAL库】【自制库】WS2812(软件部分)(PWM+DMA)
  13. 怎样搭建企业内部wiki
  14. 你需要掌握的 Koa 洋葱模型和中间件
  15. Unity中用Shader实现镜子效果
  16. 模拟德州扑克对战游戏
  17. 创业项目-网赚项目 - 靠一份文档做到月入数万
  18. Arduino ESP8266 创建OneNet设备(二)
  19. 开关电源雷击浪涌整改_开关电源雷击浪涌的产生与防护
  20. 行车电脑蓝牙ELM327 OBD使用记

热门文章

  1. 在大数据时代 你的信用值几个钱?
  2. (Java笔记)IO流的六类16种流方式
  3. mybatis中的parameterType属性
  4. 开发转向系统:您需要MXsteerHiL的五大理由
  5. Swagger2介绍及使用
  6. 是不是计算机四级等于大学本科计算机毕业证
  7. 值得记住的爱情箴言(1)——阿牛我收藏的
  8. 高等数学笔记-乐经良老师-第十章-曲线积分和曲面积分
  9. 机器视觉halcon学习——杂质检测
  10. 视频美颜SDK开发有哪些难点?