2013-11-02 16 views
7

Sto tentando di creare 2 box in OpenGL, ma appaiono all'interno e talvolta non si sovrappongono correttamente. Video http://www.youtube.com/watch?v=IVJu4zJFp7QOpenGL esegue il rendering di caselle all'interno

Immagino sia un problema di profondità ma non sono stato in grado di capire cosa sto facendo male.

Ecco il codice che sto utilizzando per inizializzare:

glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 

glDisable(GL_CULL_FACE); 
glEnable(GL_DEPTH_TEST); 

Qui è la mia funzione distplay glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

drawYellowBox(); 
drawBlueBox(); 

E il codice che sto usando per disegnare le forme:

glPushMatrix(); 
    glBegin(GL_QUADS); 

     glColor3f(0.15, 0.15, 0.0); 
     // draw front 
     glVertex3f(-1.0, -1.5, 1.0); 
     glVertex3f(1.0, -1.5, 1.0); 
     glVertex3f(0.75, 1.5, 0.75); 
     glVertex3f(-0.75, 1.5, 0.75); 

     glColor3f(0.3, 0.3, 0.0); 
     // draw back 
     glVertex3f(1.0, -1.5, -1.0); 
     glVertex3f(-1.0, -1.5, -1.0); 
     glVertex3f(-0.75, 1.5, -0.75); 
     glVertex3f(0.75, 1.5, -0.75); 

     glColor3f(0.45, 0.45, 0.0); 
     // draw left 
     glVertex3f(-1.0, -1.5, -1.0); 
     glVertex3f(-1.0, -1.5, 1.0); 
     glVertex3f(-0.75, 1.5, 0.75); 
     glVertex3f(-0.75, 1.5, -0.75); 

     glColor3f(0.6, 0.6, 0.0); 
     // draw right 
     glVertex3f(1.0, -1.5, 1.0); 
     glVertex3f(1.0, -1.5, -1.0); 
     glVertex3f(0.75, 1.5, -0.75); 
     glVertex3f(0.75, 1.5, 0.75); 

     glColor3f(0.75, 0.75, 0.0); 
     // draw top 
     glVertex3f(-0.75, 1.5, 0.75); 
     glVertex3f(0.75, 1.5, 0.75); 
     glVertex3f(0.75, 1.5, -0.75); 
     glVertex3f(-0.75, 1.5, -0.75); 

     glColor3f(0.9, 0.9, 0.0); 
     // draw bottom 
     glVertex3f(-1.0, -1.5, -1.0); 
     glVertex3f(1.0, -1.5, -1.0); 
     glVertex3f(1.0, -1.5, 1.0); 
     glVertex3f(-1.0, -1.5, 1.0); 
    glEnd(); 

glPopMatrix(); 

glPushMatrix(); 
    glTranslatef(0.0,2.5,0.0); 
    glRotatef(joint_ui_data->getDOF(Keyframe::HEAD), 0.0, 1.0, 0.0); 


    glBegin(GL_QUADS); 

     glColor3f(0.0, 0.15, 0.15); 
     // draw front face 
     glVertex3f(-0.8, -0.45, 0.8); 
     glVertex3f(0.8, -0.45, 0.8); 
     glVertex3f(0.75, 0.45, 0.75); 
     glVertex3f(-0.75, 0.45, 0.75); 

     glColor3f(0.0, 0.3, 0.3); 
     // draw back face 
     glVertex3f(0.8, -0.45, -0.8); 
     glVertex3f(-0.8, -0.45, -0.8); 
     glVertex3f(-0.75, 0.45, -0.75); 
     glVertex3f(0.75, 0.45, -0.75); 

     glColor3f(0.0, 0.45, 0.45); 
     // draw left face 
     glVertex3f(-0.8, -0.45, -0.8); 
     glVertex3f(-0.8, -0.45, 0.8); 
     glVertex3f(-0.75, 0.45, 0.75); 
     glVertex3f(-0.75, 0.45, -0.75); 

     glColor3f(0.0, 0.6, 0.6); 
     // draw right face 
     glVertex3f(0.8, -0.45, 0.8); 
     glVertex3f(0.8, -0.45, -0.8); 
     glVertex3f(0.75, 0.45, -0.75); 
     glVertex3f(0.75, 0.45, 0.75); 

     glColor3f(0.0, 0.75, 0.75); 
     // draw top 
     glVertex3f(-0.75, 0.45, 0.75); 
     glVertex3f(0.75, 0.45, 0.75); 
     glVertex3f(0.75, 0.45, -0.75); 
     glVertex3f(-0.75, 0.45, -0.75); 

     glColor3f(0.0, 0.9, 0.9); 
     // draw bottom 
     glVertex3f(-0.8, -0.45, -0.8); 
     glVertex3f(-0.8, -0.45, 0.8); 
     glVertex3f(0.8, -0.45, 0.8); 
     glVertex3f(0.8, -0.45, -0.8); 
    glEnd(); 
