opengl c编程中的边界框

Bounding box in opengl c programming

如何围绕我在 3DS MAX 中创建的 3d 对象创建边界框,然后在 openGL 应用程序中使用它?我需要用于碰撞检测的边界框,但我不明白如何 link 对象的边界框。创建对象的函数是:

void drawR2D2(){
if (xrot <= 5.0) xrot = 5.0;

if (xrot >= 70.0) xrot = 70.0;

if (ztransKit2 >= 0.7) ztransKit2 = 0.7;

if (xtransS1 >= 0.2) xtransS1 = 0.2;

if (ztransKit2 <= 0.0) ztransKit2 = 0.0;

if (xtransS1 <= 0.0) xtransS1 = 0.0;


glPushMatrix();
    drawBodyR2();
glPopMatrix();

glPushMatrix();
    glTranslatef(0.0, 1.2, 0.0);
    glScalef(2.85, 2.85, 2.85);
    glRotatef(yrotHead, 0.0, 1.0, 0.0);
    drawHeadR2();
glPopMatrix();

glPushMatrix();
    glScalef(3.5, 3.5, 3.5);
    drawLegsR2();
glPopMatrix();

glPushMatrix();
    glTranslatef(-0.41, 0.45, 0.26);
    glScalef(1.4, 1.4, 1.4);
    glRotatef(xrotKit1, 1.0, 0.0, 0.0);
    drawKit1R2();
glPopMatrix();

glPushMatrix();
    glTranslatef(-0.2, 0.5, 0.0 + ztransKit2);
    glScalef(2.0, 2.0, 2.0);
    glRotatef(zrotKit2, 0.0, 0.0, 1.0);
    drawKit2R2();
glPopMatrix();

glPushMatrix();
    glTranslatef(-0.25 + xtransS1, 0.48, 0.45);
    glScalef(1.55, 1.55, 1.55);
    drawShield1R2();
glPopMatrix();

glPushMatrix();
    glTranslatef(-0.44 + xtransS2, 0.48, 0.37);
    glScalef(1.12, 1.12, 1.12);
    drawShield2R2();
glPopMatrix();
}

其他函数:drawBodyR2()drawHeadR2等都是整个对象的组成部分

例如drawBodyR2的代码是:

void drawBodyR2(){
InitModel("r2d2/body.obj", &body);//function to initialize the object
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, bodyId);
glmDraw(body, GLM_SMOOTH | GLM_TEXTURE);
glDisable(GL_TEXTURE_2D);
}

谁能告诉我如何在 drawR2D2 函数生成的对象周围创建边界框?

您可以为碰撞检测构建的 "best" 框是一个定向边界框 (OBB),它是适合对象的最小可能框。为此,您需要学习一些数学知识(特征向量主要是什么)并将它们用于 OBB(检查 this answer 以获取有关 OBB 计算的详细说明)。

注意:

  1. OBB 与 OpenGL 无关。你可以计算 OBB/ABB 有一个模型但从不绘制它。分离任务!
  2. 绝不能为同一个模型计算两次 OBB,这是毫无意义的计算。理想的做法是预先计算构成您要绘制的每个对象的 OBB 的 8 个点的坐标并存储它们。请记住,这意味着无论您对对象应用何种几何变换,都需要将其应用到 OBB。