【问题标题】:Gravity not working correctly重力无法正常工作
【发布时间】:2018-07-28 23:56:04
【问题描述】:

我的游戏中的物理代码是这样的:

    -- dt = time after each update
    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是球心的位置。

【问题讨论】:

  • 删除此行:self.y = other.y - self.r 反弹时不应有任何垂直位移。
  • 我试过了,问题没有得到解决
  • the height of the ball after each bounce keeps getting higher - 高多少?
  • 顺便说一句,在addVector(self.speed,self.angle,g,math.pi) 行中使用g*dt 而不是g 会更正确(据我从物理课中了解到的速度增量= g*dt)
  • ~20% 是我的估计

标签: lua game-physics


【解决方案1】:

您的 Y 轴向下增加并向上减少。
使self.y = math.floor(..) 使您的球每帧向上移动一点。
解决方案是以最高精度存储您的坐标。
您可以创建新变量 y_for_drawing = math.floor(y) 以使用整数坐标在像素处绘制球,但您的主要 y 值必须包含小数部分。

【讨论】:

  • @Sid 虽然这可能会解决问题,但它似乎是一种解决方法,而不是问题的核心。这种简单的物理应该需要关注最大精度。它是一个弹跳球!再次,如我的回答中所述,重写代码,明确区分位置、速度和加速度。对精度的担忧是三角和地板混搭的不幸副产物。
【解决方案2】:

我已设法让您的代码运行并重现您所看到的行为。我也发现很难弄清楚这个问题。原因如下:运动物理学涉及位置,它受速度矢量的影响,而速度矢量又受加速度矢量的影响。在您的代码中,这些都在那里,但没有明确分开。三角函数和底函数都以某种方式相互作用,因此很难看出它们在最终位置计算中所起的作用。

到目前为止,帮助您实现基本物理石灰的最好和最容易理解的教程是 The Nature of Code(免费在线阅读,带有交互式示例)。作为练习,我将大部分早期练习移植到 Lua 中。我建议你看看他是如何清楚地区分位置、速度和加速度计算的。

作为一个实验,将g 增加到一个更高的数字。当我这样做时,我注意到球最终会落到地面上,但当然球太快了,它并没有以一种看起来很自然的方式弹跳。

另外,定义other.y - 它似乎不会影响弹跳问题,但只是为了弄清楚那是什么。

【讨论】:

  • other.y 是地表
  • 当然,我也这么认为。 ground.y 会更合适。
  • @Sid 请参阅示例 2.4 的交互代码 here示例 2.4,而不是第 2.4 节)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多