【问题标题】:C++ 2D polygon Collision DetectionC++ 2D 多边形碰撞检测
【发布时间】:2013-03-09 16:05:31
【问题描述】:

我正在尝试使用图形包构建的两个矩形来实现 2D 碰撞检测。 不幸的是,我开始认为我不理解编写处理此问题的函数所需的逻辑。

下面是我绘制一个小精灵和几个其他矩形的代码。我的精灵随着键盘输入移动。

我用过几本书,也尝试过 Nehe 等网站,虽然它们是非常好的教程,但它们似乎只直接处理 3D 碰撞。​​

有人可以向我展示一种使用上面的矩形实现碰撞检测的有效方法吗?我知道您需要比较每个对象的坐标。我只是不确定如何跟踪对象的位置,检查碰撞并在碰撞时停止移动。

我正在自学,现在似乎已经停止了好几天。我完全没有想法,搜索的谷歌页面比我想记住的要多。对不起我的天真。

如果有任何建设性的 cmets 和示例代码,我将不胜感激。谢谢。

    void drawSprite (RECT rect){
    glBegin(GL_QUADS);
        glColor3f(0.2f, 0.2f, 0.2f);
            glVertex3f(rect.x, rect.y, 0.0);
        glColor3f(1.0f, 1.0f, 1.0f);
            glVertex3f(rect.x, rect.y+rect.h, 0.0);
        glColor3f(0.2f, 0.2f, 0.2f);
            glVertex3f(rect.x+rect.w, rect.y+rect.h, 0.0);
        glColor3f(1.0f, 1.0f, 1.0f);
            glVertex3f(rect.x+rect.w, rect.y, 0.0);
    glEnd();
}

void drawPlatform (RECT rect){
    glBegin(GL_QUADS);
        glColor3f(0.2f,0.2f,0.0f);
            glVertex3f(rect.x, rect.y, 0.0);
        glColor3f(1.0f,1.0f,0.0f);
            glVertex3f(rect.x, rect.y+rect.h, 0.0);
        glColor3f(0.2f, 0.2f, 0.0f);
            glVertex3f(rect.x+rect.w, rect.y+rect.h, 0.0);
        glColor3f(1.0f, 1.0f, 0.0f);
            glVertex3f(rect.x+rect.w, rect.y, 0.0);
    glEnd();
}

【问题讨论】:

  • 在网上搜索“2D 碰撞检测”会找到很多教程。你能描述一下为什么这些对你不起作用吗?
  • 我猜是因为我不懂他们。可能是我读的太多,让自己感到困惑。我认为我哪里出错了,我不是 100% 确定如何跟踪精灵的当前位置,因此我认为我总是在比较精灵原点 x/y,当然,它总是会返回为 false碰撞...
  • 您可能希望将您的问题细化为您正在尝试的特定“第一步”。跟踪位置,也许。如果教程只是让您感到困惑,那么要求另一个教程可能无济于事。
  • 感谢您的耐心等待。那是个很好的观点。我现在已经编写了一个根据下面的评论测试碰撞的函数,但是当我的精灵与另一个矩形碰撞时,它会在原始 x/y 坐标处重绘我的精灵。因此回到“跟踪”困境。

标签: c++ collision-detection


【解决方案1】:

您可以在绘制之前将此碰撞函数与 AABB 结构(AABB 代表对齐轴边界框)一起使用。

AABB.c

AABB* box_new(float x, float y, float w, float h, int solid)
{
    AABB* box = 0;
    box = (AABB*)malloc(sizeof(AABB*));

    box->x = (x) ? x : 0.0f;
    box->y = (y) ? y : 0.0f;
    box->width = (w) ? w : 1.0f;
    box->height = (h) ? h : 1.0f;

    return(box);
}

void box_free(AABB *box)
{
    if(box) { free(box); }
}

int collide(AABB *box, AABB *target)
{
    if
    (
        box->x > target->x + target->width &&
        box->x + box->width < target->x &&
        box->y > target->y + target->height &&
        box->y + box->height < target->y
    )
    {
        return(0);
    }
    return(1);
}

AABB.h

#include <stdio.h>
#include <stdlib.h>

typedef struct AABB AABB;
struct AABB
{
    float x;
    float y;
    float width;
    float height;
    int solid;
};

AABB* box_new(float x, float y, float w, float h, int solid);
void box_free(AABB *box);
int collide(AABB *box, AABB *target);

我希望它会有所帮助! :)

【讨论】:

    【解决方案2】:

    检测到碰撞不会让你走得太远,因为你会遇到浮点精度问题。您可以做的是检测矩形之间的重叠,如果发生这种重叠,则碰撞已经发生,因此您可以将矩形相互碰撞。

    另外,你需要将引擎分成两种状态:

    1. 矩形被输入移动
    2. 检测到重叠,如果发现,矩形将相互移开
    3. 显示场景

    关于检测两个矩形是否重叠,请参见这个问题:

    Determine if two rectangles overlap each other?

    【讨论】:

    • 应该(可能)注意,这种方法会遗漏只会发生两个连续更新之间发生的冲突。
    • 完全是这样,但不是任何引擎在做这种事情时都会量化 T 吗?
    • 感谢您抽出宝贵时间撰写评论。它非常有建设性。我已经把它带到船上并写了一个碰撞测试。我的精灵现在消失并在与另一个矩形碰撞时重新出现在其原始 x/y 坐标处。这不是我想要的,但至少我现在在他们之间有了一些互动,这比我几天来的要多:P
    猜你喜欢
    • 1970-01-01
    • 2015-07-24
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多