Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problema opengl
Forum - C/C++ - problema opengl

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
munkaka (Member)
Pro


Messaggi: 119
Iscritto: 07/09/2008

Segnala al moderatore
Postato alle 21:08
Sabato, 24/04/2010
ciao
sto facendo un semplicissimo programma con le opengl usando glut, è un cubo che gira su se stesso, ogni faccia del cubo ha un colore diverso, il problema è che le facce del cubo non distinguono bene, ero riuscito a fare una cosa simile con wxwidget e non mi dava problemi, non riesco a capire perchè adesso non visualizza il cubo correttamente, vi posto il codice cosi vedete:
Codice sorgente - presumibilmente C/C++

  1. #include <GLUT/glut.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5.  
  6. void display(void)
  7. {
  8.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  9.         glMatrixMode(GL_MODELVIEW);
  10.         glLoadIdentity();
  11.         gluLookAt(10.0, 10.0, 3.0,  // position (x, y, z) de l'oeil
  12.                           0.0, 0.0, 0.0,  // point visé (x', y', z')
  13.                   0.0, 0.0, 1.0);
  14.        
  15.         //dessin axes
  16.         glColor4d(0.5,0.5,0.0,1.0);
  17.         glBegin(GL_LINES);
  18.         glVertex3d(0.0,0.0,50.0);
  19.         glVertex3d(0.0,0.0,-50.0);
  20.         glVertex3d(0.0,50.0,0.0);
  21.         glVertex3d(0.0,-50.0,0.0);
  22.         glVertex3d(50.0,0.0,0.0);
  23.         glVertex3d(-50.0,0.0,0.0);
  24.         glEnd();
  25.        
  26.        
  27.         glPushMatrix();
  28.        
  29.         glBegin(GL_POLYGON);
  30.         glColor4d(1.0, 1.0, 1.0 ,1.0);
  31.         glVertex3d(5.0,5.0,5.0);//faccia superiore
  32.         glVertex3d(5.0,-5.0,5.0);
  33.         glVertex3d(-5.0,-5.0,5.0);
  34.         glVertex3d(-5.0,5.0,5.0);
  35.         glEnd();
  36.        
  37.         glBegin(GL_POLYGON);
  38.         glColor4d(0.0, 1.0, 1.0 ,1.0);
  39.         glVertex3d(5.0,5.0,-5.0); //faccia inferiore
  40.         glVertex3d(5.0,-5.0,-5.0);
  41.         glVertex3d(-5.0,-5.0,-5.0);
  42.         glVertex3d(-5.0,5.0,-5.0);
  43.         glEnd();
  44.        
  45.         glBegin(GL_POLYGON);
  46.         glColor4d(1.0, 0.0, 1.0 ,1.0);
  47.         glVertex3d(5.0,5.0,-5.0); //faccia laterale1
  48.         glVertex3d(-5.0,5.0,-5.0);
  49.         glVertex3d(-5.0,5.0,5.0);
  50.         glVertex3d(5.0,5.0,5.0);
  51.         glEnd();
  52.        
  53.         glBegin(GL_POLYGON);
  54.         glColor4d(1.0, 0.0, 0.0 ,1.0);
  55.         glVertex3d(-5.0,-5.0,-5.0); //faccia laterale2
  56.         glVertex3d(-5.0,5.0,-5.0);
  57.         glVertex3d(-5.0,5.0,5.0);
  58.         glVertex3d(-5.0,-5.0,5.0);
  59.         glEnd();
  60.        
  61.         glBegin(GL_POLYGON);
  62.         glColor4d(0.5, 0.5, 0.0 ,1.0);
  63.         glVertex3d(-5.0,-5.0,-5.0); //faccia laterale3
  64.         glVertex3d(5.0,-5.0,-5.0);
  65.         glVertex3d(5.0,-5.0,5.0);
  66.         glVertex3d(-5.0,-5.0,5.0);
  67.         glEnd();
  68.        
  69.         glBegin(GL_POLYGON);
  70.         glColor4d(0.0, 0.5, 0.5 ,1.0);
  71.         glVertex3d(5.0,5.0,-5.0); //faccia laterale4
  72.         glVertex3d(5.0,-5.0,-5.0);
  73.         glVertex3d(5.0,-5.0,5.0);
  74.         glVertex3d(5.0,5.0,5.0);
  75.         glEnd();
  76.        
  77.         glPopMatrix();
  78.        
  79.         glFlush();
  80.         glutSwapBuffers();
  81. }
  82.  
  83.  
  84. void init(void)
  85. {
  86.         glClearColor (0.0, 0.0, 0.0, 0.0);
  87.         glShadeModel (GL_FLAT);
  88.        
  89. }
  90.  
  91. void reshape(int w, int h)
  92. {
  93.        
  94.     glViewport (0, 0, (GLsizei) w, (GLsizei) h);
  95.     glEnable(GL_DEPTH_TEST);    //
  96.     glMatrixMode(GL_PROJECTION);
  97.     glLoadIdentity();
  98.     gluPerspective(65.0, 4./3., 0.0, 1000.0);
  99.     glOrtho(-20.0, 20.0, -20.0, 20.0, -20.0, 20.0);
  100.     //glMatrixMode(GL_MODELVIEW);
  101.     //glLoadIdentity();
  102.        
  103.        
  104. }
  105.  
  106. int main(int argc, char** argv)
  107. {
  108.         glutInit(&argc, argv);
  109.         glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
  110.         glutInitWindowSize (500, 500);
  111.         glutInitWindowPosition (100, 100);
  112.         glutCreateWindow ("test");
  113.         init ();
  114.         glutDisplayFunc(display);
  115.         glutReshapeFunc(reshape);
  116.         glutMainLoop();
  117.         return 0;  
  118. }



