OpenGL上机实验全
opengl实验报告

opengl实验报告OpenGL实验报告引言:OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,被广泛应用于计算机图形学、游戏开发和科学可视化等领域。
本实验报告将介绍我对OpenGL的实验研究和学习成果。
一、实验目的本次实验的主要目的是掌握OpenGL的基本概念和使用方法,了解图形渲染的原理和过程,以及学习如何在OpenGL中创建和操作图形对象。
二、实验环境本次实验使用的是OpenGL的最新版本,并在Windows操作系统下进行开发。
使用的开发工具是Visual Studio和OpenGL的开发库。
三、实验过程1. 熟悉OpenGL的基本概念在开始实验之前,我先学习了OpenGL的基本概念,包括OpenGL的坐标系统、图形渲染管线、着色器等。
了解这些概念对于后续的实验非常重要。
2. 创建窗口和上下文在OpenGL中,我们需要先创建一个窗口和一个OpenGL上下文,以便进行图形渲染。
通过调用相关的OpenGL函数,我成功创建了一个窗口,并初始化了OpenGL的上下文。
3. 绘制基本图形接下来,我开始尝试绘制一些基本的图形,比如点、线和三角形。
通过设置顶点坐标和颜色,我成功绘制出了这些基本图形,并在窗口中显示出来。
4. 添加纹理为了使图形更加逼真和丰富,我学习了如何在OpenGL中添加纹理。
通过加载图片并设置纹理坐标,我成功将纹理贴在了绘制的图形上,使其具有了更加真实的效果。
5. 光照和阴影效果为了增加图形的立体感和真实感,我学习了如何在OpenGL中添加光照和阴影效果。
通过设置光源的位置和属性,以及材质的属性,我成功实现了光照和阴影的效果,使图形看起来更加逼真。
6. 动画效果为了使图形具有动态效果,我学习了如何在OpenGL中实现简单的动画效果。
通过每帧更新顶点的位置和纹理坐标,我成功实现了图形的旋转和平移动画,使其具有了动态的效果。
四、实验结果和分析通过以上的实验过程,我成功掌握了OpenGL的基本概念和使用方法,并实现了一些基本的图形渲染效果。
OpenGL上机报告

