为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复位置插值引起的抖动

如何修复位置插值引起的抖动

阿波罗的战车 2021-11-02 19:34:41
我想在一段时间内插入对象的位置,我正在使用 pygame。当游戏想要将对象移动到一个位置时,它会调用interpolate_position它想要的位置以及插值需要多长时间。update在基本游戏循环中调用。此代码是 GameObject 类的一部分:    def update(self, dt):        if self.is_lerping:            self.update_interpolate(dt)    def update_interpolate(self, dt):        if self.start_lerp - self.total_lerp_time <= 2 * dt:            val = dt / (self.total_lerp_time - self.start_lerp)            val = val if 0 < val < 1 else 1            self.position = self.position.lerp(self.lerp_goal, val)            self.start_lerp += dt        else:            self.position = self.lerp_goal            self.is_lerping = False    def interpolate_position(self, pos, lerp_time):        self.is_lerping = True        self.total_lerp_time = lerp_time        self.start_lerp = 0        self.lerp_goal = Vector2(pos)更新是这样调用的:AVERAGE_DELTA_MILLIS = round(float(1000) / 60, 4)while True:    before_update_and_render = self.clock.get_time()    delta_millis = (update_duration_millis + sleep_duration_millis) / 1000                o.update(delta_millis)  #  Updates the object    update_duration_millis = (self.clock.get_time() - before_update_and_render) * 1000    sleep_duration_millis = max([2, AVERAGE_DELTA_MILLIS - update_duration_millis])    time.sleep(sleep_duration_millis / 1000)  # Sleeps an amount of time so the game will be 60 fps我的代码有时工作正常,但有时当对象应该静止时,它会在某个方向上来回移动一个像素。我的主要猜测是某种舍入误差。我能做些什么来解决这个问题?提前致谢。
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

如果您想限制val在 [0, 1] 范围内,那么我更愿意使用min()and max():


val = max(0, min(val, 1))

self.start_lerp不断增加,直到它“到达” self.total_lerp_time。

所以条件self.start_lerp - self.total_lerp_time <= 2 * dt是错误的。


它一定要是:


if self.total_lerp_time - self.start_lerp > 2 * dt:

    # [...]

或者甚至更好地使用内置函数abs(),它甚至适用于负值:


if abs(self.total_lerp_time - self.start_lerp) > 2 * dt:

    # [...]


查看完整回答
反对 回复 2021-11-02
  • 1 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信