Unity中的Lerp插值的使用

Unity中的Lerp插值使用

前言

        平时在做项目中插值的使用避免不了,之前一直在插值中使用存在误区,在这里浅浅记录一下。之前看的博客或者教程还多都存在一个“永远到达不了,只能无限接近”的一个概念。可能是之前脑子中没有插值的概念没理解对,或者当时看的up主也是没理解对,程序员难免会有“bug”,发现解决完善它就OK了。

        一直坚持做一件事很难,希望大家都能坚持下去,慢慢的成长。

Lerp是什么

        首先看官方的定义

public static Vector3 Lerp(Vector3 a, Vector3 b, float t);

参数
在这里插入图片描述
返回值

a + (b - a) * t.

描述
        两点之间的线性插值。

        通过插值器t在点a和b之间进行插值。参数t被限制在[0,1]的范围内。这通常用于在两个端点之间的直线上找到一个点(例如,在这些点之间逐渐移动一个物体)。

以上是官方给出的描述,那Lerp的中的三个参数a,b,t具体是什么呢?

        我的理解是a是起始点,b是目标点,t是一个0到1的进度,举一个例子如果a为(0,0,0),b为(10,10,10),那么t为0.5时,返回(5,5,5)。就这么简单。开发项目中最常见的就是处理摄像机的移动用到Lerp

void Update()
{
    transform.position = Vector3.Lerp(transform.position, endPosition, Time.deltaTime);
}

        上述代码的效果就是,运行一开始摄像机会快速向endPosition位置移动,随着距离接近然后越来越慢。出现这个现象的原因,一开始transform.position与endPosition的距离最远,所以插值的距离也大,视觉上运动很快,随着距离慢慢靠近,插值的距离也越来越短,就会出现先快后慢的效果。这里使用Time.deltaTime就出现了开头说的永远无法到达目标的问题。只会越来接近。

如何使用Lerp

        要理解Lerp,最重要一点就是使用时要有一个进度的一个概念,如上述例子中如果t为0.5,则返回的坐标就为(5,5,5),这个0.5就是一个进度
举例来说明,就是上述例子1秒内一个物体从(0,0,0)到(10,10,10)

    Vector3 startPos = Vector3.zero;
    Vector3 endPos = new Vector3(10,10,10);
    float duration = 1f;
    float curTime = 0f;
	void Update()
    {
        float t = curTime / duration;

        transform.position = Vector3.Lerp(startPos, endPos, t);
        curTime+=Time.deltaTime;
    }

上述代码中的t就是进度,这样就不会到达不了endPos

如有错误,欢迎指正。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值