【问题标题】:Pong physics problem乒乓物理题
【发布时间】:2011-07-28 09:57:13
【问题描述】:

我有问题,但我不知道如何描述,所以我画了。

如您所见,当检测到碰撞时球会反弹。没关系 - 我只是这样画的。 但有时球会穿过桨叶而离开。

为什么会这样?因为当我检测到碰撞时,我将 vx 更改为 -vx。在这种情况下我该怎么办?也改变 y ?但是如何检查桨球击中了哪一侧呢?

也许还有其他想法?

【问题讨论】:

    标签: c++ math physics sfml


    【解决方案1】:

    我在打乒乓球时发现的一个解决方案是,当检测到与左桨碰撞时使用 vx = abs(vx),当检测到与右桨碰撞时使用 vx = -abs(vx)。这确保了球只反弹一次,消除了由多次反弹引起的球拍内的行程。

    【讨论】:

      【解决方案2】:

      对于编写 pong 克隆的人来说,这是一个很常见的问题。解决方案是,在检测到碰撞时,不仅要反转速度,还要改变球的位置,使其不与桨相交。

      否则球可能会卡在桨内,每帧不断否定 vx = -vx = vx = -vx。它不会离开桨,直到它的 y 动量将它向上或向下移动到足以逃脱为止。

      【讨论】:

      • 你能给我解释一下吗? :>
      • 检测到碰撞时需要设置小球的x位置;改变速度是不够的。球的最左侧像素应出现在球拍最右侧位置的右侧。
      • 基本上,当您检测到碰撞时,球可能与桨相切,或者实际上与桨相交。所以你的第一步必须不仅仅是反转速度,而是沿着新的向量轻推球,直到它不与桨相交。您需要在控制返回到常规球运动循环之前的“原子”步骤中执行此操作。
      【解决方案3】:

      很多事情都可能导致问题。

      值得注意的是,如果球在每个“滴答”或“帧”中可以移动超过一个像素,则在检测到碰撞时它可能与球拍相交更多像素。

      然后,您可以通过改变球的速度将球从球拍上反向反弹,但根据新的角度,球可能需要几帧才能完全离开球拍。因此,在下一个滴答声中,它仍然相交,而您正在反转速度再次。这种奇怪的情况很可能会导致球最终离开桨在另一侧,看起来是直接飞过。

      当第一次检测到交叉路口时,您可能希望在该桨-球组合上放置一个“暂时不要碰撞”的标志。

      作为一个相关问题,如果球跑得足够快(特别是当它的x-分量最高时,例如当球几乎完全水平行进时,那么它可以得到的桨最少通过),实际上可能没有球与球拍物理相交的帧。

      这一切都取决于您的代码,我们看不到。不过,希望以上内容能给您一些想法。

      【讨论】:

      • 那个“暂时不要碰撞”标志可以作为一个简单的状态机来处理。当检测到碰撞时,如果处于正常状态,则应用反弹并转换到“碰撞”状态。在碰撞状态下,不要应用任何弹跳 - 只需保持碰撞状态,直到不再检测到碰撞,然后转换回正常状态。效果 - 反弹只能在至少一帧非碰撞后重复。
      • @Steve314:+1 是的,这就是我的处理方式。
      • 理论上球不可能连续两次击中同一个桨/墙,对吧?因此,如果您保存它命中的最后一个对象,则可以忽略对同一对象的后续命中。
      • @André:这是另一个好方法,与史蒂夫的方法相差不远。
      • 对我的方法的一个批评 - 它可能会被两个连续帧中的两个单独对象的碰撞混淆 - 例如蝙蝠然后是顶/底墙。要处理这个需要更复杂的状态。一种可能性正是安德烈所描述的。
      【解决方案4】:

      这通常是由于球的移动过快造成的。其中一帧它正在移动到墙上,而下一帧它已经放置在墙后。只是没有发生碰撞。您可以通过进一步观察球的轨迹并检查障碍物来消除这种情况。

      【讨论】:

        【解决方案5】:

        您的精彩绘图向我表明您没有检测到垂直碰撞。您应该对 x 坐标执行与 y 坐标相同的操作。

        【讨论】:

        • 事实上,我愿意。当检测到碰撞时,我将速度设置为 0,并且在两种情况下都从绘图中停止。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多