旋转矩形碰撞

3

如何高效地判断一个轴对齐矩形是否与一个旋转矩形相撞?每个类都有一个位置向量和大小向量,而旋转类则有一个角度值。


你是在寻找重叠,还是实际上有一个与之相关联的速度? - phkahler
2个回答

5
您想要使用分离轴定理(SAT)来解决问题。通常它用于三维,但在二维中也可以很好地使用。由于您有一个特殊情况,因此您需要考虑的唯一轴是矩形的4个主轴:
[1,0] [0,1] [sin(theta),cos(theta)] [-cos(theta),sin(theta)]
要检查一个轴,请计算每个顶点与该轴的点积。然后检查2组值的最小值和最大值是否重叠。如果任何一个轴给出的范围不重叠,则矩形不重叠(您已经找到了一个分离轴)。如果所有4个轴都显示重叠,则矩形相交。
以下是关于同一问题的最近一个SO问题: Separating Axis Theorem and Python 这是维基百科的文章: http://en.wikipedia.org/wiki/Separating_axis_theorem

3
最有效的方法是创建一个包围旋转矩形的较大矩形,然后基于包围矩形进行碰撞检测。这意味着包围矩形碰撞并不表示“命中”,而是需要进一步调查的条件。根据您可以做出的假设不同,调查的方式也不同。在最简单的情况下,您可以使用AND像素检查真实输出。然后,您可以使用此“确认”的命中来使用更复杂的模型进行分析;考虑到碰撞的角度、速度、几何形状和弹性(或您感兴趣的任何内容)的模型。存在更复杂的模型,但通常更复杂的模型需要更多的计算能力。通过设置一系列快速、快速的检查并仅在它们将产生回报的情况下使用重型计算周期,可以更轻松地节省计算能力。

如果只关注优化而忽略了基本功能(例如,您没有提到测试一个矩形的顶点是否包含在另一个矩形中),那么就是-1。 - finnw
实际上这只是一个“快速检查”,以避免在适用时进行更昂贵的分析(请阅读帖子的后半部分)。因此+1。 - ignis
1
这里没有给出实际的解决方案。 - phkahler
@finnw,因此检查重叠像素实际上并没有检查重叠对象?看起来有人只是匆匆浏览了答案。 - Edwin Buck
不是在3D中,但由于我的3D对象的旋转仅限于Y轴,所以我只需要知道如何找到旋转矩形是否发生碰撞。 - Matt
@Matt,说得好。我想可能是因为我过于沉迷于2D了。 - Edwin Buck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接