欢迎光临散文网 会员登陆 & 注册

unity中差值函数

2021-10-23 01:26 作者:柯昌弟弟c  | 我要投稿

在做摄像机移动时候,在网上查看代码,发现有两个类似的函数

  1. Lerp()函数

  2. SmoothDamp()函数

两个差值函数都可以在摄像机平滑移动或者颜色渐变上使用。下边就简单介绍一下两个函数。

学习这两个函数主要是来自博主@巨龙饿了:https://www.jianshu.com/p/650e5ff6402c的两篇文章。

1.Lerp

unity常见的API中Vector3.Lerp Mathf.Lerp等是较为常用

//a:变化的起始值

//b:变化的目标值

//t:本次调用返回值所占b和a的差值的比例

//返回值为一个float类型

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

这种差值在最初的使用,是放在update中进行每帧运行

这里举一个例子,如果x从0到10进行移动:

  • 第一帧:移动到当前位置(0,0,0)到(10,0,0)的十分之一,也就是(1,0,0)

  • 第二帧:移动到当前位置(1,0,0)到(10,0,0)的十分之一,也就是(1.9,0,0)

  • 第二帧:移动到当前位置(1.9,0,0)到(10,0,0)的十分之一,也就是(2.71,0,0)

  • 后面以此类推...

在自己亲自尝试之后,发现lerp的用法会使值无限接近目标,但不等于目标。


当然也可以通过每一帧去改变第三个参数的值,让第三个值从0逐渐变化到1,也就可以实现平滑,并且可以准确的知道变化结束的那一刻了。


2.SmoothDamp

SmoothDamp的效果类似于Lerp的第一种用法所产生的效果,如果是作用在位移上,表现为慢慢减速到达目标位置,见名思意Damp(阻尼)就像是受到了阻力而减速,而这个函数和Lerp不同的地方则在于他的Smooth(平滑),因为其内部实现是遭轮子大佬调整过无数次参数得到的值,相比起Lerp简单粗暴的插值,在表现上看起来会优秀不少,所以一般如果用于摄像机平滑,都会使用SmoothDamp的。

//current:需要改变的参数的当前值,一般放在update中将每一帧的当前值传入

//target:目标值

//currentVelocity:函数所作用目标移动的最大速度,这个所谓的速度,表征的是该物体每秒移动Unity内多少个单位。

(需要注意的是:首先在传参时记得加上ref关键字,因为SmoothDamp的内部会更新这个值并且传递出来,其次,这个传入的参数的生命周期需要比SmoothDamp长,因为SmoothDamp内部会根据上一次计算得到的速度,去更新下一次的位置,简单的方法就是把这个传入的参数设为全局变量

//smoothTime:平滑的时间,但是经过我的实测这个时间并不准确有点小坑,希望有大神可以解答一下这个问题。

//maxSpeed:作用物体的最大速度。

public static float SmoothDamp(float current, float target, ref float currentVelocity, float smoothTime, float maxSpeed);

使用方法与Lerp的第二种使用方法类似,在Update中去调用就可以了,不过需要注意需要将当前值传入current,而不应该传进一个恒定的值。

还是放在update中执行,这样就平滑了



unity中差值函数的评论 (共 条)

分享到微博请遵守国家法律