科 技 学 院
课程设计(综合实验)报告
( 2013 -- 2014 年度第 2 学期) 实验名称 OpenGL基本图元绘制实验
课程名称 计算机图形学
专业班级:计算机11K1 学生姓名:曲强
学 号:111909010118 成 绩:
指导教师:姜丽梅 实验日期:2014.6.5
| |
实验一、OpenGL基本图元绘制实验
一、 实验目的及要求
1. 掌握计算机图形学及交互式计算机图形学的定义,了解OpenGL的功能及工作流
程,掌握基于OpenGL Glut库的程序框架。
2. 掌握基本的二维线画图元的绘制算法及属性,掌握OpenGL基本图元的绘制。 3. 理解二维、三维图形的绘制流程,掌握二维图形和三维图形的图形变换。 4. 了解形体的真实感表示的内容,包括消隐技术、简单光照明模型、多边形的明暗
绘制技术以及纹理映射技术。
5. 要求使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序实现基本图
元绘制。
6. 要求对绘制的简单场景综合利用几何变换或gluLookAt函数实现交互式三维观
察程序。
二、 实验内容
在两个具有不同属性的窗口中分别显示一个旋转的三角形来演示单缓存和双缓存,在旋转过程中不断改变图形的颜色,利用鼠标或菜单可终止/启动图形旋转。明确程序包括哪些函数,各个函数的功能以及整个流程,从而为进一步做综合性的图形绘制实验奠定基础。
三、 所用仪器、设备
Windows XP系统,Visual C++,OpenGL及GLUT库
四、 实验方法与步骤
先配置环境,把相关文件放到相应的文件夹
C:\\Program Files\\Microsoft Visual Studio\\VC98\\Include\\GL
C:\\WINDOWS\\system32
C:\\Program Files\\Microsoft Visual Studio\\VC98\\Lib
再通过VC++进行编译
五、 程序代码
#include
#include
#define DEG_TO_RAD 0.017453 static GLfloat theta = 0.0;
GLfloat r = 1.0; //设置三角形的初始颜色 GLfloat g = 0.0; GLfloat b = 0.0; int singleb,doubleb; void display(void)
{ glClear(GL_COLOR_BUFFER_BIT); //三角形颜色渐变
glColor3f(r, g,b);
r = r - 0.002;
g = g + 0.002; b = b + 0.001; if(r < 0.001) { r = 1.0; g = 0.0; b = 0.0;
}
glBegin(GL_POLYGON);
glVertex2f(cos(DEG_TO_RAD*theta), sin(DEG_TO_RAD*theta)); glVertex2f(cos(DEG_TO_RAD*(theta+120)),
sin(DEG_TO_RAD*(theta+120)));
glVertex2f(cos(DEG_TO_RAD*(theta+240)),
sin(DEG_TO_RAD*(theta+240)));
glEnd();
glutSwapBuffers();
}
void spinDisplay (void) //三角形转动弧度设置 {
theta = theta +5; if (theta > 360.0)
theta = theta - 360.0;
glutSetWindow(singleb);
glutPostWindowRedisplay(singleb); glutSetWindow(doubleb);
glutPostWindowRedisplay(doubleb);
}
void spinDisplay1(void) {
glutPostRedisplay(); }
void myReshape(int w, int h) {
glViewport(0, 0, w, h); //指定平面上一个矩形裁剪区域, glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h)
gluOrtho2D(-1.,1.,-1.*(GLfloat)h/(GLfloat)w,1.*(GLfloat)h/(GLfloat)w); else 1.);
}
void mouse(int button,int state,int x,int y) //鼠标定义 { switch(button) {case GLUT_LEFT_BUTTON:
if(state == GLUT_DOWN )
glutIdleFunc(spinDisplay1);
gluOrtho2D(-1.*(GLfloat)w/(GLfloat)h, 1.*(GLfloat)w/(GLfloat)h, -1.,
{ }
break; } }
void main(int argc, char** argv) //主函数 {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); case GLUT_RIGHT_BUTTON: if(state == GLUT_DOWN) glutIdleFunc(spinDisplay); break; default: break;
相关推荐: