代码之家  ›  专栏  ›  技术社区  ›  epochwolf

如何从直线上弹起一个点?

  •  3
  • epochwolf  · 技术社区  · 15 年前

    我正在写一个乒乓球游戏,遇到了一个问题。

    我正在想办法把一个点从直线上弹下来。

    我能想到的最好的方法是

    • 计算球的当前和未来位置。
      • 线段:ball.location,ball.location+ball.direction(ball.location和ball.direction使用自定义矢量/坐标类)
    • 计算生成的线段是否与任何墙或挡板相交。
      • ????还不知道怎么做(将在另一个问题中提问)
    • 在发现的第一个十字路口
      • 把球弹离底线
        • 创建一个三角形
          • A=球的当前位置
          • B=线的交点。
          • C=球在直线上当前位置的最近点。
        • 找到球打到底线的角度
          • 角度=cos(距离(b,c)/距离(a,b))
        • 找到旋转球方向的角度
          • (90角)* 2
        • 旋转球的方向并移动到新的位置
          • 暂时忽略为到达线路而行驶的距离,不需要完全在线路上。
    • 如果没有十字路口
      • 把球移到新的位置。

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

    6 回复  |  直到 12 年前
        1
  •  5
  •   Community omersem    7 年前

    你只需要检查一下球的中心是否在球拍的半径范围内,就可以判断出球是不是该弹起了。问了一个老问题,有几个答案 calculating bounce angle .

        2
  •  2
  •   mtnygard    15 年前

    如果你想要真正的乒乓球感觉,那么计算新的向量比做真实的反射要容易得多。pong只是颠倒dx或dy的符号。如果球碰到水平障碍,则否定dy。vertical,然后否定dx。

        3
  •  1
  •   Sam Axe    15 年前

    在你的游戏循环,计算新的球的位置,好像没有障碍物。
    然后检查新位置是否与产科边缘相交或超过产科边缘。 如果满足任一条件,则通过将新球从障碍物上弹回来计算新球的位置。

    在给定起点、角度和距离的情况下,计算点的方法很有用:

    Public Function TranslatePoint(ByVal tStartPoint As Point, _
    ByVal tAngle as Decimal, ByVal tDistance As Decimal) As Point
    
        4
  •  0
  •   TStamper    15 年前

    以下是我要做的:

    1)假设你的乒乓球边在X=A和X=B线。

    2)将球的位置设为(X0,Y0),在直线上移动ax+by=c。

    3)由此可以很容易地计算(x1,y1)该线相交的点。 墙

    4)知道这一点,就可以得到弹跳后的直线方程。 (X0,Y1+Y0)是反弹后的反射。(球低于 交叉点,因此在交叉点上方为y1+y0。)

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

        5
  •  0
  •   leander    15 年前

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

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

        6
  •  0
  •   MSalters    15 年前

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