Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从直线上反弹一点?_C++_Graphics_Physics - Fatal编程技术网

C++ 如何从直线上反弹一点?

C++ 如何从直线上反弹一点?,c++,graphics,physics,C++,Graphics,Physics,我正在写一个乒乓球游戏,遇到了一个问题 我在想如何把一点从直线上弹下来 我能想出的最好的方法是 计算球的当前和未来位置。 线段:{Ball.location,Ball.location+Ball.direction}(Ball.location和Ball.direction使用自定义向量/坐标类) 计算生成的线段是否与任何墙或挡板相交。 ???还不知道怎么做(将在另一个问题中提问) 在发现的第一个十字路口 把球弹离底线 创建一个由 a=球的当前位置 b=直线的交点 c=球在直线上

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

我在想如何把一点从直线上弹下来

我能想出的最好的方法是

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

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

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

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

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

你只需要检查球的中心是否在桨的半径范围内,就可以知道它是否该弹起了。有一个较老的问题被问到,有几个答案。

以下是我要做的:

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

2) 让球的位置为(x0,y0)并沿直线Ax+By=C移动

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

4) 知道这一点,你就可以得到反弹后的直线方程 (x0,y1+y0)是反弹后的反射。(钢球位于底部下方y1-y0处 交点,因此在交点上方为y1+y0。)

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


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

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


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

反弹是物理领域的问题,而不是图形领域的问题。因此OpenGL没有提供对它的真正支持。如果你看一下硬件,你会注意到有类似于显卡的独立物理卡,尽管最近的趋势是将它们集成在一起