《计算机图形学》实验指导书
课程编号: 243005
课程名称:计算机图形学英文名称:
课程类型:
实验学时:
适用对象:
先修课程: Computer graphics 限选课 20 计算机专业本科学生 C、C++语言
一、实验说明
本实验课是实用图形编程技术的一个学习和实践。以VC++6.0作为编程工具,以MFC、OpenGL为基础,完成一些图形学方面的基本编程,为深入理解图形学原理提供重要的保证,并为今后的计算机图形学应用打下坚实的实践基础和编程积累,促进学生理解课程内容,为开发图形应用系统打下基础。
教材的下篇(第八章到第十三章)就是本实验课的详细说明和指导。
二、实验要求
通过上机实验使学生掌握计算机图形学基础知识的实际应用。主要实践基本图形的生成和计算、图形变换与输出、图形输入与交互技术、图形数据结构等。
要求学生具有阅读、编辑、调试VC++语言程序的能力。
三、评分标准
1、实验报告结构完整。
2、试验目的明确。
3、实验准备充分、代码正确。
4、结果正确、结论合理。
5、成绩统一按照优、良、中、差四个档次给出。
6、实验成绩的确定以最终上机检查的结果为准,实验报告及考勤供参考。
四、推荐的参考书
1、《VC++应用教程》郑阿奇主编,北京:人民邮电出版社,2008.4。
2、《VC++实用教程》周进主编,北京:人民邮电出版社,2008.5。
3、 《VC++面向对象与可视化程序设计》黄维通主编,北京:清华大学出版社,2000.5。
4、《VC++实践与提高》李于剑主编,北京:中国铁道出版社,2001.7。
目 录
实验一:熟悉和掌握VC++MFC程序开发环境 (2学时) 实验二:学习掌握GDI对象类(2学时)
实验三: Windows映射模式、绘图模式的设置(2学时) 实验四:鼠标绘直线(4学时)
实验五:鼠标绘园(2学时)
实验六:绘制梅花曲线(4学时)
实验七:OpenGL基础知识和实验框架的建立(2学时) 实验八:OpenGL中基本图形的绘制(4学时)
实验九:OpenGL中组合图形及光照和贴图(验证性实验,4学时) 实验十:摄像漫游与OpenGL的坐标变换(验证性实验,4学时)
实验一:熟悉和掌握VC++MFC程序开发环境 (验证性实验,2学时)
目的:
1、掌握用AppWizard的Project窗口MFC AppWizard[exe]选项创建SDI应用程序的方法
2、熟悉SDI在编程、功能等方面的知识。
内容:
1、熟悉VC++6.0开发环境,它的系统菜单、工具栏、项目工作区窗口、文档窗口、输出窗口等。
2、熟悉建立SDI程序的步骤和各步选项,了解各选项的意义。
3、熟悉程序的编译、联结、执行等的操作方法与过程。
4、熟悉MFC程序的组织结构,四个基本类(Application、Frame、Document、View)的相互关系和调用顺序。
5、完成教材中第8章第3节的实验内容,即绘制点、直线、矩形,简单曲线,文本。 要求:
1、学习教材第8章1、2、3节的内容。
2、借阅有关VC++MFC的书籍,学习理解 MFC AppWizard[exe]的知识。
3、采用Project的AppWizard的Project窗口MFC AppWizard[exe]选项创建SDI,按照AppWizard的6步提示,一步步生成SDI文件。
4、观察SDI的开发环境,编译生成exe文件。
5、观察Workspace窗口,分别观看Class窗口中的类,Resource窗口中的菜单、对话框、工具条等资源,File窗口中的的各种文件,四类文件之间的关系。
6、找到 ~View类中的OnDraw函数。
实验二:学习掌握GDI对象类(验证性实验,2学时)
目的:
1、 掌握用VC++编程的过程和方法,理解熟悉GDI对象类
2、 理解0nDraw成员函数的知识,为编制绘图系统打基础。
内容:
1、找到由AppWizard直接生成的OnDraw函数。构造Cpen对象来绘制直线。
2、使用CPen类成员函数CreatePen()创建一支蓝色画笔。
3、使用CPen类成员函数CreatePenIndirect()创建一支黑色画笔。
4、使用CBrush类成员函数CreateBrushIndirect来创建一个黑色的圆。
5、使用CBrush类第二种构造函数来创建一支黑色(系统缺省的画刷)并绘制一个不带任何阴影线的矩形区域。
6、使用CBrush类第三种构造函数来创建一支黑色,样式为CROSS的画刷并绘制一个具有阴影线的椭圆区域。
7、使用CFont类成员函数CreateFont来创建CFont对象并绘制文本。
要求:
1、学习教材第8章第4节的内容。
2、建立工程(名称自定,比如MyVC),工程具体创建步骤如下:
(1) 单击File\New菜单。
(2)从弹出的对话框中选择第二个选项卡Project,并在左侧列表框中选择MFC AppWizard(exe);在Project name 编辑框中输入项目名称“MyVC”;在Location目录中选择要存放项目的文件夹。用鼠标左键单击“OK”按钮进入下一步。
(3) 在应用程序向导的第一步中,选择“Single document”(单文档),然后用鼠标左键单击“Finish”接受所有其余的缺省设置。此时出现的对话框如图所示。
(4) 用鼠标左键单击“OK”按钮确认项目设置。
3、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
4、运行结果应该与教材中的相关实例相符。
实验三: Windows映射模式、绘图模式的设置(验证性实验,2学时)
目的:
1、理解熟悉Windows映射模式。
2、理解熟悉绘图模式的设置的知识,为编制绘图系统打基础。
内容:
1、在不同的映射模式之间切换,以完成图形大小和位置的改变以及逻辑坐标系的变化。
2、练习建立逻辑坐标系的基本方法及设置窗口和视口坐标系X方向和Y方向幅度的基本方法。
3、通过以下两个函数: pDC->DPtoLP(&point);// point的值被转换成逻辑坐标值
pDC->LPtoDP(&point);// point的值被转换成设备坐标值
实现逻辑坐标到设备坐标的转换。
4、练习在不同映射模式下,逻辑坐标和设备坐标的区别。
5、练习绘图模式及其设置方法。
要求:
1、学习教材第8章第5节的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符。
实验四:鼠标绘直线(验证性实验,2学时)
目的:
掌握用VC++编程实现鼠标绘制各种基本图元。
内容:
1、用类向导ClassWizard添加鼠标事件即其响应函数OnLButtonDown。
2、绘图模式的设置。
3、用鼠标绘制直线。
要求:
1、学习教材第9章1节的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符。
实验五:鼠标绘园(验证性实验,2学时)
目的:
掌握用VC++编程实现鼠标绘制各种基本图元。
内容:
1、学习理解鼠标消息 WM_LBUTTONDOWN、WM_MOUSEMOVE 、WM_RBUTTONDOWN。
2、用类向导ClassWizard添加鼠标事件即其响应函数。
3、用鼠标绘制园。
4、将此程序改造成画直线的程序。(画线的方式:单击,起点,再单击是终点,可以循环画线。)
要求:
1、学习教材第9章2节的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符。
实验六:绘制梅花曲线(验证性实验,4学时)
目的:
1、掌握绘制复杂曲线的基本方法——直线段逼近曲线法。
2、理解用菜单调用函数实现图形动态绘制的方法,为编制绘图系统打基础。
内容:
1、练习绘制复杂曲线的基本方法——直线段逼近曲线法。该方法的基本思想如下:首先写出该曲线的参数方程,当自变量由小到大依次变化时,就会得到一系列曲线上点的坐标,即逼近点,最后依次将各逼近点顺序连接起来。要绘制的梅花曲线参数方程如下:
x?asin?cos2?
y?asin2?cos? (其中0???2?)
2、练习在CWnd派生类——对话框的区域内绘各种图的方法。
3、利用面向对象的思想改造此示例,建立梅花曲线类。
要求:
1、学习教材第9章3节的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符。
实验七:OpenGL基础知识和实验框架的建立(验证性实验,4学时) 目的:
1、建立Windows系统下的OpenGL实验框架。
2、学习理解OpenGL工作流程。
内容:
1、建立非控制台的Windows程序框架。
2、建立OpenGL框架。
3、建立OpenGL框架的类文件。
4、完善Windows框架。
5、理解程序间的相互关系。
要求:
1、学习教材第10章的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符。
4、编译第10章的框架代码,修改背景色、窗口标题。
实验八:OpenGL中基本图形的绘制(验证性实验,2学时) 目的:
1、使用OpenGL绘制基本图形。
2、使用类文件组织程序。
内容:
1、学习OpenGL库函数命名方式。
2、学习OpenGL构图形式。
3、学习有关OpenGL的坐标变换。
4、显示OpenGL立体图形。
5、建立物体类文件。
要求:
1、学习教材第11章的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符,如图11.5.2所示。
实验九:OpenGL中组合图形及光照和贴图(验证性实验,2学时) 目的:
1、使用OpenGL绘制组合图形。
2、使用OpenGL的光照和贴图。
内容:
1、学习OpenGL绘制组合图形的方式。
2、加深对组合图形的理解,特别是对基本图形的缩放、移动、旋转的理解。
3、学习光照的使用,如何创建光源、启动光照。
4、学习有关OpenGL贴图的知识。
要求:
1、学习教材第12章的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符,如图12.1.1所示。
实验十:摄像漫游与OpenGL的坐标变换(验证性实验,2学时) 目的:
1、使用OpenGL中摄像漫游的方法。
2、学习OpenGL中的变换所对应的图形学理论。
内容:
1、学习OpenGL中 glulookAt(?)观察函数的使用。
2、理解glulookAt(视点,目标点,视点方向)函数中各参数的意义及控制方法。 要求:
1、学习教材第13章的内容。
2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。
3、运行结果应该与教材中的相关实例相符,如图13.2.2所示。
4、 分别找到OpenGL中的变换所对应的图形学理论。
第二篇:计算机图形学投影变换
计算机图形学实验报告
实验三 三维图形的投影变换
学
专
指
成
生业导、姓班教名 级 师 绩
电子与信息工程系
2010 年 11月 6日
一、实验目的:
绘制三维物体的轴测投影图和一点透视图 ,在程序中给定控制多面体的顶点坐标及点线信息。视点固定在z轴某点上,输入物体的旋转角度及平移量。正轴测投影图和一点透视图。
二、题目:
三维图象的基本变换
三、设计思想:
因为电脑显示的是2维持坐标图象,所以在设计时要将三维的图象坐标转换成电脑能显示的二维持坐标图,然后根据图象的基本变换矩阵计算出变换后的坐标点,最后绘制出图象变换效果。
四、原程序:
CPoint dian22[8];//六面体的8个2维坐标点
CPoint dian[8]; float coordinate2[8][3];
float coordinate3[8][3] 六面体的8个3维坐标点
Void draw6angle()//绘制一个六面方体。
dc.MoveTo(0,0);//yuan dian zuo biao dian(400,400)
dc.LineTo(400,0);//x //绘制一x轴,Y,Z轴
dc.MoveTo(0,0); dc.LineTo(0,400);//y dc.MoveTo(50,50);//z dc.LineTo(-200,-200); dc.MoveTo(dian[0]);//0-1 dc.LineTo(dian[1]); dc.MoveTo(dian[0]);//0-3 dc.LineTo(dian[3]); dc.MoveTo(dian[0]);//0-7 dc.LineTo(dian[7]);
} dc.MoveTo(dian[4]);//4-3 dc.LineTo(dian[3]); dc.MoveTo(dian[4]);//4-5 dc.LineTo(dian[5]); dc.MoveTo(dian[4]);//4-7 dc.LineTo(dian[7]); dc.MoveTo(dian[6]);//6-5 dc.LineTo(dian[5]); dc.MoveTo(dian[6]);//6-7 dc.LineTo(dian[7]); dc.MoveTo(dian[6]);//6-1 dc.LineTo(dian[1]); dc.MoveTo(dian[2]);//2-1 dc.LineTo(dian[1]); dc.MoveTo(dian[2]);//2-3 dc.LineTo(dian[3]); dc.MoveTo(dian[2]);//2-5 dc.LineTo(dian[5])}
void CCBod_3DView::switch_point()//将三维坐标点转换成电脑上能表示的二维坐标点
{ float canshu=0.7071;
for(int i=0;i<8;i++)
{ dian[i].x=float (coordinate3[i][0]+float((-coordinate3[i][2]*canshu))); dian[i].y=float (coordinate3[i][1]+float((-coordinate3[i][2]*canshu))); } }
void CCBod_3DView::OnMoveOnz() //图象在Z轴上的移动。
{
// TODO: Add your command handler code here for(int i=0;i<8;i++)
{
coordinate3[i][2]=coordinate3[i][2]+50; }
this->Invalidate();
}
void CCBod_3DView::OnSpinz() //Z轴上旋转
{ // TODO: Add your command handler code here
{ coordinate3[i][0]=float(coordinate3[i][0]*b)+float(coordinate3[i][1]*(-a)); coordinate3[i][1]=float(coordinate3[i][0]*a)+coordinate3[i][1]*b; } float b=cos(0.23); float a=sin(0.23); for(int i=0;i<8;i++)
OnLarge();
this->Invalidate(); }
void CCBod_3DView::OnDUICHeng() //关于X对称 {// TODO: Add your command handler code here
for(int i=0;i<8;i++) {coordinate3[i][2]= -coordinate3[i][2]; } this->Invalidate(); }
void CCBod_3DView::OnZhengzhouce() //轴测投影图 {// TODO: Add your command handler code here
if(flage==false) { flage=true; }
else
{ flage=false;
}
float dian3[8][3];
for(int i=0;i<8;i++)
{
dian3[i][0]=coordinate3[i][0];
dian3[i][1]=coordinate3[i][1];
dian3[i][2]=coordinate3[i][2];
}
float a,b,c;
float angle_a=3.1415/4;
float angle_b=3.1415/6;
for(int j=0;j<8;j++)
{
a=dian3[j][0];
b=dian3[j][1];
c=dian3[j][2];
dian3[j][0]=float ( a*cos(angle_a) -b*sin(angle_a) );
dian3[j][1]=0;
dian3[j][2]= float( -sin(angle_b)*( a*sin(angle_a)+b*cos(angle_a) + c*cos(angle_b) ); }
float canshu=0.7071;
for(int i2=0;i2<8;i2++)
{ dian22[i2].x=float (dian3[i2][0]+float((-dian3[i2][2]*canshu))); dian22[i2].y=float (dian3[i2][1]+float((-dian3[i2][2]*canshu))); }
this->Invalidate();
} )
void CCBod_3DView::OnONEView() //一点透视图象 {
}
五、运行结果:
1.初始化界面。
// TODO: Add your command handler code her this->Invalidate(); if(m_toushi==false) { m_toushi=true; }else { m_toushi=false;}
2.沿Z轴旋转的效果
3放大效果
4 旋转效果
5对称
6.轴侧投影图
7.一点透视