【问题标题】:Object collision OpenGL物体碰撞OpenGL
【发布时间】: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、glPushMatrixglTranslateglColor 等都已弃用。

标签: c++ opengl collision-detection glut


【解决方案1】:

当我第一次看到这个时,我会想到很多事情

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;
       }

您是否尝试过使用 or (||) 代替 and?

其次,我不明白您为什么要在比较中调用该对象,也许您应该在单个对象上创建一辆车并执行以下操作:

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 上的速度和 Y 上的 vvy 速度

【讨论】:

  • 如果你想要更简单的碰撞,你可以使用一个数组和一个光线投射器,然后移动数组内的元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多