Come ruotare un oggetto e, ma lasciando l'illuminazione fisso? (OpenGL)
Domanda
Ho un cubo che ho da ruotare. Ho anche un GL_LIGHT0 fonte di luce. Voglio ruotare il cubo e lascio la fonte di illuminazione fissata nella sua posizione. Ma la sorgente di luce è in rotazione insieme al mio cubo. Io uso OpenGL ES 1.1 Ecco un frammento del mio codice per rendere la mia domanda più chiaro.
GLfloat glfarr[] = {...} //cube points
GLubyte glubFaces[] = {...}
Vertex3D normals[] = {...} //normals to surfaces
const GLfloat light0Position[] = {0.0, 0.0, 3.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION, light0Position);
glEnable(GL_LIGHT0);
for(i = 0; i < 8000; ++i)
{
if (g_bDemoDone) break;
glLoadIdentity();
glTranslatef(0.0,0.0, -12);
glRotatef(rot, 0.0, 1.0,1.0);
rot += 0.8;
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, normals);
glVertexPointer(3, GL_FLOAT, 0, glfarr);
glDrawElements(GL_TRIANGLES, 3*12, GL_UNSIGNED_BYTE, glubFaces);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
eglSwapBuffers(eglDisplay, eglSurface);
}
Grazie.
Soluzione
fissi in relazione a che cosa? La luce di posizione viene trasformata dalla matrice modelview corrente quando si fa glLightfv(GL_LIGHT0, GL_POSITION, light0Position);
Se si desidera muoversi con con il cubo si dovrà spostare glLightfv(GL_LIGHT0, GL_POSITION, light0Position);
a dopo le chiamate di traslazione e rotazione.
Altri suggerimenti
Il problema sembra essere che si sta ruotando il modelview matrice , non il cubo stesso. In sostanza, si sta spostando la fotocamera.
Al fine di ruotare solo il cubo, avrete bisogno di ruotare i vertici che compongono il cubo. In generale questo è fatto utilizzando una libreria (GLUT o qualcosa del genere) o di semplice trigonometria. Sarete operando sui dati vertice memorizzati nella matrice, prima che i glDrawElements chiamano. Si può / non potrebbe essere necessario o vogliono modificare le normali o coordinate della texture, dipende dal vostro effetti e come si finisce per guardare.