1计算机图形学实验指导书信电工程学院计算机科学与技术教研室2目录实验一OpenGL中的建模与变换.................................................................................1实验二OpenGL中的光照..............................................................................................4实验三OpenGL中的拾取.............................................................................................7实验四OpenGL中的纹理映射...................................................................................101实验一OpenGL中的建模与变换一、实验目的1.学习配置OpenGL环境。2.掌握在OpenGL中指定几何模型的方法。3.掌握OpenGL中的透视投影和正投影的设置方法,学会诊断投影问题导致的显示异常。二、实验环境⒈硬件:每个学生需配备计算机一台。⒉软件:VisualC++;三、实验内容1.建立OpenGL编程环境(注:Windows自带gl和glu,还需要安装glut库文件。)(a)查看Windows自带的OpenGL文件。在文件夹c:\windows\system32下查看是否存在文件opengl32.dll和glu32.dll;在VisualStudio的安装目录Vc7\PlatformSDK\Include\gl下查看是否存在gl.h和glu.h;在Vc7\PlatformSDK\Lib下是否存在opengl32.lib和glu32.lib。(b)安装glut库。将文件glut.h复制到VisualStudio的安装目录Vc7\PlatformSDK\Include\gl下;将文件glut32.lib复制到Vc7\PlatformSDK\Lib下;将文件glut32.dll复制到c:\windows\system32下。2.OpenGL几何建模(a)建立基本的几何图元,指定图元的颜色,对图元进行平移、旋转、缩放变换。基本几何图元包括:GL_LINES(线)、GL_LINE_STRIP(线带)、GL_LINE_LOOP(线环)、GL_TRIANGLES(三角形)、GL_TRIANGLE_STRIP(三角形带)、GL_TRIANGLE_FAN(三角形扇)、GL_QUADS(四边形)、GL_QUAD_STRIP(四边形带)、GL_POLYGON(多边形)。(b)设置合适的投影参数,分别用透视投影和正投影显示步骤(a)中指定的几何图元。(c)每按下鼠标左键一次,模型向右旋转一定角度。(d)按下ESC键,退出程序。2四、程序设计提示1.main函数功能:创建窗口;注册回调函数;主循环。intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow(”OpenGL中的建模与变换”);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMouseFunc(mouseFunc);glutMainLoop();return0;}2.初始化函数:功能:设置清除所用的颜色;指定着色模型。voidinit(void){}3.键盘响应函数:功能:按下ESC键时退出程序。voidkeyboard(unsignedcharkey,intx,inty){}4.鼠标响应函数功能:按下鼠标左键时,改变旋转角度(或平移量、缩放系数)。voidmouseFunc(intbutton,intstate,intx,inty){}5.显示函数:功能:指定几何模型;指定颜色;进行模型变换。3voiddisplay(void){//清除颜色缓存//指定颜色//模型变换//指定模型//马上执行}6.reshape函数功能:设置视口;窗口大小改变时,改变视域体,使窗口的宽高比与视域体的宽高比保持一致。voidreshape(intw,inth){}7.包含头文件,定义全局变量#includestdlib.h#includeGL/glut.hGLdoubleangle=0.0;GLdoubletranslation=0.0;GLdoublescale=1.0;五、思考题1.在reshape函数中,窗口改变时如果不同时改变视域体的宽高比,会产生什么效果?2.近裁剪面与物体相交时,会产生什么效果?六、报告要求1.认真书写实验报告,字迹清晰,格式规范。报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。2.报告中应书写主要源程序,且源程序中要有注释。3.报告中应包含运行结果及结果分析。如调试通过并得到预期的效果,请注明‘通过’并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。4.报告最后包含实验总结和体会。4实验二OpenGL中的光照一、实验目的1.理解光照模型。2.掌握OpenGL中的光照编程方法。3.学会诊断OpenGL中的光照效果异常。二、实验环境⒈硬件:每个学生需配备计算机一台。⒉软件:Windows操作系统+VisualC++;三、实验内容1.建模利用glut函数指定两个球体模型,它们一左一右并列放置在原点两侧,设置合适的视域体进行观察。2.定义光源属性定义两个光源,分别设置它们的环境光、漫反射光和镜面反射光分量,设置两个光源的位置分别位于左侧球体的左前方和右侧球体的右前方;左侧的光源为红色,右侧的光源为绿色。3.定义球体的材质4.显示球体时,让左边的光源只照亮左边的球体,右边的光源只照亮右边的球体。5.按下ESC键,退出程序。四、程序设计提示1.main函数功能:创建窗口;注册回调函数;主循环。intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow(“OpenGL中的光照”);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return0;5}2.初始化函数:功能:设置清除所用的颜色;指定着色模型;设置材质;初始化光源参数;打开光照;打开深度测试。voidinit(void){}3.键盘响应函数:功能:按下ESC键时退出程序。voidkeyboard(unsignedcharkey,intx,inty){}4.显示函数:功能:指定几何模型;指定颜色;进行模型变换。voiddisplay(void){//清除颜色缓存//打开灯光0,关闭灯光1//向左平移//指定左侧球体//打开灯光1,关闭灯光0//向右平移//指定右侧球体//马上执行}5.reshape函数功能:设置视口;窗口大小改变时,改变视域体,使窗口的宽高比与视域体的宽高比保持一致。voidreshape(intw,inth){}6.包含头文件#includestdlib.h#includeGL/glut.h五、思考题1.若定义三个光源,光源0和光源1照在左侧球体上,光源1和光源2照在右侧球体上,如何实现?62.在OpenGL中,要使光照效果正常,需要指定模型的法向量。在本实验中利用glut函数显示球体时,没有指定球体的法向量,你在实验中是否得到了正确的光照效果?请分析原因。六、报告要求1.认真书写实验报告,字迹清晰,格式规范。报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。2.报告中应书写主要源程序,且源程序中要有注释。3.报告中应包含运行结果及结果分析。如调试通过并得到预期的效果,请注明‘通过’并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。4.报告最后包含实验总结和体会。7实验三OpenGL中的拾取一、实验目的1.理解OpenGL中的交互式编程方法。2.掌握OpenGL中拾取的实现。二、实验环境⒈硬件:每个学生需配备计算机一台。⒉软件:Windows操作系统+VisualC++。三、实验内容1.建模利用glut函数定义两个球体模型,它们一左一右并列放置在原点两侧,设置合适的视域体进行观察。2.拾取将拾取函数作为鼠标响应的回调函数。在拾取函数中,建立拾取矩阵,在鼠标附近3×3的区域内选择对象,在鼠标左键按下时,判断哪一个球体被选中,还是都未被选中,并将选择缓存中的内容打印到屏幕上。3.设置颜色左边球体未被选中时显示为红色,右边球体未被选中时显示为绿色,当其中任意一个被选中时,则以白色显示被选中的球体。4.按下ESC键,退出程序。四、程序设计提示1.main函数功能:创建窗口;注册回调函数;主循环。intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow(“OpenGL中的拾取”);init();glutReshapeFunc(reshape);glutDisplayFunc(display);8glutMouseFunc(pickRects);glutKeyboardFunc(keyboard);glutMainLoop();return0;}2.初始化函数:功能:设置清除所用的颜色;打开深度测试;指定着色模型。voidinit(void){}3.鼠标响应函数功能:按下鼠标左键时,在鼠标附近3×3的区域内进行拾取。如果选中左边的球体则select=1,如果选中右边的球体则令select=2,如果两个球体都未被选中,则select=0。voidpickRects(intbutton,intstate,intx,inty){}4.显示函数:功能:指定几何模型;指定颜色;如果当前处于“选择模式”,则设置合适的名称栈。voiddisplay(void){}5.reshape函数功能:设置视口;设置视域体。voidreshape(intw,inth){}6.键盘响应函数功能:按下ESC键时退出程序。voidkeyboard(unsignedcharkey,intx,inty){}7.包含头文件,定义全局变量#includestdlib.h#includestdio.h9#includeGL/glut.hGlintselect=0;其中select用来标记选中哪一个物体,选中左边的球体时select=1,选中右边的球体时select=2,当两者都未被选中时select=0。五、思考题1.如果在拾取时有多个物体被选中,怎样判断哪个物体处于最上面?2.一个命中记录中的最小和最大深度值代表什么意义,怎样取出它们的值?六、报告要求1.认真书写实验报告,字迹清晰,格式规范。报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。2.报告