【问题标题】:rectangle colision detection SDL 2.0矩形碰撞检测 SDL 2.0
【发布时间】:2013-12-19 06:39:14
【问题描述】:

我遇到了矩形碰撞问题,这里是算法:

我检测 r1(renctangle 1) 是否高于 r2(rectangle 2):

int BottomA = A.x+A.h;
int TopB = B.x;

if(TopB>BottomA)
{
Gravity();
}

但是彼此重叠,我已经测试过在 2 种情况下重叠(10 或 15 像素,有时更少),在一秒钟内限制 60 次或不受时间限制。重叠部分打破了横向碰撞的密码。

【问题讨论】:

    标签: c++ sdl rectangles


    【解决方案1】:

    首先,碰撞检测与 SDL 无关。 SDL 只显示事物。

    您似乎正在使用轴对齐的框。 Axis-aligned box 的碰撞检测是最简单的条件。您只需在两个轴上检查它们(如果您在 3D 中工作,则为三个轴)。如果任何轴不重叠,则两个框不重叠。

    bool axis_check(int a_min, int a_max, int b_min, int b_max)
    {
        if (a_max<b_min || b_max<a_min) return false;
        else return true;
    }
    
    bool box_collision(int a_x_min, int a_x_max, int a_y_min, int a_y_max,
                       int b_x_min, int b_x_max, int b_y_min, int b_y_max)
    {
        if (axis_check(a_x_min, a_x_max, b_x_min, b_x_max)
         && axis_check(a_y_min, a_y_max, b_y_min, b_y_max))
            return true;
        else
            return false;
    }
    

    如果场景中有这么多物体,可以使用空间细分方法。空间细分的方法有很多,比如递归分割成两个子空间,递归分割成八个子空间,或者分割成网格。

    【讨论】:

    • 另外,如果你只是想要一些现成的东西,你可以使用物理引擎。它们将正确解决触摸物体之间的碰撞、动力学和稳定性。
    • 首先感谢您的回答,但该算法的问题是我需要知道在哪里碰撞矩形,如果在顶部或左侧或右侧或底部发生碰撞,我在想正在使用 box2d,但我必须删除很多代码。
    • @UnDesconocido 你的意思是重叠部分的位置吗?这也很简单:如果两个轴对齐的框重叠,对于每个轴,重叠的部分是从较高的最小值,到较低的最大值。
    • 感谢您的建议,我开始使用 Box2D,将简化此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多