计算机图形学实验报告03
北方工业大学
计算机图形学课程实验报告
题 目: 实验三 光照模型 学 院: 计算机学院 专 业: 数字媒体技术 指导教师: 学生班级: 学生学号: 学生姓名:
教师评定:
1
计算机图形学实验报告03
学号:
班级: 姓名:
实验报告3 光照模型
一.实验目的
1.熟悉OpenGL图形库;
2.掌握光照模型算法。
二.实验环境
1.软件环境:
操作系统:WinXp
应用软件:VC6.0,OpenGL
2.硬件环境(查看自己的机子)
CPU: Intel PIV 2.80GHz
内存RAM: 1GB
显卡:NVIDIA GeForce7650,256M显存
三.实验内容1
写程序实现一个聚光灯围绕立方体旋转程序。要求给出RenderScene()函数。 void RenderScene (void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清楚颜色数据和深度数据(清屏)
glColor3f(1.0,1.0,1.0);
glLoadIdentity(); //初始变换矩阵为单位矩阵
glTranslated(0,-1,-5); //平移0,0,-5向Z负方向平移5个单位
glPushMatrix(); //压缩矩阵,设定光源的位置
glDisable(GL_LIGHTING);
glRotatef(yRot, 0, 1, 0); //光源的旋转
glTranslatef(light_change[0],light_change[1],light_change[2]); //光源的位置 glTranslatef(light_position[0], light_position[1],light_position[2]); //光源位置
glutSolidSphere(0.1, 4,4);//利用库函数绘制一个半径为1的球体。表示光源在这里 glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glPopMatrix();
light_direction[0] = -light_change[0];
2
计算机图形学实验报告03
light_direction[1] = -light_change[1];
light_direction[2] = -light_change[2];
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_direction); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glPopMatrix(); //光源设置完毕
glPushMatrix(); //压入变换矩阵那
// glutSolidSphere(1, 30,30);//利用库函数绘制一个半径为1的球体。
glBegin(GL_QUADS);
// 前面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的左下
glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的右下
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上
//后面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右下
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的右上
glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的左上
glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左下
// 顶面
glColor3f(1,1,1);
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下 glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上
// 底面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右上
glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左上
glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下
glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的右下
// 右面
glColor3f(1,1,1);
glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的右下
3
计算机图形学实验报告03
glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上
glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下
// 左面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的左下
glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的右下
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的右上
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上
glEnd();
glPopMatrix(); //弹出矩阵。
glutSwapBuffers(); //交换缓冲区。显示图形
}
四.实验内容2
写程序实现一个红色点光源围绕立方体旋转程序。要求给出RenderScene()函数。 float yRot = 0;
unsigned int nPre = 0;
GLfloat light_position[4] = {0,0,0,1}; //光位置
GLfloat light_diffuse[4] = {1,0,0,0}; //光的漫反色设置为红色
GLfloat light_change[3] = {3,3,-1}; //光源移动位置。
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清楚颜色数据和深度数据(清屏)
glColor3f(1.0,1.0,1.0);
glLoadIdentity(); //初始变换矩阵为单位矩阵
glTranslated(0,-1,-5); //平移0,0,-5向Z负方向平移5个单位
glPushMatrix(); //压缩矩阵,设定光源的位置
glDisable(GL_LIGHTING);
glRotatef(yRot, 0, 1, 0); //光源的旋转
glTranslatef(light_change[0],light_change[1],light_change[2]); //光源的位置 glTranslatef(light_position[0], light_position[1],light_position[2]); //光源位置
glutSolidSphere(0.1, 4,4);//利用库函数绘制一个半径为1的球体。表示光源在这里 glEnable(GL_LIGHTING);
4
计算机图形学实验报告03
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glPopMatrix();
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glPopMatrix(); //光源设置完毕
glPushMatrix(); //压入变换矩阵那
// glutSolidSphere(1, 30,30);//利用库函数绘制一个半径为1的球体。
glBegin(GL_QUADS);
// 前面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的左下
glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的右下
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上
//后面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右下
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的右上
glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的左上
glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左下
// 顶面
glColor3f(1,1,1);
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下 glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上
// 底面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右上
glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左上
glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下
glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的右下
// 右面
glColor3f(1,1,1);
glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的右下
5
计算机图形学实验报告03
glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上
glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下
// 左面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的左下
glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的右下
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的右上
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上
glEnd();
glPopMatrix(); //弹出矩阵。
glutSwapBuffers(); //交换缓冲区。显示图形
}
五.实验内容3
读程序实现三个点光源围绕立方体旋转效果。要求点光源分别为R、G、B三色。要求给出RenderScene()函数及光源设置函数。
float yRot = 0;
unsigned int nPre = 0;
GLfloat light_position1[4] = {0,0,0,1}; //光位置
GLfloat light_position2[4] = {1,0,0,1};
GLfloat light_position3[4] = {0,1,0,1};
GLfloat light_diffuse1[4] = {1,0,0,0}; //光的漫反色
GLfloat light_diffuse2[4] = {0,1,0,0};
GLfloat light_diffuse3[4] = {0,0,1,0};
GLfloat light_change[3] = {3,3,-1}; //光源移动位置。
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清楚颜色数据和深度数据(清屏)
glColor3f(1.0,1.0,1.0);
glLoadIdentity(); //初始变换矩阵为单位矩阵
glTranslated(0,-1,-5); //平移0,0,-5向Z负方向平移5个单位
glPushMatrix(); //压缩矩阵,设定光源的位置
glDisable(GL_LIGHTING);
glRotatef(yRot, 0, 1, 0); //光源的旋转
glTranslatef(light_change[0],light_change[1],light_change[2]); //光源的位置 6
计算机图形学实验报告03
glTranslatef(light_position1[0], light_position1[1],light_position1[2]); //光源位置 glutSolidSphere(0.1, 4,4);//利用库函数绘制一个半径为1的球体。表示光源在这里 glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_POSITION, light_position1);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse1);
glPopMatrix(); //光源设置完毕
glPushMatrix(); //压缩矩阵,设定光源的位置
glDisable(GL_LIGHTING);
glRotatef(yRot, 0, 1, 0); //光源的旋转
glTranslatef(-3,3,-1); //光源的位置
glTranslatef(light_position2[0], light_position2[1],light_position2[2]); //光源位置 glutSolidSphere(0.1, 4,4);//利用库函数绘制一个半径为1的球体。表示光源在这里 glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT1, GL_POSITION, light_position2);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse2);
glPopMatrix(); //光源设置完毕
glPushMatrix(); //压缩矩阵,设定光源的位置
glDisable(GL_LIGHTING);
glRotatef(yRot, 0, 1, 0); //光源的旋转
glTranslatef(3,-3,1); //光源的位置
glTranslatef(light_position3[0], light_position3[1],light_position3[2]); //光源位置 glutSolidSphere(0.1, 4,4);//利用库函数绘制一个半径为1的球体。表示光源在这里 glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT1, GL_POSITION, light_position3);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse3);
glPopMatrix(); //光源设置完毕
glPushMatrix(); //压入变换矩阵那
glBegin(GL_QUADS);
// 前面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的左下
glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的右下
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上
//后面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右下
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的右上
glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的左上
7
计算机图形学实验报告03
glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左下
// 顶面
glColor3f(1,1,1);
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上 glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下 glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下 glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上
// 底面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右上 glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左上 glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下 glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的右下
// 右面
glColor3f(1,1,1);
glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的右下 glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上 glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上 glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下
// 左面
glColor3f(1,1,1);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的左下 glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的右下 glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的右上 glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上
glEnd();
glPopMatrix(); //弹出矩阵。
glutSwapBuffers(); //交换缓冲区。显示图形}
六.实验收获
8