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

使用Lerp实现玩家角度随输入变化,目标值为0时无法插值问题

问题排查:玩家旋转Lerp无法回归0度

问题描述

通过x_value(取值1、0、-1)控制玩家旋转25度,左右按压输入时功能正常,但松开输入后,已通过调试确认player.target_angle被设置为0,却无法通过Lerp插值到0,玩家角度停留在之前的数值。

提供的代码

主逻辑代码

-- 检查玩家是否沿X轴移动,若未移动则将角度设为0
if x_value ~= 0 then
  -- 检查目标角度是否已更改
  if player.target_angle ~= 25 * x_value then
    player.target_angle = 25 * x_value
    player.target_angle_changed = true
  end
else
  -- 若玩家未左右移动,则将角度设为0并标记角度已更改
  player.target_angle = 0
  player.target_angle_changed = true
end

-- 检查目标角度是否已更改
if player.target_angle_changed then
  progress = 0
  player.target_angle_changed = false
else
  -- 若目标角度未更改,则通过progress + dt更新进度
  progress = math.min(progress + dt / duration, 1)
end

-- 通过Lerp将旋转应用到玩家
player.angle = lerp(player.angle, player.target_angle, progress)

-- 调试查看进度
value = "Target_Value: " .. player.target_angle .. " Player_Angle" .. player.angle

Lerp函数

function lerp(a, b, t)
  return a + (b - a) * t
end

问题原因

核心问题在于松开按键后每帧都会强制重置progress为0:
当x_value=0时,原代码会无条件执行player.target_angle = 0并设置player.target_angle_changed = true。即便player.target_angle已经是0,每帧都会重复标记角度已更改,导致后续逻辑中progress被持续重置为0,无法累加进度值。而Lerp的t参数为0时,player.angle = lerp(当前角度, 0, 0),结果就是角度完全不变。

解决方案

修改x_value=0分支的逻辑,仅当player.target_angle不等于0时,才更新目标角度并标记更改,避免每帧重复触发进度重置:

-- 检查玩家是否沿X轴移动,若未移动则将角度设为0
if x_value ~= 0 then
  -- 检查目标角度是否已更改
  if player.target_angle ~= 25 * x_value then
    player.target_angle = 25 * x_value
    player.target_angle_changed = true
  end
else
  -- 仅当当前目标角度不是0时,才更新并标记更改
  if player.target_angle ~= 0 then
    player.target_angle = 0
    player.target_angle_changed = true
  end
end

这样,当x_value=0且player.target_angle已经是0时,不会触发player.target_angle_changed = true,progress就能正常通过dt累加,Lerp会逐步将玩家角度插值到0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:52:33