Lerp 实现匀速运动

原创 2015年07月10日 12:14:26

Lerp函数在Mathf,Vector3, 等类中都有,用法都类似,作用都是按照百分比取得从一个值过度到另外一个值的中间值。下面说的内容针对各中类的Lerp函数都是通用的。

Lerp的常见“误用”是

Update()
{
    Transform.position = Vector3.Lerp(transform.position.x, targetPosition, Time.deltaTime);
}

说是“误用”,其实也不完全正确,这种用法是可以工作的,但是常常不是大家的真正需求,很多时候大家使用Lerp都是想达到匀速运动的效果,但如下“误用”却让对象以逐渐降低的速度运动。

首先,上述“误用”是这样工作的:每帧都重新获取物体当前的位置,计算物体和目标距离的差距,再按照当前帧的持续时间(当做一个百分比)来移动这个比例的位置。因此如果目标位置始终是固定的,那么整体运动是缓动的,先快后慢。这样的效果乍一看还不错,但其实是有一些问题的:因为每秒钟都以固定的比例靠近目标位置,所以运动速度会以固定的比例逐渐降低,只要运算精度够高,运动永远达不到目标,且运算始终在进行。如果确实需要这样做,那么我们需要加上一个阈值,当与目标距离小于这个阈值时,就直接把物体的位置设置为目标位置。这个阈值的大小设置要合适,太大了在后面阶段会感觉到明显的跳跃,太小了会浪费运算时间。

这里说明一下,如果上述效果就是我们想达到的目标,那么用Time.deltaTime作为第三个参数在这个情况下是有道理的,因为每帧时间不同,为了保证单位时间内运动的百分比是一致的(达到平滑缓动的效果),需要用Time.deltTime介入。

如果你是误打误撞实现了缓动效果,并且觉得效果不错就没有再深究了,那么建议你继续往下看看。

用Lerp来实现匀速运动的代码

先看代码:

float speed = 2.0f;

//什么时候开始运动
float startTime = 2.0f;

//起始X位置
float startX = 0.0f;

//结束X位置
float endX = 0.0f;

void Update()
{
    float lerpValue = Mathf.Lerp(startX,endX,(Time.time-startTime )* speed);
    transform.position = new Vector3(lerpValue,0,0);
}

一定要理解清楚Mathf.Lerp(float a, float b, float t)第三个参数t的意义,它是一个百分比,最小值有效值是0,最大有效值是1,如果超出了1,就取1,小于0则取0.

它表示从a到b之间,按照t这个百分比来取值,例如a是0,b是100,如果t是0.2,则该函数返回的值是20,如果t是1,该函数返回的值为100.

匀速运动的要点是起始值和结束值都是固定好的,不会随着运动而发生变化。

Time.time就是系统运行时间,也就是这个程序开始到现在的时长。

(Time.time - startTime),上面例子中startTime是2.0f,那么这个式子的取值一开始是-2,2秒时变成0,3秒时变成1,先假设没有乘以speed这个值,整个运动过程会在2秒开始,3秒结束。

物体运动的速度是距离差(在本例中是10.0f)除以1秒。乘以一个speed以后,实际上是在调整整体的运动时间。
假设speed为0.1f,则运动的时间变为2秒开始12秒结束,运行时间变成了10,则速度变成原先的1/10,
同理,假设speed 为10f,则运动时间变为2秒开始2.1秒结束,速度变成原先的10倍。

版权声明:请尊重原创内容,转载请注明来源及链接。

相关文章推荐

Unity3D 物体移动方式总结

1. 简介     在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体     Transform 组...
  • MyArrow
  • MyArrow
  • 2015年05月19日 16:55
  • 62157

UE4材质初探

UE4的材质表面上看起来很简单,可是到了用的时候却总是没有办法实现好的效果。所以特意对文档进行阅读,初步了解了一下主要知识点。 当前使用的UE4版本:4.8.0。 UE4中的材质有很多用途...

UE4 材质的运算节点

原文如下: Abs Abs is an abbreviation for the mathematical term "absolute value". The Abs exp...
  • mofanit
  • mofanit
  • 2016年07月24日 12:22
  • 4220

UE4材质初探

UE4的材质表面上看起来很简单,可是到了用的时候却总是没有办法实现好的效果。所以特意对文档进行阅读,初步了解了一下主要知识点。 当前使用的UE4版本:4.8.0。 UE4中的材质有很多用途...

Unity3D控制物体移动

在游戏开发中,游戏物体的移动是最基本的,如果连物体都移动不起来,那就不用说玩游戏了。 下面记录了自己在开发中实现的物体移动,不同项目可能有不同的物体移动实现,也有很多种不同的物体移动实现,文章会持续更...

Unity Mathf 数学运算(C#)

今天开始看合金弹头范例,注意到这个函数Mathf.SmoothDamp的使用,游戏中用于做相机的缓冲跟踪和boss直升机跟踪士兵。该函数是Unity3D中Mathf数学运算函数中的一个。我们其实会留意...

Unity的Lerp函数实现缓动

下面例子实现点光源的移动在场景中创建好一个平面,一个点光源,我在这里随便放了一个模型。然后新建c#脚本,代码如下:using UnityEngine;using System.Collections;...
  • bean244
  • bean244
  • 2014年03月06日 16:23
  • 17091

Mathf.lerp()和Time.deltaTime的使用问题,rigibody去掉力的作用

float  a; float speed=2.0f; function Update() {    a=Mathf.Lerp(0,5,speed*Time.deltaTime); } /...

U3D物体移动方式小结

 转自:http://blog.csdn.net/myarrow/article/details/45846567 1. 简介     在unity3d中,有多种方式可以改变物体的坐标,实现...
  • six_sex
  • six_sex
  • 2016年02月06日 20:26
  • 3773

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

在unity3d中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间、两个向量之间、两个浮点数之间、两个颜色之间,其函数原型如下: 1.Material.Le...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lerp 实现匀速运动
举报原因:
原因补充:

(最多只允许输入30个字)