Opengl es 如何旋转对象,但保持照明固定?(OpenGL)

Opengl es 如何旋转对象,但保持照明固定?(OpenGL),opengl-es,rotation,lighting,graphics,Opengl Es,Rotation,Lighting,Graphics,我有一个立方体,我想旋转它。我还有一个光源GL_LIGHT0。我想旋转立方体,让光源固定在它的位置上。但是光源和我的立方体一起旋转。我使用OpenGLES1.1 下面是我的一段代码,让我的问题更清楚 GLfloat glfarr[] = {...} //cube points GLubyte glubFaces[] = {...} Vertex3D normals[] = {...} //normals to surfaces const GLfloat light0Position[] =

我有一个立方体,我想旋转它。我还有一个光源GL_LIGHT0。我想旋转立方体,让光源固定在它的位置上。但是光源和我的立方体一起旋转。我使用OpenGLES1.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);
}
GLfloat glfarr[]={…}//立方体点
GLubyte glubFaces[]={…}
Vertex3D法线[]={…}//曲面法线
常量GLfloat light0Position[]={0.0,0.0,3.0,0.0};
glLightfv(GL_LIGHT0,GL_位置,LIGHT0位置);
glEnable(GL_LIGHT0);
对于(i=0;i<8000;+i)
{
如果(g_bDemoDone)中断;
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_颜色_缓冲_位| GL_深度_缓冲_位);
glEnableClientState(GL_顶点_数组);
glEnableClientState(GL_普通_阵列);
glNormalPointer(GL_FLOAT,0,法线);
glVertexPointer(3,GL_FLOAT,0,glfarr);
GLD元素(GLU三角形,3*12,GLU无符号字节,glubFaces);
glDisableClientState(GL_NORMAL_数组);
glDisableClientState(GL_顶点_数组);
EGLSWAPBuffer(EGL显示、EGL表面);
}

谢谢。

问题似乎是您正在旋转modelview矩阵,而不是立方体本身。基本上,你是在移动摄像机


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

与什么相关的固定值?执行
glLightfv(GL_LIGHT0,GL_position,light0Position)时,灯光位置由当前模型视图矩阵变换


如果你想让它和立方体一起移动,你必须移动
glLightfv(GL_LIGHT0,GL_POSITION,light0Position)至。

谢谢。但是:我们不能使用GLUT,因为我们使用的是OpenGL ES(嵌入式)。难道没有其他更简单的方法只旋转立方体(而不是视图矩阵)吗。直接旋转顶点是一个不好的建议。2.OpenGL没有视图矩阵。它具有modelview矩阵。哪一个是world*视图。@SigTerm OK,那么如何在不直接旋转顶点的情况下旋转立方体?@snakile:当然是使用矩阵-glRotate、glTranslate、glScale、glMultMatrix。若要相对于立方体定位灯光,请在设置所有矩阵后尝试设置灯光的坐标,或者尝试将灯光更改为点(而不是方向)。对于此类问题,直接旋转顶点并不是一个坏主意。对于一百万个高多边形对象,它将是。但是,移动灯光可能是更好的解决方案。视图/模型视图只是一个输入错误,已经修复。