basta compilare e vedete immediatamente cosa intendo, grazie

Ultima modifica effettuata da munkaka il 24/04/2010 alle 21:09
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 5:16
Domenica, 25/04/2010
manda anche uno screenshot... non tutti possono installarsi le librerie (ed eventualmente anche il sistema operativo), crearsi un progetto e debuggarlo solo per rispondere in un forum :-)

PM Quote
Avatar
munkaka (Member)
Pro


Messaggi: 119
Iscritto: 07/09/2008

Segnala al moderatore
Postato alle 9:55
Domenica, 25/04/2010
ho messo lo screenshot in allegato
nell immagine si vede che la faccia di destra che è viola è sovrastata da quella dietro che è rossa, e quella superiore che dovrebbe essere bianca non si vede praticamente


munkaka ha allegato un file: cubo.jpg (62452 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
munkaka (Member)
Pro


Messaggi: 119
Iscritto: 07/09/2008

Segnala al moderatore
Postato alle 19:05
Domenica, 25/04/2010
ho scoperto che è importante l'ordine in cui disegno le facce del cubo, le facce che disegno per ultimo restano davanti a quelle disegnate prima, però il mio cubo poi dovra girare e non posso cambiare l'ordine in cui disegno le facce ogni volta, non cè un modo per far si che l'ordine non sia importante ma che invece mi mostra solo gli oggetti che sono davanti e quelli dietro restano nascosti?

PM Quote
Avatar
napco (Normal User)
Pro


Messaggi: 64
Iscritto: 16/04/2010

Segnala al moderatore
Postato alle 0:47
Lunedì, 26/04/2010
Le operazioni di disegno tramite vertici vengono gestite da OpenGL come una pila LIFO (last-in first-out). In pratica l'ultimo glVertex dichiarato verrà disegnato per primo. OpenGL dovrebbe anche ottimizzare il tuo cubo e disegnartelo correttamente tenendo in considerazione le varie coordinate z, ma credo non lo faccia per via del multiplo utilizzo di glBegin() e glEnd(). Mi sembrava esistesse un modo migliore per disegnare piu poligoni contemporaneamente all'interno di un solo blocco glBegin() - glEnd() ma purtroppo non lo ricordo. Forse potrebbe essere GL_QUADS? Tentar non nuoce! Spero di esserti stato almeno un po' d'aiuto.

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:36
Lunedì, 26/04/2010
esattamente..

metti un glBegin(GL_QUADS);
all'inizio di tutta la parte di disegno...

lascia invariato il resto, OpenGL saprà automaticamente che deve iniziare un nuovo poligono ogni 4 vertici (elimina però i glBegin e i glEnd intermedi).

poi metti un glEnd(); alla fine e vedi se con questo risolvi il problema :)

PM Quote
Avatar
munkaka (Member)
Pro


Messaggi: 119
Iscritto: 07/09/2008

Segnala al moderatore
Postato alle 14:50
Lunedì, 26/04/2010
ho provato a fare come mi avete detto ma non cambia niente, allego il codice, ma è uguale a quello postato tranne che ho messo glBegin(GL_QUADS) e tolto i glBegin(GL_POLYGON)


munkaka ha allegato un file: main.cpp.zip (1310 bytes)
Clicca qui per scaricare il file
PM Quote
Avatar
napco (Normal User)
Pro


Messaggi: 64
Iscritto: 16/04/2010

Segnala al moderatore
Postato alle 15:17
Lunedì, 26/04/2010
Per qualche ragione a me ignota il tuo codice compila ma da come risultato una finestra nera... Forse è un problema della mia scheda video. In fondo uso OpenGL solamente per il 2D, quindi non saprei. Potresti provare ad aggiungere nel main(), subito dopo init() un reshape(500, 500) e dirmi che succede?

PM Quote
Avatar
munkaka (Member)
Pro


Messaggi: 119
Iscritto: 07/09/2008

Segnala al moderatore
Postato alle 17:05
Lunedì, 26/04/2010
niente, come prima

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo