SDL 中的每像素 2D 圆形碰撞检测

Posted

技术标签:

【中文标题】SDL 中的每像素 2D 圆形碰撞检测【英文标题】:Per Pixel 2D circular collision Detection in SDL 【发布时间】:2010-12-24 16:10:49 【问题描述】:

好吧,直截了当,我在学习 SDL 时使用this 指南,但我在处理每像素碰撞部分时遇到了困难。我对此的实现与指南略有不同,它会导致一些不必要的问题。问题是移动的球直接穿过静止的球(它应该是实心的并且如您所料那样阻挡移动的球)。我知道矩形碰撞框位于正确的位置,因为我已将移动球重新着色为白色(ball.bmp 加载为红色),将静止球重新着色为蓝色,每个球顶部的碰撞框已重新着色。

我的碰撞检测功能如下

bool checkCol(std::vector<SDL_Rect> A,std::vector<SDL_Rect> B)
    int TOP1,           TOP2;
    int BOTTOM1,    BOTTOM2;
    int LEFT1,          LEFT2;
    int RIGHT1,     RIGHT2;
    for (int i = 0; i < A.size(); i++)
        TOP1         =      A[ i ].y;
        BOTTOM1  =      A[ i ].y + A[ i ].h;
        LEFT1        =      A[ i ].x;
        RIGHT1       =      A[ i ].x + A[ i ].w;
        for (int j = 0; j < B.size(); j++)
            TOP2         =      B[ i ].y;
            BOTTOM2  =      B[ i ].y + B[ i ].h;
            LEFT2        =      B[ i ].x;
            RIGHT2       =      B[ i ].x + B[ i ].w;

            if ( RIGHT1 <= LEFT2 ) return false; 
            if ( LEFT1 >= RIGHT2 ) return false; 
            if ( TOP1 >= BOTTOM2 ) return false; 
            if ( BOTTOM1 <= TOP2 ) return false; 
        
    
    return true;

here 是完整的源代码(太大,无法在此处发布)和可执行文件(linux)。

谁能告诉我哪里出错了?

[编辑] 忽略中间的矩形。

【问题讨论】:

您多久检查一次这些球是否有碰撞?我的意思是,可能存在这样一种情况,即在第一帧球尚未 碰撞,而在下一帧它们已经 未碰撞。检查他们的速度和大小,应该有speed * timeStep &lt; ballSize @yurymik 我不确定我是否关注。 【参考方案1】:

看起来算法逻辑不正确。当您有一个条件列表并且想要检查 所有条件 是否为假时,您不应该在发现 one 为假后立即执行return false; .

【讨论】:

并非如此。它检查分离轴:如果你可以在两个矩形之间画一条线而不相交=>它们没有碰撞。

以上是关于SDL 中的每像素 2D 圆形碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

“等一下,我碰!”——常见的2D碰撞检测

碰撞检测 (矩形圆形点旋转矩形框像素)

android 游戏 碰撞检测

OpenGL 2D 圆 - 旋转 AABB 碰撞

使用向量进行简单的 2D 碰撞检测

如何检测贝塞尔曲线和圆形物体之间的碰撞?