重力不正确

我的游戏中物理的代码如下:

    -- dt = 每次更新后的时间
    self.x = math.floor(self.x + math.sin(self.angle)*self.speed*dt)
    self.y = math.floor(self.y - math.cos(self.angle)*self.speed*dt)
    -- addVector(speed,angle,speed2,angle2)
    self.speed,self.angle = addVector(self.speed,self.angle,g,math.pi)`

当它碰到地面时,弹起的代码如下:

    self.angle = math.pi - self.angle
    self.y = other.y - self.r`

此处定义了 addVector 函数:

    x = math.sin(angle)*speed + math.sin(angle2)*speed2
    y = math.cos(angle)*speed + math.cos(angle2)*speed2
    v = math.sqrt(x^2 + y^2)
    a = math.pi/2 - math.atan(y,x)
    return v,a

但是当我在模拟中放置一个单独的球体,没有任何阻力或弹性时,每次弹跳后球体的高度都越来越高。任何想法是什么可能导致这个问题?

编辑:self.r 是半径,self.x 和 self.y 是球的中心位置。

点赞
用户1847592
用户1847592

你的 Y 坐标轴向下递增,向上递减。

每一帧都会使你的球向上移动一点,因为你使用了 self.y = math.floor(..)

解决方案是以最大精度存储坐标。

你可以创建一个新变量 y_for_drawing = math.floor(y),用于在整数坐标上绘制球,但是你的主 y 值必须包含小数部分。

2018-07-28 15:51:48
用户4403144
用户4403144

我成功让你的代码运行并重现了你所看到的问题。我也发现很难找出问题所在。原因在于:移动物理涉及到位置,位置受速度向量影响,而速度向量又受加速度向量影响。在你的代码中,这些都存在,但它们没有明确分开。三角函数和地板函数相互作用,使得它们在最终计算位置时所起的作用难以看清。

到目前为止,帮助你实现像这样基础物理最好且最易于理解的教程是[The Nature of Code](https://natureofcode.com/book/)(免费在线阅读,带有交互式示例)。作为一项练习,我将大部分早期练习移植到了Lua。我建议你看看他如何清晰地分开计算位置、速度和加速度。

作为一个实验,将 g 增加到一个更高的数字。当我这样做时,我注意到球最终会落到地面,但是反弹太快了,它反弹的方式似乎不自然。

此外,定义 other.y - 这似乎不会影响弹跳问题,但要确切了解它是什么。

2018-07-28 15:56:04