【问题标题】:How do I bounce a point off of a line?如何从一条线上反弹一个点?
【发布时间】:2009-05-13 23:59:43
【问题描述】:

我正在编写一个 Pong 游戏,但遇到了一个问题。

我试图弄清楚如何从一条线上反弹一个点。

我能想到的最好的方法是

  • 计算球的当前和未来位置。
    • 线段:{Ball.location, Ball.location + Ball.direction}(Ball.location 和 Ball.direction 使用自定义矢量/坐标类)
  • 计算生成的线段是否与任何墙壁或桨相交。
    • ???还不知道该怎么做(将在单独的问题中提问)
  • 在找到的第一个路口
    • 将球弹离底线
      • 创建一个三角形
        • a = 球的当前位置
        • b = 线的交点。
        • c = 离球在线上当前位置最近的点。
      • 求球击中线的角度
        • 角度 = cos(距离(b, c) / 距离(a, b))
      • 找到旋转球方向的角度
        • (90 - 角度)*2
      • 旋转球的方向并将其移动到新位置
        • 暂时忽略到达线路的距离,不需要完全在线路上
  • 如果没有交集,则为 else
    • 将球移动到新位置。

这是一种可接受的方法还是我遗漏了什么?

【问题讨论】:

    标签: c++ graphics physics


    【解决方案1】:

    您只需要检查球的中心是否在球拍的半径范围内,就可以判断是否该反弹了。在calculating bounce angle 上有一个较早的问题有几个答案。

    【讨论】:

    • 您忘记了从一侧墙壁反弹或超出范围。
    • 同样的计算。如果球进入障碍物的半径范围内,它的方向应该改变。只需检查它是否超出某个 X 坐标即可判断它是否超出范围。
    • “在它的范围内”是什么意思。我拒绝了近距离方法的反弹,因为球有可能一步超过接近值。 (有命令可以加速或冻结球x步)
    • 如果球有可能一步超过接近值,那么你的更新速度太慢了。
    • 那我看看做这个方法。我会回复你它的效果:)
    【解决方案2】:

    如果您想要真实的 Pong 感觉,那么计算新向量比进行真实反射要容易得多。 Pong 只是反转 dx 或 dy 的符号。如果球击中水平障碍,则否定 dy。垂直,然后对 dx 求反。

    【讨论】:

    • 这会让事情变得容易很多。我试图制作一个更灵活的模型,但我并没有真正做任何花哨的事情。我可能会这样做。
    • 如果可以的话,我也会将此标记为已接受。我实现了这一点,而不是使用通用公式,这为我节省了足够的时间来实现一些闪亮的照明,这可能比我尝试做的任何其他事情都更能帮助我的成绩。
    【解决方案3】:

    在您的游戏循环中,计算新球的位置,就像没有统计信息一样。
    然后检查新位置是否与骨缘相交或过去。 如果满足任一条件,则通过将其从 obstical 弹回来计算新的球位置。

    在给定起点、角度和距离的情况下计算点的方法会派上用场:

    Public Function TranslatePoint(ByVal tStartPoint As Point, _
    ByVal tAngle as Decimal, ByVal tDistance As Decimal) As Point
    

    【讨论】:

    • 我忘了说我是用 C++ 和 OpenGL 做的。
    【解决方案4】:

    我会这样做:

    1) 假设你的乒乓边在 x=a 和 x=b 线上

    2) 让你的小球位置为 (x0, y0) 并在 Ax+By=C 线上行进

    3) 由此您可以轻松计算 (x1, y1) 该线相交的点 墙

    4) 你可以知道反弹后的直线方程 (x0, y1+y0) 是反弹后的反射。 (球在 y1-y0 以下 交点,因此将在交点上方 y1+y0。)

    5) 给定 2 个方程,您可以绘制点(假设您知道速度)。

    【讨论】:

      【解决方案5】:

      您可能对N Tutorials 感兴趣,它讨论了游戏“N”中使用的碰撞检测和响应(包括反弹和摩擦)。

      这些教程可能比您特别需要的更深入,但它们写得很好并且有交互式示例——简单的反弹是第一个主题。

      【讨论】:

        【解决方案6】:

        弹跳是物理领域的问题,而不是图形领域的问题。因此 OpenGL 并没有为它提供真正的支持。如果您查看硬件,您会注意到已经有类似于视频卡的单独物理卡,尽管最近的趋势是集成它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-03
          • 1970-01-01
          • 1970-01-01
          • 2020-10-31
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          • 2023-01-13
          相关资源
          最近更新 更多