如何检测两个圆之间的碰撞点,然后创建一个矢量来更新圆的位置?

2024-05-19 02:25:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用CodeSkulptor(python2)编写一个简单的空气曲棍球风格的游戏。3圈,基本上是两个桨和一个球。我知道如何检测圆之间的碰撞,但我发现很难精确地模拟出圆如何从用户控制的圆上反弹。用户控制的圆圈(桨叶)倾向于消耗球,球会卡住。我认为我的球从墙上反弹的代码和我为划桨碰撞编写的代码几乎相同。在

我读了一些其他的文章,我发现我需要得到碰撞点,然后以某种方式把它转换成一个向量来更新球的位置。有人能帮我吗?另外,桨叶是由用户控制的这一事实是否会使事情变得复杂?我猜对球的影响也要考虑到球拍的矢量?在

谢谢你的回复,请尽量简化数学。在

克里斯


Tags: 代码用户游戏风格方式文章曲棍球向量
1条回答
网友
1楼 · 发布于 2024-05-19 02:25:36

解决方案1

适合我和任意形状的算法是

  1. 移动圆圈
  2. 测试是否重叠
  3. 如果重叠:向后移动
  4. 让它改变方向。在

这样你就不会被卡住,如果另一部分同时不动。因为向后移动后,你不会重叠,也不会触发反弹和改变方向两次。在

解决方案2

只使用矢量和圆:

circle1x, circle1y, circle1radius, circle2x, circle2y, circle2radius

if (circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2 < (circle1radius + circle2radius) ** 2: 
    # they overlap using http://en.wikipedia.org/wiki/Pythagorean_theorem
    # compute new direction

改变方向

计算新的方向可以忽略两个圆的速度,但这看起来不太自然。在

^{pr2}$

但是你可以使用这个新方向和旧方向来创建一个看起来更自然的新方向。我没有测试这个,但它应该看起来像这样:

组合方向=旧方向+2*(旧方向dot-product新方向)*新方向

点积给出了投影到某个向量上的方向。在

同样,一旦你得到了这个,你就可以考虑到圆有多重而产生弹性碰撞:http://en.wikipedia.org/wiki/Collision

相关问题 更多 >

    热门问题