0

我正在尝试制作坦克游戏。我已经成功加载了一个 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];
}

如果我用这个渲染循环绘制边界框,那么我的边界框会被绘制,但转换没有正确应用。我可以看到边界框随着平移而正确移动,但旋转不正确。

这里可能有什么问题?

编辑:一些截图 在此处输入图像描述 在此处输入图像描述

4

1 回答 1

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的所有顶点并将这些变换应用到所有顶点。然后你会得到你想要的。

于 2013-05-05T10:21:32.137 回答