首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Object collision OpenGL

Object collision OpenGL
EN

Stack Overflow用户
提问于 2021-10-18 20:26:42
回答 1查看 99关注 0票数 0

你好,我需要帮助找出如何检查我的车是否撞到了物体。我正在尝试实现AABB,因为它们是简单的立方体,但是它似乎不起作用。我想知道是否有人能帮我解决这个问题?

下面你可以看到我的位置和我的车的大小。然后是绘制汽车、物体和检查碰撞的函数。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2021-10-18 21:13:49

当我第一次看到这一点时,我脑海中浮现出许多东西

代码语言:javascript
复制
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;
       }

你有没有试过用或( || )代替和?

其次,我不明白为什么要在比较时调用对象,也许你应该在单个对象上创建一辆汽车,然后这样做:

代码语言:javascript
复制
if((car1.getX - sizeX) - (car2.getX - sizeX)) <= 0 )
{
    /* collide */
}

如果2被减去,结果是0或更小,意味着它是碰撞的(我可能说错了)

另外,不要只做与AABB的比较,你需要一个八叉树,以减少比较的次数,否则游戏会变得很慢。

代码语言:javascript
复制
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上的速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69622190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档