你好,我需要帮助找出如何检查我的车是否撞到了物体。我正在尝试实现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);
}发布于 2021-10-18 21:13:49
当我第一次看到这一点时,我脑海中浮现出许多东西
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;
}你有没有试过用或( || )代替和?
其次,我不明白为什么要在比较时调用对象,也许你应该在单个对象上创建一辆汽车,然后这样做:
if((car1.getX - sizeX) - (car2.getX - sizeX)) <= 0 )
{
/* collide */
}如果2被减去,结果是0或更小,意味着它是碰撞的(我可能说错了)
另外,不要只做与AABB的比较,你需要一个八叉树,以减少比较的次数,否则游戏会变得很慢。
if (bpy - rads < 0 && vvy < 0) {
vvy *= bonc;
if(vvy < 9)
{
vvy = 0; force_y = 0;
}
bpy = 0 + rads;
}
if ((bpx+rads > 500 && vvx > 0)||(bpx-rads < -500 && vvx < 0)) {
dir_x*=-1;
vvx*=-1;
}如果这可能对你有帮助,这是一个球体与世界边界的碰撞,vvx是X上的速度,vvy是Y上的速度。
https://stackoverflow.com/questions/69622190
复制相似问题