Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL中的三维碰撞_C++_Opengl_3d_Collision - Fatal编程技术网

C++ OpenGL中的三维碰撞

C++ OpenGL中的三维碰撞,c++,opengl,3d,collision,C++,Opengl,3d,Collision,我正在尝试为我的OpenGL应用程序创建冲突 我有成功测试相机是否在平台对象内的代码: void checkInsidePlatform() { float halfW = gymPlatform -> getW() / 2; float Height = gymPlatform -> getH(); float halfD = gymPlatform -> getD() / 2; float platformRight = gymPlatform -> getX() +

我正在尝试为我的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;
}
void checkInsidePlatform()
{
float halfW=platform->getW()/2;
浮动高度=平台->getH();
float-halfD=platform->getD()/2;
浮动平台right=gymPlatform->getX()+halfW+1;
float platformTop=gymPlatform->getY()+高度+1;
float platformFront=gymPlatform->getZ()-halfD-1;
if(testPlatformCollision())
{
//下面的代码不起作用(此处需要帮助)
如果(myCamera->curPos->xcurPos->platformRight;
}
如果(myCamera->curPos->z>platformFront)
{
myCamera->curPos->platformFront;
}
如果(myCamera->curPos->y<平台顶部)
{
myCamera->curPos->platformTop;
}
}
}
bool testPlatformCollision()
{
float halfW=platform->getW()/2;
浮动高度=平台->getH();
float-halfD=platform->getD()/2;
float platformLeft=gymPlatform->getX()-halfW-1;
浮动平台right=gymPlatform->getX()+halfW+1;
float platformTop=gymPlatform->getY()+高度+1;
float platformFront=gymPlatform->getZ()-halfD-1;
float platformBack=gymPlatform->getZ()+halfD+1;
如果((myCamera->curPos->x>platformLeft)和&(myCamera->curPos->xcurPos->z>平台前部)和&(myCamera->curPos->z<平台后部))
{
如果(myCamera->curPos->y<平台顶部)
{
返回true;
}   
}
}
返回false;
}
但现在我被卡住了。我不知道如果相机进入平台内部,如何将其移出平台。
如果摄像机在平台内,则执行所有3项测试。

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

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

这里有一个快速的描述:找到相机应该移动的方向,使它在盒子外面。这个方向应该是向外移动的最短路径。找到要移动的距离,然后执行该移动操作


当然,实际的实现需要更多的参与。

只是RandyGaul伟大答案的一个小补充。您还可以预先计算平台的中心。然后执行(摄像头->pos-平台->pos)并找到绝对最大的组件(x、y或z),然后在该轴上将摄像头移开。