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
  • 70440

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

在unity3d中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间、两个向量之间、两个浮点数之间、两个颜色之间,其函数原型如下: 1.Material.Le...
  • u014659211
  • u014659211
  • 2016年05月26日 14:54
  • 11951

Unity3d移动代码(脚本)向前向后以及转弯,速度转向控制

#pragma strict function Start () { } var MoveSpeed=5; var RotateSpeed=20; f...
  • ybhjx
  • ybhjx
  • 2015年12月24日 00:01
  • 7102

unity 移动物体到指定位置的四种方法

方法1:使用Vector3.MoveTowards void Update () { float step = speed * Time.deltaTime; gameObject.trans...
  • lcy0221
  • lcy0221
  • 2015年03月03日 17:24
  • 25340

unity中Lerp的使用

unity中很多类都有Lerp的属性,比如Vector3.Lerp     Quaternion.Lerp  Color.Lerp  还有Slerp   用法都一样,这个属性叫做插值。 两个向量之...
  • i1tws
  • i1tws
  • 2016年11月25日 21:35
  • 1313

关于Lerp插值的基本原理和在Unity中的应用

简单的讲解一下其实也很简单的Lerp插值运算。通过这个讲解,希望能传达一种积极的严谨的程序思维。...
  • u010133610
  • u010133610
  • 2017年03月22日 12:35
  • 1876

Unity3D让物体从规定时间内移动到某一位置

方法1:Translate this.transform.Translate( Vector3.normalize( 目标位置 - 自身位置 ) * ( Vecotr3.Distance( 自身位置...
  • yuxikuo_1
  • yuxikuo_1
  • 2015年11月11日 19:53
  • 4370

Unity 3D 控制物体上下左右均匀移动脚本

//向上运动——W if(Input.GetKey(KeyCode.W)) { print("w"); transform.Translate(Vector3.up * Time....
  • oloveDDo
  • oloveDDo
  • 2015年10月01日 09:33
  • 5952

UE4材质初探

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

初学unity,关于解决有向匀速运动的问题

Vector3.Lerp和itween插件路径算法并不是需要的效果,在目标点转换的时候使用这两个方法并不会匀速,两点间的距离越大速度就越快,我对itween的算法还不太了解,现在我着重解释一下怎么用V...
  • ep661215
  • ep661215
  • 2015年11月10日 10:44
  • 598
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lerp 实现匀速运动
举报原因:
原因补充:

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