所以我正在做一个简单的台球游戏(没有球对球的碰撞,只有球对墙),我有点挣扎(尤其是一个实际的球(直径>0))。(在我弄清楚逻辑和物理之后,我将在 C++ 代码上实现它)
所以基本上我有一个坐标系,有台球桌的 4 个边缘、球坐标、击球方向和击球力量。
到目前为止,我已经半算出两种方法来计算球在与直径为 0 的球与墙壁碰撞时的最终位置:
- 一种 5 公式算法,结合矢量和线条,计算出球与墙壁碰撞时将沿其行进的结果线的公式。这里的问题是,在我得到这条线之后,我不知道如何在这条线上(坐标)找到球的确切结束位置。(我使用垂直于墙壁的线来计算它会反弹的结果角度,然后使用该角度的一些公式和 sin() cos() 我找到 a 和 b 用于线的 ax+b = y 公式. 更准确地说,我找到了具有 2 个方程组的垂线公式,然后是 2 个向量之间角度的 cos(),然后是相同角度的 sin(),以便在相同的公式中再次使用它,但为了找到相反的结果另一个坐标,然后使用我拥有的两个点画一条线)
- 我基本上找到了它会撞到墙上的位置,因为给定了击球的力量和方向,所以我只有 8 个案例,球会撞到四个墙壁中的每一个,然后检查我在哪个案例中,然后反转任何 x 和我需要。这样做的问题是,如果球的直径 > 0(所以它是一个实际的球,而不仅仅是一个点),那么球将不会在球的中心而是在球的侧面与墙壁发生碰撞,而我没有想法如何准确地找到球将与墙壁碰撞的位置,以及这将如何改变它将行进的线/碰撞的角度和结束位置。(这种方法可能会奏效,但很难实现,编辑:这会有所不同,因为我正在更改原始逻辑中的一些内容。
示例(我已经在代码上做了这部分):
球在 (10, 10)。击中的方向为 (20,20),功率为 1。输出:End Ball Pos = (20, 20)
球在 (10, 10)。击中的方向为 (20,20),功率为 2。输出:End Ball Pos = (30, 30)
墙壁被击中的示例(在这种情况下,比赛场地是(0,0);(320,0);(320,160);(0,160):
Ball(300, 60), hit(250, 30), power 3 直径 0: 输出(150,30) (撞墙(200, 0))
相同的情况,但直径为 10:输出(150、40)(撞墙(208.3333333、5))
我不需要只在击球后球将要结束的地方找到它撞墙的位置(一次击球可能会发生多次墙碰撞)。
更多信息(比赛场地总是 1:2;并不总是平行于 x 和 y 轴;球可以有任何直径;功率范围为 1 - 10;击球角是另一种情况,不包括在这个问题中;摩擦被忽略而II只需将球移动到指定位置,并不意味着它会永远移动)
TL;DR 需要在与墙壁碰撞后找到球的坐标。
任何帮助表示赞赏!提前致谢!