我正在用CodeSkulptor (python 2)编写一个简单的空气曲棍球风格的游戏。3圈,基本上是两个桨和一个球。我知道如何检测圆圈之间的碰撞,但我发现很难准确地模拟这个圆圈如何从用户控制的圆圈中反弹。用户控制的圆圈(桨)倾向于消耗球和球被卡住。我认为我的代码弹出墙的球和我写的关于桨碰撞的代码是一样的。
我阅读了一些其他帖子,我发现我需要得到碰撞点,然后以某种方式将其转化为一个向量,以更新球的位置。有人能帮我吗?另外,桨是由用户控制的这一事实是否使事情复杂化了?我猜对球的影响也要考虑到桨的矢量吗?
谢谢你的回答,请尽量保持数学的简单。
克里斯
发布于 2014-02-05 21:32:11
解决方案1
对我和任意形状都适用的算法是
这样,如果另一部分没有在同一时间内移动,你就不应该被卡住。因为通过向后移动,你不会在事后重叠,不会触发反弹和改变方向两次。
解决方案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变换方向
计算新方向可以忽略两个圆圈的速度,但这看起来不太自然。
old_direction1 = (v1x, v1y)
velocity1 = (v1x ** 2 + v1y ** 2 ) ** 0.5
old_direction2 = (v2x, v2y)
distance = ((circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2) ** 0.5
new_direction1 = ((circle1x - circle2x) / distance * velocity1,
(circle1y - circle2y) / distance * velocity1)
new_direction2 = ((circle2x - circle1x), ...)但是你可以用这个新的方向和旧的方向来创造一个看起来更自然的新方向。我没有对此进行测试,但应该是这样的:
combined_direction = old_direction +2* (old_direction 点积 new_direction) * new_direction
点积给你投射到某个向量上的方向有一个读。
而且,一旦你得到了这个,你就可以创建弹性碰撞,考虑到圆圈有多重:http://en.wikipedia.org/wiki/Collision
https://stackoverflow.com/questions/21587973
复制相似问题