2010-08-18 39 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