2015-12-09 6 views
0

Как создать ограничивающий прямоугольник вокруг 3D-объекта, который я создал в 3DS MAX, а затем использовать его в приложении openGL? Мне нужна ограничивающая рамка для обнаружения конфликтов, но я не понимаю, как связать ограничительную рамку с объектом. Функция, которая создает объект является:Ограничительная коробка в opengl c программировании

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 функции ?

+1

Столкновение не имеет никакого отношения к рендерингу. И OpenGL предназначен для рендеринга. Поэтому, если вы не намереваетесь нарисовать этот ограничивающий прямоугольник, OpenGL не поможет вам. –

+0

@ NIcol Bolas Хорошо, но как рисовать ограничивающий прямоугольник вокруг моего объекта, поэтому, когда я перемещаюсь по своей сцене, не будет проходить через другие объекты, у которых также должна быть рамка вокруг них. Объект, который я описал выше, является моим единственным движущимся объектом, управляемым клавиатурой и мышью. Благодарю. – sixfeet

+0

Рисование ограничивающей рамки имеет * ничего *, чтобы перемещать ее или не пропускать через что-то другое. –

ответ

0

«Лучшее» поле, которое вы можете построить для обнаружения столкновений, представляет собой ориентированный ограничивающий прямоугольник (OBB), который является минимально возможным полем, подходящим для объекта. Для этого вам необходимо изучить некоторые математические данные (в основном, для собственных векторов) и использовать их для OBB (уточните this answer для подробного объяснения об определении OBB).

Обратите внимание, что:

  1. ФЖДА не имеет ничего общего с OpenGL. Вы можете вычислить OBB/ABB с моделью и никогда не рисовать ее. Отделите задачи!
  2. OBB никогда не должен вычисляться дважды для одной и той же модели, это вычислительно бессмысленно. Идеальным было бы прекомпомировать координаты 8 точек, образующих OBB каждого из объектов, которые вы собираетесь нарисовать и сохранить. Помните, что это означает, что независимо от геометрического преобразования, которое вы применяете к вашему объекту, вам также необходимо применить его к OBB.