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没有提供对它的真正支持。如果你看一下硬件,你会注意到有类似于显卡的独立物理卡,尽管最近的趋势是将它们集成在一起我忘了提到我在用OpenGL用C++做这件事。你忘了从一个侧壁跳出或跳出界外。这是同样的计算。如果球到达障碍物的半径范围内,其方向应改变。只要看看它是否超出某个X坐标,就知道它是否超出了边界。你说的“在它的半径内”是什么意思。我拒绝了“靠近时反弹”方法,因为球可能在一步中移动超过“靠近”值。(有一个命令可以将球加速或冻结x步)如果球在一步中可能移动超过“接近度”值,那么您的更新速度太慢。我将考虑使用这种方法。我会告诉你它的工作情况:)这会让事情变得更容易。我想做一个更灵活的模型,但我并没有做任何花哨的事情。我可能会选择这个。如果可以的话,我也会把这个标记为已接受。我实现了这一点,而不是使用一个通用的公式,它节省了我足够的时间来实现一些闪亮的照明,这可能比我试图做的任何事情都更有助于我的成绩。