如何旋转物体但保持灯光固定? (OpenGL的)

时间:2010-08-18 18:42:42

标签: opengl-es rotation lighting graphics

我有一个我想要旋转的立方体。我也有一个光源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);
}

感谢。

2 个答案:

答案 0 :(得分:2)

修正了什么?当您执行glLightfv(GL_LIGHT0, GL_POSITION, light0Position);

时,灯光位置会被当前的MODELVIEW矩阵转换

如果您希望它与多维数据集一起移动,则必须在翻译和轮换调用后将glLightfv(GL_LIGHT0, GL_POSITION, light0Position);移动到该位置。

答案 1 :(得分:0)

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

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