2010-08-18 10 views
2

J'ai un cube que je veux faire pivoter. J'ai aussi une source de lumière GL_LIGHT0. Je veux faire pivoter le cube et laisser la source lumineuse fixée à son emplacement. Mais la source de lumière tourne avec mon cube. J'utilise OpenGL ES 1.1 Voici un extrait de mon code pour clarifier ma question.Comment faire pivoter un objet et laisser l'éclairage fixe? (OpenGL)

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); 
} 

Merci.

Répondre

2

Fixé par rapport à quoi? La position de la lumière est transformée par la matrice MODELVIEW en cours

Si vous voulez que le cube bouge, vous devrez déplacer glLightfv(GL_LIGHT0, GL_POSITION, light0Position); après les appels de translation et de rotation.

0

Le problème semble être que vous faites pivoter la matrice modelview, pas le cube lui-même. Essentiellement, vous déplacez la caméra. Pour faire pivoter uniquement le cube, vous devez faire pivoter les sommets qui composent le cube. Généralement, cela est fait en utilisant une bibliothèque (GLUT ou une telle) ou simple trig. Vous allez utiliser les données de sommet stockées dans le tableau, avant l'appel de glDrawElements. Vous pouvez/ne devez pas ou ne voulez pas modifier les normales ou les coordonnées de texture, cela dépend de vos effets et de la façon dont il finit par regarder.

+0

Merci. Mais: Nous ne pouvons pas utiliser GLUT car nous utilisons OpenGL ES (embarqué). N'y a-t-il pas un autre moyen plus simple de faire pivoter seulement le cube (pas la matrice de vue)? – snakile

+0

1. La rotation directe des sommets est un mauvais conseil. 2. OpenGL n'a pas de matrice ** view **. Il a la matrice ** modelview **. Quel est le monde * vue. – SigTerm

+0

@SigTerm OK, alors comment faire pivoter le cube sans faire pivoter les sommets directement? – snakile

Questions connexes