2010-08-18 40 views
2

我有一個我想旋轉的立方體。我也有一個光源GL_LIGHT0。我想旋轉立方體並將光源固定在其位置上。但光源與我的立方體一起旋轉。我使用OpenGL ES 1.1 下面是我的代碼片段,使我的問題更清晰。如何旋轉物體並保持固定? (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); 
} 

謝謝。

回答

2

固定在什麼?燈光位置由當前的MODELVIEW矩陣轉換當您做glLightfv(GL_LIGHT0, GL_POSITION, light0Position);

如果您希望它與多維數據集一起移動,您必須將glLightfv(GL_LIGHT0, GL_POSITION, light0Position);移動到轉換和旋轉調用之後。

0

問題似乎是,您正在旋轉模型視圖矩陣,而不是多維數據集本身。基本上,你正在移動相機。

爲了只旋轉立方體,您需要旋轉組成立方體的頂點。通常這是使用庫(GLUT或其他)或簡單的trig完成的。在調用glDrawElements之前,您將使用存儲在數組中的頂點數據。您可能不需要或不想修改法線或紋理座標,這取決於您的效果以及最終的效果。

+0

謝謝。但是:我們不能使用GLUT,因爲我們使用的是OpenGL ES(嵌入式)。沒有另一種簡單的方法來旋轉立方體(不是視圖矩陣)嗎? – snakile 2010-08-18 18:51:29

+0

1.直接旋轉頂點是一個不好的建議。 2. OpenGL沒有**視圖**矩陣。它有** modelview **矩陣。這是世界*的觀點。 – SigTerm 2010-08-18 18:52:40

+0

@SigTerm好吧,那麼如何旋轉立方體而不直接旋轉頂點? – snakile 2010-08-18 18:56:03