2

我有一个要旋转的立方体。我还有一个光源 GL_LIGHT0。我想旋转立方体并将光源固定在其位置。但是光源和我的立方体一起旋转。我使用 OpenGL ES 1.1 这是我的代码片段,让我的问题更清楚。

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

谢谢。

4

2 回答 2

2

固定与什么有关?当您这样做时,灯光位置由当前的 MODELVIEW 矩阵转换glLightfv(GL_LIGHT0, GL_POSITION, light0Position);

如果您希望它与立方体一起移动,则必须glLightfv(GL_LIGHT0, GL_POSITION, light0Position);在平移和旋转调用之后移动。

于 2010-08-18T18:52:04.390 回答
0

问题似乎是您正在旋转模型视图矩阵,而不是立方体本身。本质上,您正在移动相机。

为了只旋转立方体,您需要旋转构成立方体的顶点。通常这是使用库(GLUT 或类似的库)或简单的触发来完成的。在 glDrawElements 调用之前,您将对存储在数组中的顶点数据进行操作。您可能/可能不必或不想修改法线或纹理坐标,这取决于您的效果以及最终的外观。

于 2010-08-18T18:47:10.097 回答