球和不可移动对象(墙)之间的2D碰撞(弹性碰撞?)



所以我在做一个简单的台球游戏(没有球对球的碰撞,只有球对墙(,我有点挣扎(尤其是用一个实际的球(直径>0((。(在我弄清楚逻辑和物理之后,我将在c++代码上制作它(

所以基本上我有一个坐标系,有台球桌的四条边,球的坐标,击球的方向和击球的力量。

到目前为止,我已经半想出了两种方法来计算当球与墙碰撞时球的末端位置,球的直径为0

  1. 一种结合矢量和直线的5公式算法,可以计算出球与墙碰撞时行进的结果线的公式。这里的问题是,当我得到这条线后,我不知道如何找到球在这条线上(坐标(的确切终点位置。(我用一条垂直于墙的线来计算它反弹的角度,然后用一些公式和这个角度的sin((cos((,我找到了这条线的ax+b=y公式的a和b。更准确地说,我找到了一个由两个方程组组成的垂直线公式,然后是两个向量之间角度的cos((,然后是同一角度的sin((,在相同的公式中再次使用它,但为了找到另一个坐标,我颠倒了方向,然后用我的两个点画了一条线(
  2. 我基本上找到了它会撞到墙上的地方,因为击球的力量和方向给定了,我只会有8种情况,球会撞到四面墙上的每一面,然后检查我在哪种情况下,只要反转我需要的x和y。问题是,如果球的直径>0(所以这是一个实际的球,而不仅仅是一个点(球将与墙碰撞,不是在球的中心,而是在球的侧面,我不知道如何准确地找到球与墙碰撞的位置,也不知道这将如何改变它将要行进的线/碰撞的角度和终点位置。(这个方法可能有效,但它真的很难实现,因为有8种情况要检查哪堵墙和它将在哪个方向撞到它,还要计算边的线的公式,检查它将准确地撞到哪里,还有很多其他东西(编辑:这会有点不同,因为我正在改变原始逻辑中的一些东西

示例(我已经在代码上制作了这一部分(:

球在(10,10(。命中方向为(20,20(,威力为1。输出:端球位置=(20,20(

球在(10,10(。命中方向为(20,20(,威力为2。输出:端球位置=(30,30(

墙被击中的例子(在这种情况下,比赛场地是(0,0(;(320,0(;(320160(;(0160(:

球(30060(,命中(25030(,威力3直径0:输出(150,30((击中墙壁(200,0((

同样的情况,但直径10:输出(150,40((击中墙壁(208.3333333,5((

我不需要找到球撞到墙上的地方,只需要找到球在被击中后的终点(一次击中可能会发生多次撞墙(。

更多信息(比赛场地总是1:2;并不总是平行于x和y轴;球可以有任何直径;力量范围从1-10;打角球是另一种情况,不包括在这个问题中;摩擦被忽略,我只需要把球移动到指定的位置,并不意味着它会永远移动(

TL;DR需要找到球与墙壁碰撞后的坐标。

感谢您的帮助!提前感谢!

从一个点状球到一个直径的球非常简单。

(我不容易准备图像,所以我必须依靠你的想象力。(

你已经尝试过一个像点一样的球从墙上弹下来。例如,如果墙在x=W处;球;从x<W侧,在x速度为正的情况下,它将在x=W处反弹,并呈现负的x速度。

现在考虑半径为r的球再次从x<具有正x速度的W侧。当球的中心在x=W-r时,就会发生碰撞。请注意,球的中心点会移动,就好像它是一个像球一样的点在x=W-r处撞墙一样。

因此,要得到半径为r的球的运动,只需将墙移动距离为r,就可以计算出点状球的运动。当你有了它,画一个半径为r的球,以移动点为中心。

最新更新