2011-06-01 217 views
1

我想制作一个游戏,其中角色是可以旋转的矩形棱镜,而地图的其余部分是轴对齐的矩形棱镜。除了角色以外的所有东西都是静态的,所以我想知道如果角色与地图中的任何部分发生碰撞,最好的算法是什么。任何教程/代码/建议将不胜感激:)矩形棱镜碰撞

此外,字符只会在Y轴上旋转,如果有帮助。

+0

你也可以尝试[GameDev.Stackexchange](http://gamedev.stackexchange.com) – 2011-06-01 22:12:20

+0

好的,http://gamedev.stackexchange。com/questions/13025 /矩形棱镜碰撞 – Matt 2011-06-01 22:33:46

回答

0

我相信,以测试这一个方法是检查16例的直线相交处:

http://www.math.niu.edu/~rusin/known-math/95/line_segs

如果你想优化你也可以检查,如果矩形没有重叠,即有机会如果所有的角落都在另一个矩形的右/左/上/下。

编辑:

硒下面的评论。

+0

这里是“线路交点的16种情况”是什么?边缘段相交的失败不能保证棱镜(或矩形)的非交叉。例如,一个对象可能在另一个对象内。 – hardmath 2011-06-02 02:20:09

+0

真的,但除了这种情况,它会覆盖所有其他人。对于最后的情况,你仍然可以使用决定因素,因为他们会告诉你一个点是在一条线上还是另一条线上。因此,如果您已经以旋转方式组织矩形中的所有线条,则可以找出某个点是内部还是外部。那么你甚至不需要检查16个交叉口! – Pedery 2011-06-02 03:38:15

+0

我假设你所指的16个交点意味着一个矩形的四个边和另外四个的交点。然后你可以用三个相互排斥的情况来涵盖所有的可能性:(1)矩形不相交,(2)一个矩形的边与另一个矩形的边相交,(3)一个矩形位于另一个矩形的内部。这似乎不像“分离轴”方法那么高效,但更重要的是,问题是关于棱镜(3D),而不是矩形(2D)。在3D中,需要概括(2)检查面的交点。 – hardmath 2011-06-02 14:45:37

0

在该字符仅围绕其平行于Y轴的轴旋转的特殊情况下,碰撞检测与另一轴对齐矩形棱柱简化为:

  1. 检查字符的Y间隔与另一个棱镜的Y间隔相交。

  2. 检查两个棱镜的相应XZ截面是否相交,这相当于两个旋转矩形之间的碰撞检测问题。

如果对上述两个答案都是肯定的,那么只有棱镜重叠。

在将特定问题减少为重叠间隔和相交(旋转)矩形的问题后,对于这些任务中的每一个都有许多很好的代码资源。第一项任务是相当简单:

重叠的间隔

两个封闭区间[A,B]和[C,d]相交,当且只有c ≤ b和a ≤ d。这里我们还假设区间的符号是一致的,即,一个≤b和c≤d(否则根据需要交换端点以实现它)。

贯旋转矩形

高度额定SO回答这个特定问题是here。我为一个稍微更一般的问题编写的Lua实现Shortest distance between two rectangles包括我提到的on this thread的“提前退出”优化(矩形中的边界圆和顶点)。如果旋转的矩形相交,我的Lua代码返回“false”,否则返回它们之间的距离。对于Java而言,碰撞情况下的返回值为零。