【发布时间】:2021-12-05 20:52:57
【问题描述】:
您好,我需要帮助来弄清楚如何检查我的汽车是否撞到了物体。我正在尝试实现 AABB,因为它们是简单的立方体,但它似乎不起作用。我想知道是否有人可以帮我解决这个问题?
您可以在下面看到我的车的位置和尺寸。然后是绘制汽车、物体和检查碰撞的函数。
float xPos = 80, yPos = 0, zPos = 0, xRot = 0, yRot = 0, angle = 0.0;
float carFront[] = {xPos - 8, 1, zPos + 8};
float carFrontSizeX = 2;
float carFrontSizeY = 1;
float carFrontSizeZ = 1;
float carBack[] = {xPos - 8, 1, zPos + 10};
float obj[] = {xPos, yPos, zPos};
float objSizeX = 1;
float objSizeY = 1;
float objSizeZ = 1;
bool pauseGame = false;
bool collision = false;
void drawTruck(){
//front of truck
glPushMatrix();
glTranslatef(carFront[0], carFront[1], carFront[2]);
glScalef(carFrontSizeX, carFrontSizeY, carFrontSizeZ);
glColor3f(0,0,0);
glutWireCube(2);
glColor3f(1,0,1);
glutSolidCube(2);
glPopMatrix();
//back of truck
glPushMatrix();
glTranslatef(carBack[0], carBack[1], carBack[2]);
glColor3f(0,0,0);
glutWireCube(4);
glColor3f(1,0,1);
glutSolidCube(4);
glPopMatrix();
}
void drawRandomObjects(){
glPushMatrix();
glScalef(objSizeX, objSizeY, objSizeZ); //size of object
//left object
glPushMatrix();
glTranslatef(obj[0] - 4, obj[1] + 1, obj[3] - 100);
glColor3f(0,0,0); glutWireCube(2);
glColor3f(0,1,0); glutSolidCube(2);
glPopMatrix();
//right object
glPushMatrix();
glTranslatef(obj[0] + 4, obj[1] + 1, obj[3] - 130);
glColor3f(0,0,0); glutWireCube(2);
glColor3f(0,1,0); glutSolidCube(2);
glPopMatrix();
glPopMatrix();
glutPostRedisplay();
}
bool checkCollision(){
//it's checking to see if objects are touching
if(obj[0] - objSizeX <= carFront[0] + carFrontSizeX &&
obj[0] + objSizeX >= carFront[0] - carFrontSizeX &&
obj[1] - objSizeY <= carFront[1] + carFrontSizeY &&
obj[1] + objSizeY >= carFront[1] - carFrontSizeY &&
obj[2] - objSizeZ <= carFront[2] + carFrontSizeZ &&
obj[2] + objSizeZ >= carFront[2] - carFrontSizeZ) {
return true;
} else {
return false;
}
}
//Timer function is called in every MSEC_PER_FRAME milliseconds
void timerFunc(int value){
//truck moves forward
if(!pauseGame){
carFront[2]--;
carBack[2]--;
collision = checkCollision();
}
//check for collision. If objects touch pause game
if(collision){
pauseGame = true;
}
glutPostRedisplay();
glutTimerFunc (MSEC_PER_FRAME, timerFunc, value);
}
【问题讨论】:
-
不应该是
//it's checking to see if objects are touching测试还是 (||) 测试?因为碰撞可以沿着边界框的任何轴。 -
欢迎来到 SO。请提供minimal reproducible example。也请游览一下如何提问:stackoverflow.com/help
-
fyi、
glPushMatrix、glTranslate、glColor等都已弃用。
标签: c++ opengl collision-detection glut