0

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

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

到目前为止,我已经半算出两种方法来计算球在与直径为 0 的球与墙壁碰撞时的最终位置:

  1. 一种 5 公式算法,结合矢量和线条,计算出球与墙壁碰撞时将沿其行进的结果线的公式。这里的问题是,在我得到这条线之后,我不知道如何在这条线上(坐标)找到球的确切结束位置。(我使用垂直于墙壁的线来计算它会反弹的结果角度,然后使用该角度的一些公式和 sin() cos() 我找到 a 和 b 用于线的 ax+b = y 公式. 更准确地说,我找到了具有 2 个方程组的垂线公式,然后是 2 个向量之间角度的 cos(),然后是相同角度的 sin(),以便在相同的公式中再次使用它,但为了找到相反的结果另一个坐标,然后使用我拥有的两个点画一条线)
  2. 我基本上找到了它会撞到墙上的位置,因为给定了击球的力量和方向,所以我只有 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 需要在与墙壁碰撞后找到球的坐标。

任何帮助表示赞赏!提前致谢!

4

1 回答 1

0

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

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

你已经尝试过一个点状的球从墙上弹起。例如,如果墙在 x=W 处,并且“球”从 x<W 侧接近,x 速度为正,它将在 x=W 处反弹并呈现负 x 速度。

现在考虑一个半径为 r 的球接近同一壁,再次从 x<W 侧以正 x 速度。当球的中心在 x=Wr 时会发生碰撞。请注意,球的中心点将完全移动,就好像它是一个点状球在 x=Wr 处撞击墙壁。

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

于 2021-12-15T00:57:14.283 回答