我要开发一个二维球游戏,其中两个球(圆)碰撞。现在,我遇到了确定碰撞点的问题(实际上是确定它们是否在x轴/ y轴上碰撞)。我有一个想法,当2个球的y坐标之间的差大于x坐标差时,它们将在y轴上碰撞,否则,它们将在x轴上碰撞。我的想法正确吗?我在游戏中实现了这个东西。通常,它运作良好,但有时会失败。谁能告诉我我的想法是否正确?如果不是,那为什么呢,还有更好的方法吗?
x轴上的碰撞是指圆的第1、4、5或8个八分圆,y轴是指圆的第2、3、6、7号圆。
提前致谢!
圆圈之间的碰撞很容易。想象有两个圈子:
想象一下,在这两个中心点之间有一条直线。根据定义,从中心点到每个圆的边缘的距离等于它们各自的半径。所以:
因此,您可以在以下情况下检测碰撞:
(x2-x1)^2 + (y1-y2)^2 <= (r1+r2)^2
表示中心点之间的距离小于半径的总和。
可以将相同原理应用于检测三维球体之间的碰撞。
编辑: 如果要计算碰撞点,则可以使用一些基本的三角函数来实现。你有一个三角形:
(x1,y1) |\ | \ | \ sqrt((x2-x1)^2 + (y2-y1)^2) = r1+r2 |y2-y1| | \ | \ | X \ (x1,y2) +------+ (x2,y2) |x2-x1|
表达式|x2-x1|和|y2-y1|是绝对值。因此对于角度X:
|x2-x1|
|y2-y1|
|y2 - y1| sin X = ------- r1 + r2 |x2 - x1| cos X = ------- r1 + r2 |y2 - y1| tan X = ------- |x2 - x1|
一旦有了角度,就可以通过将它们应用于新三角形来计算相交点:
+ |\ | \ b | \ r2 | \ | X \ +-----+ a
哪里:
a cos X = -- r2
所以
a = r2 cos X
根据以前的公式:
|x2 - x1| a = r2 ------- r1 + r2
一旦有了a和b,就可以根据(x2,y2)偏移(a,b)的方式计算碰撞点。您甚至不需要为此计算任何正弦,余弦或反正弦或余弦。或与此相关的任何平方根。这样很快。
但是,如果您不需要精确的碰撞角度或碰撞点,而只想八分圆,您可以通过了解切线的一些知识来进一步优化它,即:
这四个度范围对应于圆的四个八分圆。其他四个偏移180度。如上所示,正切可以简单地计算为:
|y2 - y1| tan X = ------- |x2 - x1|
丢失绝对值,该比率将告诉您碰撞在四个八分之一中(通过上述切线范围)。要计算出确切的八分圆,只需比较x1和x2以确定哪个是最左边的。
另一个碰撞上的碰撞的八分圆是偏移的(C1上的八分圆1表示C2、2和6、3和7、4和8等上的八分圆)。