将转换应用于Bounding Box

时间:2013-05-05 09:37:15

标签: c++ opengl matrix bounding-box

我正在尝试制作坦克游戏。我已经成功加载了一个OBJ模型,并在原点计算了模型的边界框。

我现在正尝试将在游戏逻辑中完成的模型转换应用到边界框的原始坐标。为此,我在绘制模型之前抓取模型视图矩阵,然后将此矩阵乘以定义BBox的两个向量。

以下是吸引我的坦克的代码:

void drawTank()
{
    bBox = calcBBox(modelo, 1);

    glPushMatrix();
        glBindTexture(GL_TEXTURE_2D, texTank);
        glScalef(0.2, 0.2, 0.2);

        glTranslatef(posTank.x,posTank.y,posTank.z);
        glRotatef(anguloTanque, 0, 1, 0); // rotate around Y (horizontal)


        glRotatef(90, 0, 1, 0);
        glRotatef(-90, 1, 0, 0);
        glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
        glmDraw(modelo,  GLM_TEXTURE | GLM_MATERIAL);


        glColor3f(1,0,0);
        drawBBox(bBox);

    glPopMatrix();


}

通过这个片段,我的bbox被正确地绘制在坦克模型上(转换是通过glTranslate& glRotate函数在渲染中应用的)。如你所见,我也抓住了我的ModelView矩阵。

然后我按如下方式应用此矩阵(这是我的整个显示功能):

void Display(void)  {


    // Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


    glPushMatrix();
        camera(); 

        glEnable(GL_TEXTURE_2D);

        //glTranslatef(0,-40,150);

        //PLANE
        glBindTexture(GL_TEXTURE_2D, texArena);
            glBegin(GL_POLYGON);
            glTexCoord2f( 0.0f, 0.0f );
            glVertex3f(-500, 0, -500);
            glTexCoord2f( 5.0f, 5.0f );
            glVertex3f(500, 0, -500);
            glTexCoord2f(5.0f, 0.0f );
            glVertex3f(500, 0, 500);
            glTexCoord2f( 0.0f, 5.0f );
            glVertex3f(-500, 0, 500);
        glEnd();


        drawTank();

    glPopMatrix();



        point3D max = bBox.max;
        point3D min = bBox.min;
        point3D resultMax;
        point3D resultMin;
        //Transformacion
        multVectorByMatrix(matrix, max, resultMax);
        multVectorByMatrix(matrix, min, resultMin);
        bBox.max.x = resultMax.x; bBox.max.y = resultMax.y; bBox.max.z = resultMax.z;
        bBox.min.x = resultMin.x; bBox.min.y = resultMin.y; bBox.min.z = resultMin.z;

        glPushMatrix();
            glColor3f(1,1,1);
            drawBBox(bBox);
        glPopMatrix();




    glFlush();

    glutSwapBuffers();

}

将矢量乘以矩阵的函数:

void multVectorByMatrix(float* matrix, point3D vector, point3D &result)
{
    result.x = (matrix[0] * vector.x) +
               (matrix[4] * vector.y) + 
               (matrix[8] * vector.z) +
               matrix[12];
    result.y = (matrix[1] * vector.x) +
               (matrix[5] * vector.y) + 
               (matrix[9] * vector.z) +
               matrix[13];
    result.z = (matrix[2] * vector.x) +
               (matrix[6] * vector.y) + 
               (matrix[10] * vector.z) +
               matrix[14];
}

如果我使用此渲染循环绘制边界框,则会绘制边界框,但转换未正确应用。我可以通过翻译看到边界框正确移动,但旋转效果不正确。

这可能是什么问题?

编辑:一些截图 enter image description here enter image description here

1 个答案:

答案 0 :(得分:2)

您的问题出在此代码中。

    point3D max = bBox.max;
    point3D min = bBox.min;
    point3D resultMax;
    point3D resultMin;
    //Transformacion
    multVectorByMatrix(matrix, max, resultMax);
    multVectorByMatrix(matrix, min, resultMin);
    bBox.max.x = resultMax.x; bBox.max.y = resultMax.y; bBox.max.z = resultMax.z;
    bBox.min.x = resultMin.x; bBox.min.y = resultMin.y; bBox.min.z = resultMin.z;

    glPushMatrix();
        glColor3f(1,1,1);
        drawBBox(bBox);
    glPopMatrix();

从盒子中取两个顶点然后对它们应用变换,然后使用这个变换顶点来显示一个盒子,当然它将是轴对齐的,因为这是你可以从两个相对的顶点得到的唯一盒子。你可以在你的截图上看到你的bbox和正确的bbox有共同的顶点 - 这些正是你应用转换的顶点。因此,为了获得正确的bbox,您需要获取bbox的所有顶点并将这些变换应用于所有顶点。那么你就会得到你想要的东西。

相关问题