光源位置
1.視圖變換:
將相機移動到準備拍攝的位置,將它對準某個方向。
2.模型變換
將準備拍攝的對象移動到場景中的指定位置。
3.光源保持靜止
在使用完視圖和模型變換之前設置光源的位置,init()後面,display()之前。
光源出現在視圖變換之前,後面進行的變換與光源沒有關係,相對於視點固定。
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
GLfloat position[] = { 0.0, 0.0, -3.0, 1.0 }; //燈泡
glLightfv (GL_LIGHT0, GL_POSITION, position);
}
4.獨立的移動光源
在模型變換之後設置光源位置。
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}
void display(void)
{
GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 }; //燈泡
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();//用於隔離視圖變換和模型變換
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glPushMatrix ();//用於隔離視圖變換和模型變換
glRotated ((GLdouble) spin, 1.0, 0.0, 0.0);//旋轉光源
glLightfv (GL_LIGHT0, GL_POSITION, position);
glTranslated (0.0, 0.0, 1.5);
glDisable (GL_LIGHTING);
glColor3f (0.0, 1.0, 1.0);
glutWireCube (0.1);
glEnable (GL_LIGHTING);
glPopMatrix ();//局部座標系歸位
glutSolidTorus (0.25, 0.85, 8, 15);
glPopMatrix ();
glFlush ();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
5.光源和對象一起移動
void display(void) //光源和對象一起移動
{
GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
//glPushMatrix ();
glRotated ((GLdouble) spin, 1.0, 0.0, 0.0);//旋轉對象
glLightfv (GL_LIGHT0, GL_POSITION, position);
glTranslated (0.0, 0.0, 1.5);
glDisable (GL_LIGHTING);
glColor3f (0.0, 1.0, 1.0);
glutWireCube (0.1);
glEnable (GL_LIGHTING);
glTranslated (0.0, 0.0, 1.5);
glutSolidTorus (0.275, 0.85, 8, 15);
glPopMatrix ();
glFlush ();
}
6.光源和觀察點一起移動
在視圖變換之前設置光源位置,(ex, ey, ez)控制觀察點位置;(upx, upy, upz)控制朝上向量的值;現在如果觀察點移動位置,光源也跟着一起移動
void display(void) //光源和一起移動
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();
//gluLookAt (ex, ey, ez, 0.0, 0.0, 0.0, upx, upy, upz);
gluLookAt (5.0, 0.0, move, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glutSolidTorus (0.275, 0.85, 8, 15);
glPopMatrix ();
glFlush ();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };
glLightfv (GL_LIGHT0, GL_POSITION, position);
}