2013《计算机图形学》实验任务
试用班级:数媒2011 主讲教师:刘金义
基本说明:
? 最低应完成100分值的题目。
? 每个题目都应该采用VC++6.0完成。如采用其他环境,需说明。 ? 每个题目的实现结果不是必须与我的要严格一致,可以有你自己的发挥,但不能离基本要求太远。
? 题目完成后,可随时发送到CompGeom2013@163.com。在邮件标题中,应标注作者、题号和题目名称,例如“陈磊:实验4-HSV颜色空间”。 ? 每个题目只给前3名提交的同学以成绩,以后提交的做无效处理,除非你的程序具有独一无二的特色。
实验0. BITMAP图像文件的显示(20分)
目的:进一步熟悉Windows的GDI编程;认识简单图像格式及其处理方法。
要求:打开任意的BMP文件,显示该图像,并且能够进行颜色取反和二值化。
方法:图像的读入可以采用API函数LoadImage(),也可以根据BitMap格式,逐项读入。
图像的显示可以如下三种方法之一: ? 用SetPixel函数逐个象素显示;
? 用SetDIBitsToDevice函数一次全部显示; ? 用CBitmap类及BitBlt函数显示。
你也可以在OpenGL下完成:利用auxDIBImageLoadA()函数装入图像,利用纹
理绘制函数显示。
参考效果:目录下有可执行的演示程序。
实验1. 一个特殊画板(30分)
目的:熟悉基本图元的生成算法,进一步熟悉人机交互程序设计。
要求:该平台需实现的目标:
? 可以绘制的图元包括直线段、圆、和实心多边形; ? 每个图元以当前颜色绘制;
? 只有在底色为白色的位置,图元才被绘出,其他颜色的位置不变,也就是说画出的图形永远不能被删除; ? 要有橡皮筋跟随鼠标移动;
? 实心多边形的交互方法:用鼠标左键确定多边形的前n-1个顶点,用右键确定最后一个顶点,并使多边形封闭。在顶点未确定前,要求总有一个橡皮筋跟着鼠标移动。在最后一个顶点确定后,把多边形填充成实心。
方法:应自己编写绘直线段、圆、和实心多边形绘制函数。在整个实现过程中只需调用
一个GDI函数:SetPixel( )。你可以利用提供的多边形填充程序polyfill.c。
评定:如果你的画板不具有“特殊性”,也可获得部分成绩。如果你能将画图结果输出
为BMP文件,额外奖励20分。
参考效果:目录下有可执行的演示程序。
实验2. RGB颜色空间(20分)
目的:认识RGB颜色空间,熟悉OpenGL下带颜色几何模型的渲染。
要求:可以放缩和变角度观察。
方法:将RGB正方体的六个正方形表面分割为更小的正方形,每个小正方形用同一颜
色。你可以通过修改OpenGL入门程序来实现。
评定:如果你能通过剖切,显示RGB空间的指定剖面,额外奖励20分。
参考效果:目录下有可执行的演示程序。
实验3. HSV颜色空间(30分)
目的:认识HSV颜色空间,熟悉OpenGL下带颜色几何模型的渲染。
要求:可以放缩和变角度观察。
方法:将HSV锥体的侧面和顶面分别分割为小的三角形,每个三角形用颜色过渡的方
法渲染。设置颜色时你需利用HSV到RGB的转换。你可以通过修改OpenGL入门程序来实现。
评定:如果你能通过剖切,显示HSV空间的指定剖面,额外奖励20分。
参考效果:目录下有可执行的演示程序。
实验4. STL模型显示(30分)
目的:熟悉几何模型在OpenGL下的渲染。附带学会文件读取。
描述:STL文件是一种用三角形来描述形体表面的文件,其ASCII码文件的例子如下:
solid AutoCAD
facet normal -9.2007829e-001 -9.0619802e-002 3.8110890e-001 outer loop
vertex 3.3409047e+000 1.2000000e+002 1.0000000e+002 vertex 5.5824765e+000 9.7240940e+001 1.0000000e+002
vertex 8.4551301e+000 9.7812346e+001 1.0707107e+002 endloop endfacet
facet normal -9.2007829e-001 -9.0619802e-002 3.8110890e-001 outer loop
vertex 6.2698369e+000 1.2000000e+002 1.0707107e+002 vertex 3.3409047e+000 1.2000000e+002 1.0000000e+002 vertex 8.4551301e+000 9.7812346e+001 1.0707107e+002 endloop endfacet …… endsolid
要求:任意读入一个ASCII码的STL文件,显示出该形体。可以变换角度观察。对应
目录下提供了两个STL文件实例。
方法:读文件最好利用CDocument类的Serialize( )方法。将读取的三角形存储在一个链
表中。(也可利用CArray或标准模板库vector)。注意实例STL文件中的三角形可能多达一百万。
鼓励:无。
参考效果:目录下有可执行的演示程序。
实验5. Bezier曲面茶壶(30分)
目的:熟悉OpenGL下双三次Bezier曲面的渲染,进一步熟悉文件读取。
描述:茶壶的表面数据存储在一文件中,文件的第1行为数字32,表示茶壶由32个双
三次Bezier曲面构成。然后是32行,每行16个数,分别代表每个双三次Bezier曲面的16个控制点的序号。再然后是数字306,表示一共有306个控制点。接着是306行,每行给出顺序的控制点的坐标。
要求:读入提供的茶壶数据文件,渲染它。并且能够放缩和换角度观察。
方法:显示Bezier曲面采用glMap2(),glEvalCoord2(),glEvalMesh2(),glMapGrid2()
等函数。在实现上你可利用OpenGL入门程序。读文件最好利用CDocument类的Serialize( )方法。
鼓励:如果你能为茶壶增加美观的紫砂纹理或青花纹理,额外奖励30分。
参考效果:目录下有可执行的演示程序。
实验6. 透明的坐标平面(30分)
目的:熟悉利用alpha融合生成透明效果。熟悉获得物体空间一点深度的方法。
要求:生成具有半透明效果的三个坐标平面,并且可以变换视点观察。
方法:应该把三个坐标平面分割为12块。在这12块上各取一点,利用gluProject()函数
获得它们的深度。然后对这些深度进行排序。最后按照从后到前的顺序显示这12块平面片。显示前需利用glBlendFunc()设置融合模式。用glColor4f()指定RGBA。在实现上,可以利用OpenGL入门程序。
鼓励:无。
参考效果:目录下有可执行的演示程序。
实验7. 玻璃房子(30分)
目的:熟悉利用alpha融合生成透明效果。熟悉获得物体空间一点深度的方法。
要求:生成具有半透明效果的房子的6个面,房子内随便放置一些物体。可以变换视点观察。
方法:应该房子的6个面上各取一点,利用gluProject()函数获得它们的深度。然后对这
些深度进行排序。最后按照从后到前的顺序显示这6块平面片。显示前需利用glBlendFunc()设置融合模式。用glColor4f()指定RGBA。在实现上,可以利用OpenGL入门程序,房子的位置与尺寸不用变。
鼓励:无。
参考效果:目录下有可执行的演示程序。
实验8. 砖瓦房和树(30分)
目的:熟悉纹理贴图的方法。熟悉利用Alpha融合和公告板技术生成树木。
要求:房子应贴上砖墙,房顶应贴上瓦片。树木始终正对观察者。
方法:纹理的最终映射利用glTexCoord2f()或gluQuadricTexture()函数。纹理图像的指定有两种方式:一种是利用显式的glTexImage2D();二是利用隐式方式,使用auxDIBImageLoad()、glGenTextures()、glBindTexture()与gluBuild2DMipmaps()函数。房子的位置与尺寸可以直接利用OpenGL入门程序。隐式方式纹理映射的代码可以参考“基于GLUT的OpenGL入门”。
鼓励:如果为房子加上合适的门和窗户,额外奖励10-20分。
参考效果:目录下有可执行的演示程序。目录下同时提供房子和树的纹理图像。
实验9. 交互生成B样条曲线(20分)
目的:熟悉B样条曲线与Bezier曲线的关系。
要求:用户交互输入若干控制点后,自动生成由这些控制点决定的准均匀三次B样条
曲线。要求同时显示每段Bezier曲线的控制多边形。本题在GDI下完成即可。
方法:每段Bezier曲线的绘制可以用绘制小线段的方法,也可以调用CDC类的
PolyBezier()函数。
鼓励:无。
参考效果:目录下有可执行的演示程序。
实验10. B样条曲面(30分)
目的:熟悉双三次B样条曲面与双三次Bezier曲面的关系,熟悉B样条曲面的两种显
示方法。进一步熟悉文件读取方法。
要求:已知存在于文件中的B样条曲面的控制顶点网格数据(bs_surf_1.txt是一个例子文
件),要求读入该文件并将该曲面真实地显示出来,并且可以在任意视点下观察。 控制顶点网格数据文件的格式如下:
u方向控制顶点m v方向控制顶点个数n P00的坐标值 P01的坐标值 。。。。。。 Pm-1,n-1的坐标值
方法:方法一是把B样条曲面看作Nurbs曲面的特例,利用gluNurbs()函数一次显示。
方法二是把B样条曲面分割为一系列双三次Bezier曲面片,然后逐个显示Bezier曲面片。
鼓励:如果曲面的表面被贴上纹理,额外奖励10分。
参考效果:目录下有可执行的演示程序。
实验11. 房子内部(30分)
目的:熟悉透视空间的设置,熟悉视线的球面交互。
要求:房子墙壁、房顶和地面具有纹理。观察方式为透视。交互方式为眼睛位置不动,
视线可以左右和上下旋转。相当于眼睛位于一个球的中心,注视点可为球面上的任