目录实验一中点算法 (2)一、实验目的和要求 (2)二、主要算法描述 (2)三、代码实现 (4)四、实验结果 (7)实验二Bezier曲线画茶壶 (11)一、实验目的和要求 (11)二、主要算法描述 (11)三、代码实现 (12)四、实验结果 (15)心得体会: (16)实验一 中点算法一、实验目的和要求学习使用OpenGL ,初步了解基本的OpenGL 编程方法。
熟练掌握中点算法,知道如何运用中点算法编程绘制直线、椭圆和圆。
编制中点画圆程序,上机实现在给定条件下下用中点算法画出圆形。
二、主要算法描述试验设计思路:圆是一个八分对称的图形,因此在计算圆上像素点的坐标时,可以只计算八分之一个圆,再依照对称原理算出其他七段的像素点(如下图)。
设圆方程的隐函数表示为 类似于中点法绘制直线的原理,我们将平面点划分为圆内和圆外(如下图):圆弧外的点:F(X ,Y)>0;圆弧内的点:F(X ,Y)<0;),(222=-+=R y x y x F假设在),(i i y x 绘制了一个像素,则下一步必须确定像素位置是),1(i i y x +还是)1,1(-+i i y x 更接近圆。
一次由两个点的中点决定,若中点)21,1(-+i i y x 在圆内,则说明)1,1(-+i i y x 更接近圆,否则说明),1(i i y x +更接近圆(如下图)。
为了在计算中避开计算圆的方程时会遇到的平方与开方,故运用迭代方法由式1211++=++i i i x p p 与111212+++-++=i i i i y x p p 计算决定参数。
试验编程思路:1. 输入圆半径r 和圆心),(c c y x ,并得到圆周(圆心在原点)上的第一个点:),0(),(00r y x =2. 计算决策参数的初值:r p -=103. 在每个k x 位置,从0=k 开始,完成下列测试:加入0<k p ,圆心在原点的下一个点位),(1k k y x +,并且1211++=++k k k x p p否则,圆的下一个点是)1,1(-+k k y x ,并且111212+++-++=k k k k y x p p其中11+=+k k x x 且11-=+k k y y4.确定其他七个八分圆中的对称点。
OpenGl实验报告

计算机图形学综合实验报告烟台大学计算机学院软件工程专业班级:计103-3学号:201058503334姓名:公茂华指导教师:孔繁茹完成日期:2012.11.10综合试验:太阳系模型一、实验目的与要求1、学习和掌握OpenGL的使用2、掌握矩阵堆栈的实现方法3、根据自己的创意实现实验内容,进一步掌握和理解OpenGL的使用二、实验内容1、请编写地球围绕太阳自动旋转的方式2、请再加上一个月亮, 并围绕地球旋转,并添加轨道3、实现用户通过键盘或鼠标加入或减少行星和卫星三、实验结果1、开始运行2、增加地球和月亮(按键L或l)或其他任意行星及其若干卫星3、按照提示用鼠标和键盘增加或减少行星和卫星转换视角:4、异常提示:要将Color.txt文件放到当前文件夹下四、体会通过本次试验的实践,使我更加了解和初步掌握了OpenGL的用法,对使用OpenGl绘制球体等图形有了充分认识,并对平移矩阵堆栈和旋转矩阵堆栈的使用有了初步的掌握。
虽然以前没有接触过OpenGl,但是通过学习计算机图形学这门课程的知识,以及通过多次上机实验,已使我对OpenGL有了一定了解,不过具体使用和其它方面还需要进一步理解和学习。
最后,感谢老师的悉心指导。
五、源程序注:红色注释为新加#include <windows.h>#include <gl/glut.h>#include <stdlib.h>#include <stdio.h>#include <math.h>static float fE = 0.0f; //绕太阳或行星旋转的角度static int i=0, j=0, m; //for循环计数static GLint x=7, y=3; //转换视角,以太阳为中心static int a[8]; //计数第几颗行星的卫星的数量static bool lag = false; //键盘L(l)增加行星的标志,true为增加int k[8][3]; //读取文件数据FILE *fp;void Initial(){glEnable(GL_DEPTH_TEST); //启用深度测试glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色}void Change(int w, int h){glViewport(0, 0, (GLsizei) w, (GLsizei) h);//设置视区尺寸glMatrixMode(GL_PROJECTION); //指定当前操作投影矩阵堆栈glLoadIdentity(); //重置投影矩阵GLfloat fAspect;fAspect = (float)w/(float)h;gluPerspective(45, fAspect, 1.0, 600.0);//设置透视投影矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void Satellite() //增加卫星{for (int n=0; n< a[i]; n++){glPushMatrix();glRotatef(30.0f+6*n, 0.0f, 0.0f, 1.0f); //绕z轴旋转30度glRotatef(fE*10*(3*n+1), 0.0f, 1.0f, 0.0f); //公转速度fE*10*(3*n+1)glTranslated(-5.0f*m, 1.0f, 0.0f);glColor3f(256.0f, 256.0f, 0.0f);glutWireSphere(1.0f, 20, 20); //卫星glColor3f(0.0f, 0.0f, 0.0f);glPopMatrix();}}void Planet() //增加行星{if (lag==true) //键盘L(l)增加行星i=j-1;elsei=0;for (;i<j;i++){if (i<5){if (i==3)m=1.9;//模拟火星elsem=i+1;}elsem=9-i;glPushMatrix(); //保存当前的模型视图矩阵glColor3f(0,0,9);glutWireTorus(20.0f*(i+1), 0, 100, 1); //轨道glRotatef(fE*(9-i), 0.0f, 1.0f, 0.0f); //绕y轴旋转一定的角度glTranslated(20.0f*(i+1), 0.0f, 0.0f); //平移一段距离glColor3f(k[i][0], k[i][1], k[i][2]);glutWireSphere(2.0f*m, 20, 20); //行星glColor3f(0.0f, 0.0f, 0.0f);Satellite();glPopMatrix();}}void Display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//将缓存清除为预先的设置值glMatrixMode(GL_MODELVIEW); //指定当前矩阵glLoadIdentity(); //重置视图矩阵glTranslated(0.0f, 0.0f, -300.0f); //将图形沿z轴负方向移动glRotatef(60.0f, x, y, 0);glColor3f(1.0f, 0.0f, 0.0f);glutWireSphere(16.0f, 20, 20); //太阳半径glColor3f(0.0f, 0.0f, 0.0f);Planet();fE += 1.0f; //增加旋转步长if (fE > 360.0f)fE = 1.0f;glutSwapBuffers();}void Timer(int value){glutPostRedisplay();glutTimerFunc(100,Timer,1); //100毫秒后调用回调函数}void MouseMove(GLint xMouse, GLint yMouse)//以鼠标移动,变换视角{x=xMouse;y=yMouse;}void MousePlot(GLint button, GLint action, GLint xMouse, GLint yMouse){if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)//增加行星{// if (lag==true) //取消键盘L(l)增加的行星,取消的部分// {// lag=false;// a[j-1]=0;// j=-1;// }if (j<8 && lag == false)//最大数量限制{a[j]=0;j++;}}if (button == GLUT_RIGHT_BUTTON && action == GLUT_DOWN)//减少行星{if (lag==true) //取消键盘L(l)增加的行星{lag=false;a[j-1]=0;j=0;}if (j>0) //最少数量限制{j--;a[j] = 0;}}}void Keyboard(unsigned char key, int x, int y){switch(key){case 'q': //增加卫星if (a[0]<1) //最大限制a[0]++;break;case 'Q': //减少卫星if (a[0]>0) //最小限制a[0]--;break;case 'w':if (a[1]<2)a[1]++;break;case 'W':if (a[1]>0)a[1]--;break;case 'e':if (a[2]<5)a[2]++;break;case 'E':if (a[2]>0)a[2]--;break;case 'r':if (a[3]<7)a[3]++;break;case 'R':if (a[3]>0)a[3]--;break;case 'a':if (a[4]<8)a[4]++;break;case 'A':if (a[4]>0)a[4]--;break;case 's':if (a[5]<6)a[5]++;break;case 'S':if (a[5]>0)a[5]--;break;case 'd':if (a[6]<4)a[6]++;break;case 'D':if (a[6]>0)a[6]--;break;case 'f':if (a[7]<3)a[7]++;break;case 'F':if (a[7]>0)a[7]--;break;case 'l': // L(l)键case 'L':lag = true;printf("1、水星 2、金星 3、地球 4、火星 5、木星 6、土星 7、天王星 8、海王星\n");printf("请输入行星代号:");scanf("%d", &j);if(j<1 || j>8)exit(0);printf("请输入卫星数量(不小于0,不大于12):");scanf("%d", &a[j-1]);if(a[j-1]<0 || a[j-1]>12)//控制卫星数量exit(0);printf("转换视角时,按下鼠标不动!\n");break;case 27: //退出ESCexit(0);break;default:break;}}int main(int argc, char * argv[]){printf("太阳系模型按键操作:\n\t1、鼠标左键增加行星数量,右键减少行星数量;\n\t");printf("2、键盘q、w、e、r、a、s、d、f依次增加行星的卫星;\n\t");printf("3、键盘Q、W、E、R、A、S、D、F依次减少行星的卫星;\n\t");printf("4、键盘L(l)可以增加任意一个指定行星及其若干卫星;\n\t");printf("5、鼠标右键取消第4步操作!\n\t");printf("转换视角时,按下鼠标左键移动!\n");Sleep(2000);if (NULL == (fp = fopen("Color.txt", "r")))//读取颜色信息{printf("file not open or file not exist!\n");Sleep(1000);exit(0);}for(int q =0; q<8; q++)for (int ii=0; ii<3; ii++)fscanf(fp, "%d", &k[q][ii]);//fp文件指针fclose(fp);glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(1000, 700);glutInitWindowPosition(10, 10);glutCreateWindow("太阳系简单模型");glutReshapeFunc(Change);glutDisplayFunc(Display);glutKeyboardFunc(Keyboard);glutMouseFunc(MousePlot);glutMotionFunc(MouseMove);glutTimerFunc(500, Timer, 1);//制定定时器回调函数Initial();glutMainLoop();return 0;}。
OpenGL实验三

计算机学院12计算机科学与技术专业3班学号3112005883姓名:曲绍霖教师评定:实验三交互与运动的实现一、实验目的掌握OpenGL的纹理贴图绘制方法二、实验要求在Windows平台上用VC++结合GLUT做实验,要求掌握结合VC++和OpenGL的纹理模型的理解及实现,实验完成后要求根据自己的成果撰写一份实验报告。
三、实验环境操作系统:Windows xp开发环境:VC++6.0以及GLUT图形交互设备:鼠标和键盘四、实验内容在前面实验的基础上增加键盘和鼠标交互和物体的运动。
五、存在的问题和感想这次实验相对于前面的实验难度较大,要经过多次的调试才能通过,通过之后还不能达到理想的效果,但是经过我的认真学习关于纹理的知识,最后经过认真学习给的例子,最后还是顺利地做出了实验要求的效果。
实现代码:#include<windows.h>#include <stdlib.h>#include<stdio.h>#include <GL/glew.h>#include <GL/glut.h>//模式选择开关int iModel=1;//图形旋转方向开关int ispin=1;static GLfloat xRot = 0.0f; //x方向旋转参数static GLfloat yRot = 0.0f; //y方向旋转参数//初始化OpenGL绘制环境void init(void){glClearColor(1.0,1.0,1.0,0.0);//背景颜色为白色glEnable(GL_DEPTH_TEST);//这句是启用深度测试,这样,在后面的物体会被挡着glShadeModel(GL_SMOOTH);glEnable(GL_CULL_FACE);glFrontFace(GL_CCW);}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存glLoadIdentity();// 重置当前的模型观察矩阵gluLookAt(2.0,2.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);//设置图元描述的视角//设置正方体旋转并绘制glRotatef(xRot, 1.0f, 0.0f, 0.0f);glRotatef(yRot, 0.0f, 1.0f, 0.0f);glBegin(GL_QUADS);glColor3f(0.0f,1.0f,0.0f); // 颜色改为绿色glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右上顶点(顶面)glColor3f(1.0f,0.0f,0.0f); //颜色改为红色glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左上顶点(顶面)glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下顶点(顶面)glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下顶点(顶面)glColor3f(0.0f,1.0f,0.0f); // 颜色改为绿色glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右上顶点(底面)glColor3f(1.0f,0.0f,0.0f); //颜色改为红色glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左上顶点(底面)glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(底面)glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(底面)glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上顶点(前面)glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上顶点(前面)glColor3f(1.0f,0.0f,0.0f); //颜色改为红色glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左下顶点(前面)glColor3f(0.0f,1.0f,0.0f); // 颜色改为绿色glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右下顶点(前面)glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右上顶点(后面)glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左上顶点(后面)glColor3f(1.0f,0.0f,0.0f); //颜色改为红色glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左下顶点(后面)glColor3f(0.0f,1.0f,0.0f); // 颜色改为绿色glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右下顶点(后面)glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的右上顶点(左面)glColor3f(1.0f,0.0f,0.0f); //颜色改为红色glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左上顶点(左面)glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(左面)glColor3f(1.0f,0.0f,0.0f); //颜色改为红色glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的右下顶点(左面)glColor3f(0.0f,1.0f,0.0f); // 颜色改为绿色glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右上顶点(右面)glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上顶点(右面)glColor3f(0.0f,1.0f,0.0f); // 颜色改为绿色glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的左下顶点(右面)glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(右面)glEnd();//正方体绘制结束glFlush();//强制刷新glutSwapBuffers(); //双缓冲}//设窗口的坐标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();}//键盘控制void SpecialKeys(int key,int x,int y){//上下左右键控制正方体旋转if(iModel==2){if(key == GLUT_KEY_UP) xRot -= 5.0f;if(key == GLUT_KEY_DOWN) xRot += 5.0f;if(key == GLUT_KEY_LEFT) yRot -= 5.0f;if(key == GLUT_KEY_RIGHT) yRot += 5.0f;if(xRot > 356.0f) xRot = 0.0f;if(xRot < -1.0f) xRot = 355.0f;if(yRot > 356.0f) yRot = 0.0f;if(yRot < -1.0f) yRot = 355.0f;}glutPostRedisplay();}void keyboard(unsigned char key, int x, int y){switch (key){case 27: // 当按下键盘的esc键的时候退出exit(0);break;}}//鼠标控制旋转轴void mouse(int btn, int state, int x, int y){if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)ispin=~ispin;}//设置刷新时间void TimerFunction(int value){glutPostRedisplay();//设置自动旋转if(iModel==1){if(ispin==1){yRot+=10;if(yRot>=360)yRot-=360;}else{xRot+=10;if(xRot>=360)xRot-=360;}}glutTimerFunc(100,TimerFunction,1);}//菜单选项设置void nMenu(int value){switch(value){//1、2为旋转自动或手动case 1:iModel=1;xRot=0,yRot=0;ispin=1;break;case 2:iModel=2;xRot=0,yRot=0;ispin=1;break;}glutPostRedisplay();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowPosition(100, 100);glutInitWindowSize(800,600);// 设置窗口大小800*600glutCreateWindow("键盘鼠标交互下的正方体");//创建右键选择菜单int nRotatefMenu = glutCreateMenu(nMenu);glutAddMenuEntry("自动旋转",1); //创建图元描述菜单glutAddMenuEntry("手动旋转",2);int nMainMenu = glutCreateMenu(nMenu); //创建主菜单glutAddSubMenu("旋转", nRotatefMenu);glutAttachMenu(GLUT_RIGHT_BUTTON);glutTimerFunc(100,TimerFunction,1);init();glutSpecialFunc(SpecialKeys);glutKeyboardFunc(keyboard);glutMouseFunc (mouse);glutDisplayFunc(myDisplay);glutReshapeFunc(reshape);glutMainLoop();return 0;}运行结果:鼠标右键菜单选择旋转模式自动旋转鼠标左键控制旋转轴(左图)手动旋转键盘控制旋转方向(右图)。
OpenGL上机实验全

OpenGL上机实验全⽬录1 OpenGL的基本框架1.1 OpenGL简介 (1)1.2 OpenGL的⼯作⽅式 (2)1.3 OpenGL的操作步骤 (3)1.4 OpenGL的组成 (3)1.5 OpenGL的数据类型 (4)1.6 OpenGL函数命名约定 (4)1.7 ⽤OpenGL绘制图形 (4)1.8 ⽤OpenGL制作动画 (9)2 图形的绘制2.1 空间点的绘制 (13)2.2 直线的绘制 (14)2.3多边形⾯的绘制 (18)2.4平⾯多⾯体的绘制 (24)3 图形变换3.1OpenGL中的变换 (30)3.2模型视图矩阵 (31)3.3 矩阵堆栈 (35)4 OpenGL中的颜⾊、光照和材质4.1 颜⾊ (42)4.2 光照模型 (42)4.3 材质属性 (43)4.4 使⽤光照 (43)4.5 使⽤光源 (48)附录:参考函数1.1 颜⾊使⽤ (58)1.2 绘制⼏何图元 (59)1.3 坐标转换 (63)1.4 堆栈操作 (66)1.5 使⽤光照和材质 (68)1.6 帧缓存操作 (72)1.7 查询函数 (72)1.8 窗⼝初始化和启动事件处理 (75)1.9 窗⼝管理 (77)1.10 菜单管理 (80)1.11 注册回调函数 (82)1.12 ⼏何图形绘制 (84)1OpenGL的基本框架1.1OpenGL简介在计算机发展初期,⼈们就开始从事计算机图形的开发,但直到20世纪80年代末90年代初,三维图形才开始迅速发展。
于是各种三维图形⼯具软件包相继推出,如GL,RenderMan等,但没有⼀种软件包能够在三维图形建模能⼒和编程⽅便程度上与OpenGL相⽐拟。
OpenGL(Open Graphics Library,开放图形库),是⼀个三维的计算机图形和模型库,它源于SGI公司为其图形⼯作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。
SGI公司在1992年6⽉发布1.0版,后成为⼯业标准。
Opengl 新手实验 指导3

实验学时:18学时实验要求:必做实验性质:综合、设计实验类别:专业一.实验目的二.实验环境三.实验内容和要求四.实验指导1. 利用键盘控制场景漫游 2.纹理映射3. MD2模型1.掌握并学会利用OpenGL开发场景漫游程序的编程方法。
2.掌握并学会利用OpenGL纹理映射的方法。
3.了解MD2三维模型的文件格式,熟悉并学会读取模型、加载到场景中的方法。
4.在项目实践开发过程中,逐步培养综合开发能力、科研钻研能力和创新能力。
二.实验环境:硬件环境:P4 CPU 2.0以上PC机,512M以上内存。
软件环境:Windows XP,Visual C++ 6.0,OpenGL图形软件包,GLUT开发包。
三.实验内容和要求:设计一个OpenGL程序,创建一个三维迷宫,支持替身通过一定交互手段在迷宫中漫游。
基本功能包括:1、迷宫应当至少包含10 * 10 个Cell,不能过于简单,下图给出一种示例。
2、读取给定的替身模型,加载到场景中。
3、键盘方向键控制替身转向与漫游。
4、有碰撞检测,替身不应当穿墙。
5、支持切换第一视角和第三视角进行观察。
6、迷宫场景中的墙、地面等应贴上纹理。
扩展功能包括(至少选择一个):1.同时加入二维辅助地图,替身在三维迷宫探索的同时,在小地图中显示已经探索的区域;2.在俯视状态下,可以通过鼠标点选替身需要到达的目的地,通过寻径算法,控制替身自动到达目的地;3.迷宫地图交互编辑功能,例如,可以设计一个二维地图编辑器,根据用户的绘制,拉伸得到三维迷宫场景;4.其他相当难度,可以增加迷宫游戏趣味性的功能(需要通过指导老师认可)完成一份实验报告,说明你所实现的一个扩展功能。
四.实验指导(一)利用键盘控制场景漫游:让我们看一个比较好的使用键盘控制的例子。
这一小节我们将建立一个应用程序。
这个程序绘制了一个小的居住着雪人的世界。
并且我们将用方向键来移动照相机(即移动视点在场景中漫游)。
左右方向键,将照相机绕y轴旋转,上下方向键,将照相机前后方向移动。
opengl学习指导实验 计算机图形学上机

计算机图形学实验指导书计算机科学与信息工程学院目录实验一OpenGL程序设计 (3)实验二二维基本图元的生成 (7)实验三二维图元的填充 (13)实验四二维图形的几何变换 (18)实验五裁剪 (23)实验六自由曲线 (26)实验七造型技术 (27)实验八交互式技术 (32)实验九真实感图形的绘制 (37)计算机图形学实验指导一、实验目的1、培养学生动手编程解决实际问题的能力。
2、训练学生分析问题和调试程序的能力。
3、锻炼学生撰写科技实验论文的能力。
二、实验要求1、问题分析充分地分析和理解问题本身,弄清要求做什么,用什么算法。
2、程序设计(1)根据所采用的算法,设计数据结构,画出流程图并编程。
(2)最后准备调试程序的数据及测试方案。
3、上机调试(1)对程序进行编译,纠正程序中可能出现的语法错误。
(2)调试前,先运行一遍程序看看究竟将会发生什么。
(3)如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观察窗输出中间变量值等手段。
4、整理实习报告三、实验报告1、实验内容:采用的算法名称2、问题描述:包括目标、任务、条件约束描述等。
3、设计:数据结构设计和核心算法设计。
主要功能模块的输入,处理(算法框架)和输出。
4、测试范例:测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。
5、心得:包括程序的改进设想,经验和体会。
6、程序清单:源程序,其中包括变量说明及详细的注释。
实验一OpenGL程序设计一、实验学时2学时二、实验类型学习型实验三、实验目的和要求初步了解OpenGL程序设计结构;了解OpenGL的基本数据类型、核心函数及辅助函数的使用。
四、实验内容1、综述这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。
OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。
实验七 OpenGL光照效果

1.实验七OpenGL光照效果(选做)1.实验七:OpenGL光照效果。
2.实验目的:通过上机编程,熟悉并掌握OpenGL中光照效果的制造方法。
3.实验要求:(1)先做实验项目:实验六“OpenGL组合图形”。
(2)每人一组,独立完成。
(3)利用OpenGL提供的颜色、光源、材质设置,对实验六“OpenGL组合图形”中自己设计的物体设置绘制颜色和材质参数,并在场景中添加光源,形成一定的光照明暗效果。
4.实验原理及内容:在现实世界中,光线和物体的材质共同决定了物体在人眼中的效果。
OpenGL 中则涉及到绘制颜色、物体的材质参数、场景中的光源颜色和位置,以此达到一定的真实感光照效果。
(1)颜色:OpenGL通过指定红、绿、蓝(RGB)三个成分的各自亮度来确定颜色,有时还有第四个成分alpha:glColor*(red, green, blue[, alpha]);glColor()函数设置当前的绘图颜色,red、green和blue分别为红、绿、蓝的亮度,alpha为透明度,取值均为0.0~1.0。
在该函数之后绘制的所有物体都将使用该颜色。
(2)光线:OpenGL的光照模型中将光源分成四种:发射光:一个物体本身就是一个发光源,如太阳、电灯等,这种光不受其它任何光源的影响。
环境光:从光源出发后光线被环境多次反射,以致没有明确的方向,或者说来自于所有的方向。
被环境光照射的物体,各个表面都均等受光。
散射光:来自于某个方向,被物体表面均匀地反射,例如荧光照明、窗口射入的阳光等。
镜面光:来自于一个方向,被物体强烈地反射到另一个特定的方向。
高亮度的镜面光往往能在被照射的物体表面产生亮斑,如金属球上的高光区。
对于散射光和镜面光,入射角度、距离和衰减因子还会影响到最终的光照效果。
除了物体本身的发射光以外,通常意义上的光并不会是单纯的环境光、散射光或镜面光,而是由这三种类型的光混合组成的。
在OpenGL中,光也是采用RGBA值来定义的,分别描述光线中红绿蓝各成分的相对亮度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1 OpenGL的基本框架
1.1 OpenGL简介 (1)
1.2 OpenGL的工作方式 (2)
1.3 OpenGL的操作步骤 (3)
1.4 OpenGL的组成 (3)
1.5 OpenGL的数据类型 (4)
1.6 OpenGL函数命名约定 (4)
1.7 用OpenGL绘制图形 (4)
1.8 用OpenGL制作动画 (9)
2 图形的绘制
2.1 空间点的绘制 (13)
2.2 直线的绘制 (14)
2.3多边形面的绘制 (18)
2.4平面多面体的绘制 (24)
3 图形变换
3.1OpenGL中的变换 (30)
3.2模型视图矩阵 (31)
3.3 矩阵堆栈 (35)
4 OpenGL中的颜色、光照和材质
4.1 颜色 (42)
4.2 光照模型 (42)
4.3 材质属性 (43)
4.4 使用光照 (43)
4.5 使用光源 (48)
附录:参考函数
1.1 颜色使用 (58)
1.2 绘制几何图元 (59)
1.3 坐标转换 (63)
1.4 堆栈操作 (66)
1.5 使用光照和材质 (68)
1.6 帧缓存操作 (72)
1.7 查询函数 (72)
1.8 窗口初始化和启动事件处理 (75)
1.9 窗口管理 (77)
1.10 菜单管理 (80)
1.11 注册回调函数 (82)
1.12 几何图形绘制 (84)
1OpenGL的基本框架
1.1OpenGL简介
在计算机发展初期,人们就开始从事计算机图形的开发,但直到20世纪80年代末90年代初,三维图形才开始迅速发展。
于是各种三维图形工具软件包相继推出,如GL,RenderMan等,但没有一种软件包能够在三维图形建模能力和编程方便程度上与OpenGL相比拟。
OpenGL(Open Graphics Library,开放图形库),是一个三维的计算机图形和模型库,它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。
SGI公司在1992年6月发布1.0版,后成为工业标准。
目前,OpenGL标准由1992年成立的独立财团OpenGL Architecture Review Board(ARB)以投票方式产生,并制成规范文档公布,各软硬件厂商据此开发自己系统上的实现。
目前最新版规范是1999年5月通过的1.2.1。
OpenGL作为一个性能优越的图形应用程序设计界面(API),它独立于硬件和窗口系统,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库。
OpenGL在军事、广播电视、CAD/CAM/CAE、娱乐、艺术造型、医疗影像、虚拟世界等领域都有着广泛的应用。
它具有以下功能。
1. 模型绘制
OpenGL能够绘制点、线和多边形。
应用这些基本的形体,可以构造出几乎所有的三维模型。
OpenGL通常用模型的多边形的顶点来描述三维模型。
2. 模型观察
在建立了三维景物模型后,就需要用OpenGL描述如何观察所建立的三维模型。
观察三维模型是通过一系列的坐标变换进行的。
模型的坐标变换在使观察者能够在视点位置观察与视点相适应的三维模型景观。
在整个三维模型的观察过程中,投影变换的类型决定观察三维模型的观察方式,不同的投影变换得到的三维模型的景象也是不同的。
最后的视窗变换则对模型的景象进行裁剪缩放,即决定整个三维模型在屏幕上的图象。
3. 颜色模式的指定
OpenGL应用了一些专门的函数来指定三维模型的颜色。
程序开发者可以选择二个颜色模式,即RGBA模式和颜色表模式。
在RGBA模式中,颜色直接由RGB值来指定;在颜色表模式中,颜色值则由颜色表中的一个颜色索引值来指定。
开发者还可以选择平面着色和光滑着色二种着色方式对整个三维景观进行着色。
4. 光照应用
用OpenGL绘制的三维模型必须加上光照才能更加与客观物体相似。
OpenGL提供了管理四种光(辐射光、环境光、镜面光和漫射光)的方法,另外还可以指定模型表面的反射特性。
5. 图象效果增强
OpenGL提供了一系列的增强三维景观的图象效果的函数,这些函数通过反走样、混合和雾化来增强图象的效果。
反走样用于改善图象中线段图形的锯齿而更平滑,混合用于处理模型的半透明效果,雾使得影像从视点到远处逐渐褪色,更接近于真实。
6. 位图和图象处理
OpenGL还提供了专门对位图和图象进行操作的函数。
7. 纹理映射
三维景物因缺少景物的具体细节而显得不够真实,为了更加逼真地表现三维景物,OpenGL提供了纹理映射的功能。
OpenGL提供的一系列纹理映射函数使得开发者可以十分方便地把真实图象贴到景物的多边形上,从而可以在视窗内绘制逼真的三维景观。
8. 实时动画
为了获得平滑的动画效果,需要先在内存中生成下一幅图象,然后把已经生成的图象从内存拷贝到屏幕上,这就是OpenGL的双缓存技术(double buffer)。
OpenGL提供了双缓存技术的一系列函数。
9. 交互技术
目前有许多图形应用需要人机交互,OpenGL提供了方便的三维图形人机交互接口,用户可以选择修改三维景观中的物体。
1.2OpenGL的工作方式
1.2.1 OpenGL的体系结构
OpenGL是一套图形标准,它严格按照计算机图形学原理设计而成,符合光学和视觉原理,非常适合可视化仿真系统。
由于OpenGL是一种API,其中不包含任何窗口管理、用户交互或文件I/O函数。
每个主机环境(如Microsoft Windows)在这些方面都有自己的函数,由这些函数负责实现某些方法,以便把窗口或位图的绘制控制权移交给OpenGL。
通常,一个完整的窗口系统的OpenGL图形处理系统的结构如图1.1所示:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件。
应用软件
OpenGL
窗口系统
操作系统
图形硬件
图1.1 OpenGL图形处理系统的层次结构
OpenGL在Windows NT上的实现是基于客户机/服务器模式的,应用程序发出OpenGL 命令,由动态链接库OpenGL32.DLL接受和打包后,发送到服务器端的WINSRV.DLL,然后由它通过DDI(Device Driver Interface,设备驱动程序接口)层发往视频显示驱动程序。
如果系统安装了硬件加速器,则由硬件相关的DDI来处理。
OpenGL/NT的体系结构图如图1.2所示。
图1.2 OpenGL/NT体系结构
1.2.2 OpenGL的流水线。