glutSolidTeapot(opengl.orgに従って自動的に生成された表面法線を持つ)と拡散光を放出する光源があります。ティーポットを回転させようとすると問題が発生します。光源も回転を行っているようで、定義したのと同じ位置に留まっていません(基本的にティースポットに従います)。私のコードでわかるように、初期化時に照明位置を変更するだけなので、照明位置を設定した後に呼び出されるため、glRotatef()の対象にはなりません。
この問題を解決するために何時間も費やしたにもかかわらず、私はこの種の行動が何に起因するのか本当にわかりません。
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;
}