gpt4 book ai didi

c++ - 将转换应用于边界框

转载 作者:行者123 更新时间:2023-11-28 03:17:31 25 4
gpt4 key购买 nike

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

我现在正尝试将在游戏逻辑中对我的模型所做的转换应用到边界框的原始坐标。为此,我在绘制模型之前获取模型 View 矩阵,然后将该矩阵乘以定义 BBox 的两个 vector 。

这是绘制我的坦克的代码:

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();

}

vector 乘以矩阵的函数:

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

最佳答案

您的问题出在这段代码中。

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

关于c++ - 将转换应用于边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com