PDA

View Full Version : [c] opengl problemi nel disegno di un cubo


Prince_81
24-10-2011, 16:02
Ciao a tutti,
sto provando a disegnare un cubo ma purtroppo ho un problema, alcuni lati anche se vengono disegnati risultano invisibili sapreste aiutarmi?

eccovi la funzione che dovrebbe disegnare il cubo:
GLvoid drawCubo(GLvoid){
GLfloat lato=.2,zinf=-.2,zsup=.2;
GLfloat x[]={-lato,-lato,lato,lato},y[]={-lato,lato,lato,-lato};
GLint i;
//lati del cubo
glBegin(GL_QUAD_STRIP);
glColor3ub(255,255,0);
for(i=0;i<4;i++){
glVertex3f(x[i],y[i],zinf);
glVertex3f(x[i],y[i],zsup);
}
glVertex3f(x[0],y[0],zinf);glVertex3f(x[0],y[0],zsup);
glEnd();
//base superiore e inferiore del cubo
glBegin(GL_QUADS);
glColor3ub(0,255,255);
for(i=0;i<4;i++)
glVertex3f(x[i],y[i],zinf);//base superiore azzurra
glColor3ub(0,0,255);
for(i=0;i<4;i++)
glVertex3f(x[i],y[i],zsup);//base superiore blu
glEnd();

}

Freaxxx
24-10-2011, 16:38
manca il resto del programma ed uno screen di quello che ti renderizza.

Prince_81
24-10-2011, 17:48
ecco il programma:

#include<stdio.h>
#include<GL/glut.h>


GLvoid ControlloErrori(char *label){
GLenum errore;
while((errore=glGetError())!=GL_NO_ERROR){
printf("%s %s\n",label,gluErrorString(errore));
}
}

GLvoid drawAssi(GLvoid){
GLfloat x[]={1,0,0};
GLfloat y[]={0,1,0};
GLfloat z[]={0,0,1};
GLfloat center[]={0,0,0};

glBegin(GL_LINES);
glColor3ub(255,0,0);
glVertex3fv(center);
glVertex3fv(x);
glColor3ub(0,255,0);
glVertex3fv(center);
glVertex3fv(y);
glColor3ub(0,0,255);
glVertex3fv(center);
glVertex3fv(z);
glEnd();

}

GLvoid drawCubo(GLvoid){
GLfloat lato=.2,zinf=-.2,zsup=.2;
GLfloat x[]={-lato,-lato,lato,lato},y[]={-lato,lato,lato,-lato};
GLint i;

glBegin(GL_QUAD_STRIP);
glColor3ub(255,255,0);
for(i=0;i<4;i++){
glVertex3f(x[i],y[i],zinf);
glVertex3f(x[i],y[i],zsup);
}
glVertex3f(x[0],y[0],zinf);glVertex3f(x[0],y[0],zsup);
glEnd();

glBegin(GL_QUADS);
glColor3ub(0,255,255);
for(i=0;i<4;i++)
glVertex3f(x[i],y[i],zinf);//base superiore azzurra
glColor3ub(0,0,255);
for(i=0;i<4;i++)
glVertex3f(x[i],y[i],zsup);//base superiore blu
glEnd();

}

void disegno(GLvoid){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(-50,1,0,0);
glRotatef(-130,0,0,1);
drawAssi();
drawCubo();

glPopMatrix();
ControlloErrori("disegno");
glutSwapBuffers();

}


int main(int argc,char** argv){

glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
glEnable(GL_DEPTH_TEST);
glutCreateWindow("cubo");
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1,1,-1,1,-1,1);
glMatrixMode(GL_MODELVIEW);
glClearColor(0,0.3,0,0);
glShadeModel(GL_FLAT);
glutDisplayFunc(disegno);
glutMainLoop();

}

Freaxxx
24-10-2011, 19:22
a me funziona, il problema forse è che ti aspetti che il cubo si possa ruotare tramite un drag&drop con il cursore, in questo caso la risposta è sempre negativa semplicemente perché OpenGL è una tecnologia per il rendering e non un framework con velleità multimediali, OpenGL, o meglio GLUT e/o freeGLUT che siano, non gestiscono altro all'infuori del rendering di punti, linee, primitive e colori, per i comandi devi far riferimento ad altri framework o altre librerie.

Prince_81
24-10-2011, 20:52
no il problema è che non vedo due lati, mancano due lati gialli !!!

Tommo
25-10-2011, 01:40
La normale di un triangolo va nel verso del "vertex winding", ovvero nel verso dell'enumerazione dei vertici.

Dati V1, V2, V3, la normale è messa in modo che girando intorno, si percorrono da 1 a 3 in senso orario... in poche parole è calcolata col prodotto vettoriale.

In breve: sei sicuro che disegni i vertici nell'ordine giusto? Se la normale viene invertita le facce non si vedono dal verso che ti aspetti (backface culling (http://it.wikipedia.org/wiki/Back-face_culling)) e sembra ci sia un "buco" ;)

PS: per il futuro, non usare GL_QUADS. Non usare GLUT. Non usare glBegin()-glEnd(). Usa i VBO e meshes indicizzate.
Purtroppo OpenGL ha il problema che se non sai cosa stai facendo puoi usarla come se fosse il '91, ed è quello che stai facendo qui :D

Prince_81
25-10-2011, 08:54
per adesso devo usare glut e non riesco a capire dove sbaglio!!! :(

banryu79
25-10-2011, 09:34
per adesso devo usare glut e non riesco a capire dove sbaglio!!! :(
Come dice Tommo: prova a disegnare i vertici in senso anti-orario, ho letto i valori negli array 'x' e 'y' al tuo primo post, e mi pare vadano in senso orario :)