我试图了解改变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。但光线是从后面传来的。
答案 0 :(得分:1)
在执行转换后,OpenGL不会将对象放入引用(0,0,0)。在转换立方体对象时,将参考点更改为立方体的中心。在此之后,您正在转换和绘制的任何内容都将从多维数据集居中的位置偏移。您需要推送并弹出转换矩阵。
glPushMatrix()
和
glPopMatrix()
如果我没记错的话,这就是你必须遵循的格式:
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();