如何在opengl中设置光源的位置?

时间:2013-09-30 18:26:18

标签: opengl

我试图了解改变opengl中指向光源位置的效果,但是遇到了麻烦。有人可以解释不同的位置如何影响模型的照明?

我使用的代码如下 -

void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat lightPos0[] = {0.0f,0.0f, -1.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, lightPos0);
//gluLookAt(0, 6, 6.0, 0, -2, 0, 0.0f, 1.0f, 0.0f);



glTranslatef(0,0,-6);

GLfloat ambientColor[] = {0.1f, 0.1f, 0.1f, 1.0f};

glRotatef(50,1,0,0);

glRotatef(-45,0,1,0);

glBegin(GL_QUADS);


glNormal3f(-1,0,0);
glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
glNormal3f(1,0,0);
glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
glNormal3f(0,-1,0);
glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);
glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);


glNormal3f(0,0,-1);
glColor3f(0, 0, 0); glVertex3f(-1, -1, -1);
glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);
glColor3f(1, 0, 0); glVertex3f( 1, -1, -1);
glNormal3f(0,0,1);
glColor3f(0, 0, 1); glVertex3f(-1, -1,  1);
glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
glColor3f(1, 0, 1); glVertex3f( 1, -1,  1);

glEnd();
glTranslatef(-1,1,0);
glRotatef(a,0,0,1);
glTranslatef(1,-1,0);

glBegin(GL_QUADS);
glNormal3f(0,1,0);
glColor3f(0, 1, 0); glVertex3f(-1,  1, -1);
glColor3f(0, 1, 1); glVertex3f(-1,  1,  1);
glColor3f(1, 1, 1); glVertex3f( 1,  1,  1);
glColor3f(1, 1, 0); glVertex3f( 1,  1, -1);

glEnd();
glFlush();
if(a>90)
    a=a-90;
a=a+1;
glutSwapBuffers();
glutPostRedisplay();
    }

我期待光线(0,0,-1)会从前面照射到立方体上,因为我已经将立方体转换为-6。但光线是从后面传来的。

1 个答案:

答案 0 :(得分:1)

在执行转换后,OpenGL不会将对象放入引用(0,0,0)。在转换立方体对象时,将参考点更改为立方体的中心。在此之后,您正在转换和绘制的任何内容都将从多维数据集居中的位置偏移。您需要推送并弹出转换矩阵。

glPushMatrix()

glPopMatrix()

Related Forum Post

如果我没记错的话,这就是你必须遵循的格式:

glPushMatrix();
    glTranslatef(0,0,-6);
    GLfloat ambientColor[] = {0.1f, 0.1f, 0.1f, 1.0f};
    glRotatef(50,1,0,0);
    glRotatef(-45,0,1,0);
    glBegin(GL_QUADS);
    //DRAW THE OBJECT
    glEnd();
glPopMatrix();
glPushMatrix();
    glTranslate(0,0,-1);
    //Draw the light
glPopMatrix();