2013-05-05 63 views
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]; 
} 

如果我画边界框与此渲染循环,然后我的边界框被绘制,但转换不适当地应用。我可以看到边界框在翻译中正确移动,但旋转不正确。

这里有什么问题?

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

+0

请问您可以添加一些截图来澄清问题到底是什么? – 2013-05-05 09:51:24

+0

我刚刚做到了。但很难看到。红色的bbox是用opengl渲染变换函数绘制的,白色的是通过将bbox位置乘以变换矩阵来计算的。 – MichelReap 2013-05-05 09:57:05

+0

你可以显示你的'multVectorByMatrix'函数吗?我认为问题在那里,因为你需要将矩阵乘以矢量,而不是相反,正如从名字看来的那样。 – 2013-05-05 10:09:18

回答

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

+0

就是这样!非常感谢你 – MichelReap 2013-05-05 10:38:55