如何从线上反弹一点?

时间:2009-05-13 23:59:43

标签: c++ graphics physics

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

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

我能想出的最好的方法是

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

这是一种可以接受的方法,还是我错过了什么?

6 个答案:

答案 0 :(得分:5)

你只需要检查球的中心是否在桨的半径范围内,以判断它是否有反弹的时间。有一个较老的问题在calculating bounce angle上有几个答案。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

在你的游戏循环中,计算新的球位置,好像没有任何障碍物一样 然后检查新位置是否与障碍物相交或是否过去。 如果满足任一条件,则通过将其从障碍物中弹出来计算新的球位置。

计算给定起点,角度和距离的点的方法会派上用场:

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

答案 3 :(得分:0)

以下是我要做的事情:

  

1)假设您的乒乓边位于x = a和x = b

的线上      

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

     

3)从中你可以很容易地计算出该线相交的点(x1,y1)          墙壁

     

4)你可以通过了解它来获得反弹后的线方程          (x0,y1 + y0)是反弹后的反射。 (球的y1-y0低于          交点,因此在交点之上将是y1 + y0。)

     

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

弹跳是物理领域的一个问题,而不是图形领域。因此OpenGL不提供真正的支持。如果你看看硬件,你会发现有类似于视频卡的单独的物理卡,尽管最近的趋势是整合它们。