Open GL - Ayuda con visualización de composición de polígonos 3D

 
Vista:

Ayuda con visualización de composición de polígonos 3D

Publicado por yuso (1 intervención) el 06/12/2013 15:44:30
Buenas a todos.
Estoy realizando un modelo en 3D a partir de primitivas básicas, tales como un cubo.
El problema que tengo es que al ir "uniéndolos", se muestran todos los cubos, incluso las partes que deberían estar ocultas por superposición de otro.

Por ejemplo, trato de meter un cubo pequeño dentro de un cubo grande, y ocurre esto:

(He puesto el PolygonMode en GL_LINE para que se observe mejor).

Y yo no quiero que se visualice la zona del cubo pequeño que está dentro del grande.


La función INIT de visualización la tengo así:

glClearColor(0.0,0.0,1.0,0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(x0,yy0,z0,xref,yref,zref,vx,vy,vz);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum (-0.1, 0.1, -0.1, 0.1, 0.2, 40.0 );
glViewport(xvmin,yvmin,vWidth,vHeight);



La función de dibujo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
glMatrixMode(GL_MODELVIEW); //cambiamos a modo matriz de modelado
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); //establecemos que se pinten las dos caras, y relleno      
glColor3f(1.0,0.0,0.0);
 
 
//los dos cubos
glPolygonMode(GL_FRONT,GL_LINE);
 
	glPushMatrix();
		glColor3f(1,0,0);
		caja(5,5,5);
         glPushMatrix();
			glTranslatef(0,0,3);
			glColor3f(0,0,1);
			caja(4,4,4);
	glPopMatrix();
       glPopMatrix();


Y el la primitiva del cubo (caja):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
void caja( float a, float b, float m)
{
	float x,y,z;
 
	x= a/2;
	z= m/2;
	y = b;
 
  glShadeModel( GL_FLAT );
 
   /* Caras transversales */
   glBegin( GL_QUAD_STRIP );{
      glNormal3f( 0.0, 0.0, -1.0 );   /* Vertical hacia atras */
 
      glVertex3f( x, 0, -z );
      glVertex3f( -x, 0, -z );
 
 
      glVertex3f( x, y, -z );
      glVertex3f( -x, y, -z );
 
glNormal3f( 0.0, 1.0, 0.0 );       /* Superior, horizontal */
 
      glVertex3f( x, y, z );
      glVertex3f( -x, y, z );
glNormal3f( 0.0, 0.0, 1.0 );       /*Vertical delantera*/
      glVertex3f( x, 0, z );
      glVertex3f( -x, 0, z );
 
glNormal3f( 0.0, -1.0, 0.0 );       /*Inferior */
      glVertex3f( x, 0, -z );
      glVertex3f( -x, 0, -z );  }
    glEnd();
 
   /* Costados */
   glBegin( GL_QUADS );{
      glNormal3f( 1.0, 0.0, 0.0 );
      glVertex3f( x, 0, -z );
      glVertex3f( x, y, -z );
      glVertex3f( x, y, z );
      glVertex3f( x, 0, z ); }
   glEnd();
 
 
   glBegin( GL_QUADS );{
      glNormal3f( -1.0, 0.0, 0.0 );
      glVertex3f( -x, 0, -z );
      glVertex3f( -x, 0, z );
      glVertex3f( -x, y, z );
      glVertex3f( -x, y, -z ); }
   glEnd();
}


Hay algo que se me escapa pero por más que le doy vueltas e intento cosas no doy con la tecla.
¿Qué es lo que me falta o dónde está el fallo?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder