代码之家  ›  专栏  ›  技术社区  ›  snakile

如何旋转一个物体,但保持照明不变?(OpenGL)

  •  2
  • snakile  · 技术社区  · 14 年前

    我有一个立方体要旋转。我还有一个光源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 回复  |  直到 14 年前
        1
  •  2
  •   Andreas Brinck    14 年前

    修正了什么?进行此操作时,灯光位置将由当前模型视图矩阵转换。 glLightfv(GL_LIGHT0, GL_POSITION, light0Position);

    如果你想让它和立方体一起移动,你就必须移动它。 gllightfv(gl_light0,gl_位置,light0位置); 在转换和旋转调用之后。

        2
  •  0
  •   ssube    14 年前

    问题似乎是你在旋转 模型视图矩阵 ,而不是多维数据集本身。实际上,你在移动摄像机。

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