【问题标题】:3D collision in OpenGLOpenGL中的3D碰撞
【发布时间】:2013-05-15 05:08:14
【问题描述】:

我正在尝试为我的 OpenGL 应用程序创建碰撞。

我的代码可以成功测试我的相机是否在我的平台对象内:

void checkInsidePlatform()
{
float halfW = gymPlatform -> getW() / 2;
float Height = gymPlatform -> getH();
float halfD = gymPlatform -> getD() / 2;
float platformRight = gymPlatform -> getX() + halfW + 1;
float platformTop = gymPlatform -> getY() + Height + 1;
float platformFront = gymPlatform -> getZ() - halfD - 1;

if(testPlatformCollision())
{
    //Below code doesnt work (NEED HELP HERE)
    if(myCamera -> curPos -> x < platformRight)
    {
        myCamera -> curPos -> platformRight;
    }
    if(myCamera -> curPos -> z > platformFront)
    {
        myCamera -> curPos -> platformFront;
    }
    if(myCamera -> curPos -> y < platformTop)
    {
        myCamera -> curPos -> platformTop;
    }
}
}

bool testPlatformCollision()
{
float halfW = gymPlatform -> getW() / 2;
float Height = gymPlatform -> getH();
float halfD = gymPlatform -> getD() / 2;
float platformLeft = gymPlatform -> getX() - halfW - 1;
float platformRight = gymPlatform -> getX() + halfW + 1;
float platformTop = gymPlatform -> getY() + Height + 1;
float platformFront = gymPlatform -> getZ() - halfD - 1;
float platformBack = gymPlatform -> getZ() + halfD + 1;

if((myCamera -> curPos -> x > platformLeft) && (myCamera -> curPos -> x < platformRight))
{
    if((myCamera -> curPos -> z > platformFront) && (myCamera -> curPos -> z < platformBack))
    {
        if(myCamera -> curPos -> y < platformTop)
        {
            return true;
        }   
    }
}

return false;
}

但现在我被困住了。如果相机进入平台,我不确定如何将其移出平台。 如果相机在平台内,则执行所有 3 个测试。

【问题讨论】:

    标签: c++ opengl 3d collision


    【解决方案1】:

    您需要执行冲突解决。冲突解决是解决冲突的行为,它比仅仅执行布尔IsColliding 函数要复杂得多。

    要搜索的其他信息是:分离轴测试 (SAT)。由于您正在处理 AABB(大概),您可以很容易地组合一个简单的分辨率,只需将您的相机移到外面。

    这里有一个简单的描述:找到相机应该移动的方向,使其位于框外。这个方向应该是可以向外移动的最短路径。找到要移动的距离,然后执行该移动操作。

    当然,实际的实现会涉及更多。

    【讨论】:

    • 只是 RandyGaul 出色答案的一个小补充。您还可以预先计算平台的中心。然后执行 (camera->pos - platform->pos) 并找到绝对最大的分量(x、y 或 z)并将相机沿该轴移开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多