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 计算的详细说明)。
注意:
- OBB 与 OpenGL 无关。你可以计算 OBB/ABB 有一个模型但从不绘制它。分离任务!
- 绝不能为同一个模型计算两次 OBB,这是毫无意义的计算。理想的做法是预先计算构成您要绘制的每个对象的 OBB 的 8 个点的坐标并存储它们。请记住,这意味着无论您对对象应用何种几何变换,都需要将其应用到 OBB。
如何围绕我在 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 计算的详细说明)。
注意:
- OBB 与 OpenGL 无关。你可以计算 OBB/ABB 有一个模型但从不绘制它。分离任务!
- 绝不能为同一个模型计算两次 OBB,这是毫无意义的计算。理想的做法是预先计算构成您要绘制的每个对象的 OBB 的 8 个点的坐标并存储它们。请记住,这意味着无论您对对象应用何种几何变换,都需要将其应用到 OBB。