LibGDX - BoundingBox和Ray交集

时间:2013-01-16 12:19:02

标签: collision-detection libgdx intersection

LibGDX有Intersector个类,其中包含intersectRayBoundsFast个函数。我想知道如何使用它?首先如何像下面那样限制我的飞机?:

enter image description here

第二个问题是如何正确移动BoundingBox?没有setPositionrotate等功能。 第三个是如何创建正确的Ray对象以找到shell和飞机之间的交叉点?

enter image description here

请帮帮我。

1 个答案:

答案 0 :(得分:0)

通常边界框是粗略测试。为了测试速度,边界框通常是“轴对齐”(缩写为“AABB”),具体而言,这意味着它们不会随对象旋转,而是在包含的对象旋转时调整大小。 (您在问题中包含的图像是飞机精灵的AABB的合理示例。)

边框交叉测试快速运行,因此它们可以消除所有完全不相关的元素,但会留下一组可能被击中的项目。之后,您可以(如果需要,通常不需要)进行更精确的交叉测试。例如,基于底层几何或通过使用基于像素的光线交叉。请注意,像素冲突是complicated in libGDX

对于您的具体情况,我认为您可以将飞机建模为线。想象一下从鼻子到尾巴画一条线,如果炮弹击中那条线,就会击中飞机。你真的不需要精确的基于像素的碰撞检测(这种方法看起来很好)。

假设您的炮弹垂直移动,您只需要计算两个线段的交集:Efficient maths algorithm to calculate intersections

所有这一切,你可能甚至不需要那么精确,可以通过粗略的基于AABB的测试。例如,在底部图像中,虽然外壳实际上并未与平面相交,但它显然是要去的。假设它移动得足够快,玩家将无法分辨。如果你想让游戏稍微变得更宽松或更宽容,你可以通过使边界框稍微缩小(可能留下盒子的尾端)来稍微捏一下它。

另外,不要使用Ray检测交叉点(例如测试触摸点是否与盒子相交)。您应该为shell使用AABB,然后执行rectangle overlap test