glPopMatrix(); 

Grazie.

risposta

8

il problema sta nel ordina che stai inviando i tuoi vertici.

Come possiamo vedere nel vostro codice l'ordine di vertice del vostro fronte è.

// Front 
glVertex3f(-1.0, -1.5, 1.0); // Left Top 
glVertex3f(1.0, -1.5, 1.0); // Right Top 
glVertex3f(0.75, 1.5, 0.75); // Right Bottom 
glVertex3f(-0.75, 1.5, 0.75); // Left Bottom 

Come si può vedere in quel pezzo di codice tua inviare i vertici in senso orario. OpenGL di default legge tutti i poligoni in senso antiorario. Questo è il motivo per cui tutte le facce opposte vengono rimosse/nascoste (Abbattuto).

Per risolvere questo problema è possibile eseguire 1 di 2 cose.

  1. di cambiare la modalità di glFrontFace() così diventa GL_CW, invece di GL_CCW. Ricorda però che il cambiamento avrà effetto su tutto ciò che viene dopo che chiami glFrontFace(GL_CW) quindi ricorda di chiamare nuovamente glFrontFace(GL_CCW) se in qualsiasi altro punto si esegue il rendering di qualcosa che ha in senso antiorario di nuovo.

  2. Modificare l'ordine si sta inviando i vertici in.

Da

// Front 
glVertex3f(-1.0, -1.5, 1.0); // Left Top 
glVertex3f(1.0, -1.5, 1.0); // Right Top 
glVertex3f(0.75, 1.5, 0.75); // Right Bottom 
glVertex3f(-0.75, 1.5, 0.75); // Left Bottom 

Per

// Front 
glVertex3f(-1.0, -1.5, 1.0); // Left Top 
glVertex3f(-0.75, 1.5, 0.75); // Left Bottom 
glVertex3f(0.75, 1.5, 0.75); // Right Bottom 
glVertex3f(1.0, -1.5, 1.0); // Right Top 

Anche se si dispone già di tonnellate di maglie sarebbe probabilmente sarà molto più semplice cambiare semplicemente la modalità glFrontFace in GL_CW.

Extra

Inoltre, se si desidera cambiare che si affaccia vengono abbattuti, è anche possibile cambiare la modalità di glCullFace, a uno GL_FRONT, GL_BACK o GL_FRONT_AND_BACK il valore iniziale è GL_BACK.

Ricordare che è necessario chiamare glEnable(GL_CULL_FACE) per abilitare l'eliminazione dei poligoni in base all'avvolgimento dei vertici.

Modifica

Se non è un vertice di avvolgimento problema, il che potrebbe (anche se sarebbe molto strano), essere un problema il test di profondità.

Aggiungere questo codice al codice di inizializzazione.

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL); 
+0

Purtroppo, questo doesn risolve il problema Ho provato a riordinare i vertici, ma senza alcun effetto. Tornando ai vertici originali e cambiando glFrontFace in CW, il rendering non è stato ancora risolto. – Ares

+0

@Ares guarda la risposta modificata. – Vallentin

+0

Anche questo era il mio problema. (Usando Ubuntu 16.04, python GL e GLUT. Ho provato e isolato usando GLUT per disegnare cubi al posto dei miei vertici: se il cubo di GLUT è all'interno, allora non è un problema di avvolgimento ma ha bisogno che il flag di profondità si accenda.) –

2

Per risolvere questo problema è necessario capovolgere le vostre facce in giro sul vostro oggetto o si controlla normali dell'oggetto a portata di mano ...

Se si crea un aereo si noterà che si può vedere attraverso un lato di a meno che non si inverte normali per la vista laterale o aggiungere una soluzione a doppia faccia ...

io di solito uso Away3D o Three.js per contenuti 3D ... i principi sono gli stessi

+0

Ho provato a invertire l'ordine dei vertici per alcune delle facce, ma nessun effetto. È questo a causa del cogliere affilato? Sto provando a disabilitarlo abbattendo la parte posteriore. – Ares

+0

sì che potrebbe essere una possibilità, vorrei piuttosto mettere la mia risposta in un commento, ma non posso commentare sulla domanda ancora .. prova a guardare attraverso forum di siti web 3D generale problemi hanno le stesse soluzioni appena implementate un po 'diverso – Careen

1

Ho trovato il problema. Stavo abilitando il test di profondità nella mia funzione initGlut() invece della funzione initGl().

glEnable(GL_DEPTH_TEST); 
Problemi correlati