我有一個glutSolidTeapot(它的表面法線根據opengl.org自動生成)和一個發出漫射光的光源。當我嘗試旋轉茶壺時,問題就出現了:它看起來像光源也在旋轉,而不是保持在我定義的相同位置(它基本上遵循茶壺)。正如你在我的代碼中看到的那樣,我只是在初始化時修改了光照位置,所以它不會受到glRotatef()的影響,因爲它在之後調用設置光源位置。如何在旋轉對象時在OpenGL中注入光源?
儘管花了很多時間試圖解決這個問題,我真的不知道這種行爲可以歸因於什麼。
粘貼glEnable(GL_NORMALIZE);在初始化中也沒有解決問題。
我認爲所需的輸出應該是一個有光澤的右側茶壺(因爲光線來自該方向),無論茶壺旋轉的角度是多少。
如果您想測試我的代碼,請按空格旋轉茶壺。
#include <math.h>
#include <stdlib.h>
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
#include <windows.h>
#endif
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
void onInitialization() { //creating the light source
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
GLfloat diffuse[]={0.8, 0.8, 0.8, 1.0};
GLfloat pos[]={0.5, 0.0, 0.8, 0.0};
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHT0);
glRotatef(-90, 1, 0, 0); //we want to see the top of the teapot
}
void onDisplay() {
glClearColor(0.1f, 0.2f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//rotating on every frame (for testing purposes only)
glRotatef(5, 0,1,0);
glutSolidTeapot(0.4);
glFinish();
glutSwapBuffers();
}
void onKeyboard(unsigned char key, int x, int y) {
if (key==32){ //do rotation upon hitting the Space key
glutPostRedisplay();
}
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitWindowSize(600, 600);
glutInitWindowPosition(100, 100);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Teapot");
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
onInitialization();
glutDisplayFunc(onDisplay);
glutKeyboardFunc(onKeyboard);
glutMainLoop();
return 0;
}
我會手動旋轉點而不使用glRotate!這會有點煩人,但那會100%解決你的問題。我自己也遇到了這個問題,找不到任何其他解決方案。 – 2012-03-16 06:20:09