You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算Lerp的速度?Vector2插值后匀速延续运动实现

Lerp速度计算与无限匀速延伸的实现方法

核心:先拆解你当前使用的Lerp的本质

你当前的调用写法,因为两个插值端点是固定的(spawnPos、target全程不变),且position是线性增长的播放头,本质上是纯匀速直线运动,根本没有缓动效果。内置Vector2.Lerp的底层计算逻辑是固定线性插值公式:

currentPos = startPos + (endPos - startPos) * t

对应到你的代码里,展开就是:

currentPos = spawnPos + (target - spawnPos) * position

速度的正确计算方式

速度是位移对时间的变化率,因为你的position是随时间线性推进的固定播放头,我们先定义一个常量:positionRate,代表你每秒会让position变量增加多少值——比如你代码里每帧写position += Time.deltaTime * 0.2,那这个rate就是0.2,从position=0走到position=1总共需要5秒。
代入上面的位置公式,对时间求导就能得到全程恒定的速度向量:

moveSpeed = (target - spawnPos) * positionRate

这就是你之前算不对速度的核心原因:你之前只算了方向和两点间的总距离,完全漏掉了播放头的推进速率positionRate。你之前尝试构造的“方向向量乘两点距离”,本质上只是spawn到target的总位移向量,差了时间维度的缩放,自然和实际插值的速度对不上。

实现“过target后同速无限移动”的两种正确写法

很多人不知道内置Vector2.Lerp的默认钳制逻辑:当传入的t>1或者t<0时,方法会直接返回端点值,不会继续计算插值结果,所以物体到了target就会直接停住,根本不会往前走。
基于这个特性,有两种无跳变的实现方案:

写法1:去掉钳制,直接用展开的公式

既然你的播放头position是从0开始持续无限增长的,完全不需要依赖内置Lerp的钳制逻辑,直接把原来的Lerp调用替换成手动展开的线性公式就行:

// 把原来的 Vector2.Lerp(spawnPos, target, position) 替换成
currentPos = spawnPos + (target - spawnPos) * position;

这个公式的特性是全程连续无跳变:

  • 当position在0~1区间时,和你原来的Lerp效果完全一致
  • 当position>1时,会自动沿着原spawn到target的方向、以计算出的固定速度无限移动,根本不需要额外加判断

写法2:分阶段兼容内置Lerp逻辑

如果你不想改动原来的插值代码,可以按播放头的进度分两阶段处理:

  • 提前算好固定速度向量moveSpeed = (target - spawnPos) * positionRate
  • 当position < 1时,正常调用Vector2.Lerp(spawnPos, target, position)更新位置
  • 当position >=1时,直接用算出的恒定速度更新位置:currentPos += moveSpeed * Time.deltaTime
    这种写法和展开公式的运动效果完全一致,没有任何速度跳变。

实际数值校验示例

举个具体场景方便你套代码:

  • 出生点spawnPos是(0,0),原目标target是(10,0)
  • 播放头position每秒推进0.2(即positionRate=0.2),走完全程需要5秒
    计算可得:
  • 插值段总距离是10单位,走5秒,实际速度就是10/5=2单位/秒
  • 速度向量是(2, 0)
  • 插值阶段从0到1的过程中,位置会从(0,0)匀速走到(10,0),过了target之后会继续以2单位/秒的速度沿x轴正方向无限移动,全程没有速度变化。

内容的提问来源于stack exchange,提问作者hyperbeecore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 09:36:08