我正在尝试制作坦克游戏。我已经成功加载了一个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];
}
如果我画边界框与此渲染循环,然后我的边界框被绘制,但转换不适当地应用。我可以看到边界框在翻译中正确移动,但旋转不正确。
这里有什么问题?
编辑:一些截图
请问您可以添加一些截图来澄清问题到底是什么? – 2013-05-05 09:51:24
我刚刚做到了。但很难看到。红色的bbox是用opengl渲染变换函数绘制的,白色的是通过将bbox位置乘以变换矩阵来计算的。 – MichelReap 2013-05-05 09:57:05
你可以显示你的'multVectorByMatrix'函数吗?我认为问题在那里,因为你需要将矩阵乘以矢量,而不是相反,正如从名字看来的那样。 – 2013-05-05 10:09:18