计算机图形学
实 验 报 告 书
姓名: 班级:
学号:
中南大学软件学院
二0一一年六月
一.实验的任务、性质与目的
计算机图形学是软件工程专业的一门专业技术课程。计算机图形学应用于生产、工程、文化和艺术等领域,该课程对于培养和提高学生的算法设计和实现能力具有非常重要的意义。 该课程以培养学生算法设计与实现的能力为目标,通过课堂教学和实验,使学生了解、掌握计算机图形学的基本知识和关键技术、了解和熟悉计算机图形学的方法、工具和环境。
二.基本原理
实验主要基于如下知识和内容:
1. 实验环境配置、基本图元绘制;
2. 绘制抛物线和正弦曲线; 3. 图形变换;
4. 颜色和光照,绘制旋转抛物面; 5. 显示列表;
6. 纹理映射;
7. 复杂图形绘制,绘制Bezier曲线,Hermite曲线; 8. 复杂图形绘制,绘制Bezier曲面。
三.实验选题与基本要求
1、实验环境配置、基本图元绘制
配置基本实验环境、安装软件包、建立工程和绘制基本图元,要求学会点、线、三角形、四边形的绘制方法,学会消息传递和响应机制,用一个实例完成上述要求。 2、绘制抛物线和正弦曲线
计算抛物线和正弦曲线,将结果存放在一个数组中,再用OpenGL函数绘制相应的图形。 3、图形变换
要求学会投影、视口变换、旋转、平移和缩放的编程方法,用一个实例完成上述要求。 4颜色和光照
要求学会光源设置、材质设置和法向量设置,用一个实例(如旋转抛物面)完成上述要求。 5、显示列表
要求学会用显示列表输出文字和图形,用一个实例完成上述要求。 6、纹理映射
要求学会将纹理图像映射到物体表面,用一个实例完成上述要求。 7、复杂图形绘制
要求学会Bezier曲线和Hermite曲线的绘制方法。 8、复杂图形绘制
绘制Bezier曲面,要求设置光源、材质和法向量,并进行纹理映射,用键盘控制是否进行纹理映射。
四.实验内容和步骤
1、实验环境配置、基本图元绘制
配置基本实验环境、安装软件包、建立工程和绘制基本图元,要求学会点、线、三角形、四边形的绘制方法,学会消息传递和响应机制,用一个实例完成上述要求。 步骤:
基本实验环境:Win 7
实验工具:Microsoft visual C++ 6.0 , Visual Assist X 10.1.1626 实验实例: 画线:
#include
static float rotAngle = 0.; void init(void) {
GLfloat values[2];
glGetFloatv (GL_LINE_WIDTH_GRANULARITY, values);
printf (\ value is %3.1f\\n\
glGetFloatv (GL_LINE_WIDTH_RANGE, values);
printf (\ values[0], values[1]);
glEnable (GL_LINE_SMOOTH); glEnable (GL_BLEND); }
void display(void) { glClear(GL_COLOR_BUFFER_BIT);//清除缓存
glColor3f (1.0, 1.0, 1.0); //设置颜色为白色
glPushMatrix();
glRotatef(-rotAngle, 0.0, 0.0, 0.1);
glBegin (GL_LINES); //开始画线
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE); glLineWidth (1.5);
glClearColor(0.0, 0.0, 0.0, 0.0); //将背景设置为黑色
glVertex2f (-0.5, 0.5); //设置第一根线的两个端点 glVertex2f (0.5, -0.5); glEnd (); //画线结束
glPopMatrix();
glColor3f (2.0, 0.0, 0.0); //设置颜色为红色
glPushMatrix();
glRotatef(rotAngle, 0.0, 0.0, 0.1);
glBegin (GL_LINES); //开始画线
glVertex2f (0.5, 0.5); //设置第二个点的两个端点 glVertex2f (-0.5, -0.5);
glEnd (); //第二次画线结束 glPopMatrix(); //绘图结束
glFlush();
}
void reshape(int w, int h) //重绘方法 {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
if (w <= h) //改变角度,设置旋转方案
gluOrtho2D (-1.0, 1.0,
-1.0*(GLfloat)h/(GLfloat)w, 1.0*(GLfloat)h/(GLfloat)w); else
gluOrtho2D (-1.0*(GLfloat)w/(GLfloat)h, 1.0*(GLfloat)w/(GLfloat)h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
void keyboard(unsigned char key, int x, int y) //键盘响应机制 {
switch (key) { case 'r':
case 'R':
rotAngle += 20.;
if (rotAngle >= 360.) rotAngle = 0.; glutPostRedisplay();
break;
case 27: /* Escape Key */ exit(0);
break; default: break; } }
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); //初始化显示模式 glutInitWindowSize (200, 200); //初始化窗口大小 glutCreateWindow (argv[0]); //新建窗口 init();
glutReshapeFunc (reshape);
glutKeyboardFunc (keyboard);
glutDisplayFunc (display); //运行display过程 glutMainLoop(); return 0; }
2、绘制抛物线和正弦曲线
计算抛物线和正弦曲线,将结果存放在一个数组中,再用OpenGL函数绘制相应的图形。 抛物线:
//该程序的功能是绘制二次函数和三次函数 #include
GLfloat x;
glClear(GL_COLOR_BUFFER_BIT);