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();
}
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();
}
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 !!!
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 :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.