gpt4 book ai didi

python - 如何解决位置插值引起的抖动

转载 作者:行者123 更新时间:2023-12-01 08:21:49 28 4
gpt4 key购买 nike

我想在一段时间内插入对象的位置,我正在使用 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

我的代码有时工作正常,但有时当对象应该静止时,它会在某个方向上来回移动一个像素。我的主要猜测是某种舍入误差。我可以做什么来解决这个问题?提前致谢。

最佳答案

如果要夹val到范围 [0, 1],那么我更愿意使用 min() 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:
# [...]

关于python - 如何解决位置插值引起的抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54598135/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com