2013-05-14 49 views
0

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

我有代码,成功测试我的相机是我的平台对象内:

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个测试。

回答

2

您需要执行冲突解决。碰撞解决是解决碰撞的行为,并且比仅执行布尔型函数更复杂。

要搜索的附加信息是:分离轴测试(SAT)。由于您正在处理AABB(大概),您可以轻松地将简单的分辨率放在一起,将相机移到外面。

下面是一个简单的描述:找到相机应该移动的方向,使其位于盒子外面。这个方向应该是可能走出去的最短路径。找到要移动的距离,然后执行该移动操作。

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

+1

只是RandyGaul的一个很好的补充。您也可以诀窍预先计算平台的中心。然后执行(camera-> pos - platform-> pos)并找到绝对最大的分量(x,y或z)并将相机移动到该轴上。 – Trax

+0

完美!很棒。非常感谢! – Split