图形学大作业范例.docx
- 文档编号:3266062
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:23
- 大小:82.66KB
图形学大作业范例.docx
《图形学大作业范例.docx》由会员分享,可在线阅读,更多相关《图形学大作业范例.docx(23页珍藏版)》请在冰点文库上搜索。
图形学大作业范例
滁州学院
图形学设计报告
课程名称:
计算机机图形学
设计题目:
简单图形绘制软件的设计与实现
系别:
计算机科学与技术系
专业:
姓名:
起止日期:
2011年5月20日~2011年6月20日
指导教师:
计算机科学与技术系二00九年制
课程设计的主要内容
⒈引言
本学期系统的学习了计算机图形学,在学期末按课程要求对其进行设计,本课程主要内容包括以图形学算法为目标,深入研究。
续而策划设计实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面做出评价和改进意见。
通过完成一个完整程序,经历策划、设计、开发、总结。
达到通过本课程设计,使自己巩固和实践计算机图形学课程中的理论和算法;掌握基本图形显示程序设计方法,及二维和三维图形变换等程序设计方法,学习表现计算机图形学算法的技巧。
同时以达到培养认真学习积极探索的精神。
⒉需求分析
图形学设计报告题目:
地球与卫星模拟图。
图形学设计报告任务及要求:
以计算机图形学的研究内容、发展与应用,实现图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面,三维实体造型,光照模型,颜色模型,光线跟踪,纹理模拟,常用的计算机动画技术和软件等。
课程设计思想:
绘制一个地图与卫星模拟图,在此中综合实现本学期中学习到OpenGL编程中大部分的方法与操作。
软硬件运行环境:
MicrosoftWindowsXP。
工发工具:
VC++6.0。
⒊概要设计
3.1概要设计实现的内容
利用VC++6.0完成了一个地图与卫星模拟图,该模拟图能实现基本的图形操作功能。
通过本次实验,应该了解图形学里使用OpenGL的一些基于操作,了解直线、矩形、圆和Bezier曲线和曲面等图形的绘制原理、旋转原理、移动原理和缩放原理等。
本设计包括图形绘制模块、键盘控制模块。
图形绘制模块,该模块包括图形的绘制和操作功能,主要有绘制直线、移动直线、缩放和旋转直线;绘制和缩放圆形;绘制Bezier曲线;绘制Berier曲面等。
键盘控制模块,该模块主要实现通过键盘Z,X,W,A,S,D来控制旋转,移动,放大等。
3.2函数的功能描述
初始化OPENGL的灯光,材质,雾,投影方式的函数:
voidinitview();
绘制图形基于操作函数:
voiddraw();
绘制图形berzer曲面函数:
voidberzer_surface(floatcontrol_point[],intm,intn);
绘制图形berzer曲线函数:
voidberzer_curve(floatcontrol_point[],intn,intf);
设置一维纹理函数:
voidset_texture1d(GLubyteimage[],intwidth);
对OPENGL图像的材质操作的函数:
voidinitMaterial
⒋详细设计
对图形的操作。
voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC);//初始化设备
voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC);//还原绘图设备
voidinitview();//初始化OPENGL的灯光,材质,雾,投影方式等
voiddraw();//绘制图形如曲线,曲面,圆柱,球,点,线,多边形等
voidberzer_surface(floatcontrol_point[],intm,intn);//绘制图形berzer曲面
voidberzer_curve(floatcontrol_point[],intn,intf);//绘制图形berzer曲线
voidset_texture1d(GLubyteimage[],intwidth);//设置一维纹理
voidinitMaterial();//初始化OPENGL的材质
通过方向键,Z,X,W,A,S,D来控制旋转,移动,放大等。
if(GetAsyncKeyState(VK_UP)<0)
rx+=1;
if(GetAsyncKeyState(VK_DOWN)<0)
rx-=1;
if(GetAsyncKeyState(VK_LEFT)<0)
ry+=1;
if(GetAsyncKeyState(VK_RIGHT)<0)
ry-=1;
if(GetAsyncKeyState('Z')<0)
scale+=0.02;
if(GetAsyncKeyState('X')<0)
scale-=0.02;
if(GetAsyncKeyState('D')<0)
tx+=0.05;
if(GetAsyncKeyState('A')<0)
tx-=0.05;
if(GetAsyncKeyState('W')<0)
ty+=0.05;
if(GetAsyncKeyState('S')<0)
ty-=0.05;
glPushMatrix();//保存
绘制berzer曲线和曲面。
voidberzer_surface(floatcontrol_point[],intm,intn);//绘制图形berzer曲面
voidberzer_curve(floatcontrol_point[],intn,intf);//绘制图形berzer曲线
//berzer曲线的控制点
floatcpoint[5][3]={{-1.5,-1.5,1.0},{-0.5,-1.5,3.0},{0.5,-1.5,5.0},{1.5,-1.5,2.0},{3,-1.5,0}};
//berzer曲面的控制点
GLfloatctrlpoints[4][4][3]={{{-1.5,-1.5,2.0},{-0.5,-1.5,2.0},{0.5,-1.5,-1.0},{1.5,-1.5,1.0}},
{{-1.5,-0.5,1.0},{-0.5,-0.5,2.0},{0.5,-0.5,1.0},{1.5,-0.5,-1.0}},{{-1.5,0.5,1.0},{-0.5,0.5,1.0},
{0.5,0.5,1.0},{1.5,0.5,1.5}},{{-1.5,1.5,-2.0},{-0.5,1.5,-1.0},{0.5,1.5,1.0},{1.5,1.5,-1.0}}};
对图形光的处理。
GLfloatlight_ambient[]={0.1,0.1,0.1,1.0};//环境光颜色
GLfloatlight_diffuse[]={0.3,0.3,0.3,1.0};//漫反射光颜色
GLfloatlight_specular[]={1,1,1,1.0};//镜面反射光颜色
GLfloatlight_position[]={0,0,10,1.0};
glLightfv(GL_LIGHT0,GL_POSITION,light_position);//设置灯光的位置
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,30);//光锥的轴与中心线的夹角
GLfloatspot_direction[]={0,0,-1.0};
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spot_direction);//定义聚光方向
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,10);//控制光的集中程度
glEnable(GL_LIGHTING);//设置灯光有效
glEnable(GL_LIGHT0);//设置第一个灯光有效
设置对象的材质。
voidinitMaterial()
{
glDisable(GL_TEXTURE_1D);
GLfloatmat_ambient[]={0.8,0,0.9,1.0};
GLfloatmat_diffuse[]={0.8,0,0.9,1.0};
GLfloatmat_specular[]={0.7,0.7,0.7,1.0};
GLfloatmat_shininess[]={10};
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);//设置材质的环境光颜色
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);//设置材质的漫反射光颜色
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//设置材质的镜反光颜色
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);//设置材质的镜反光的强度
}
对纹理操作。
voidset_texture1d(GLubyteimage[],intwidth)
{
GLfloatsgenparams[]={1.0,1.0,1.0,0.0};
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
//设置纹理映射方式
glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
/控制纹素映射到片元(fragment)时怎样对待纹理
glTexImage1D(GL_TEXTURE_1D,0,3,width,0,GL_RGB,GL_UNSIGNED_BYTE,image);
//1D纹理定义的函数
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);//自动产生纹理坐标
glTexGenfv(GL_S,GL_OBJECT_PLANE,sgenparams);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_1D);
}
⒌调试与操作说明
正常绘制的旋转效果如图1所示
图1绘制效果图
通过按键盘Z键将其远移,可以通过按键盘X键将其近移放大,远移效果图如图2所示
图2远移效果图
通过按键盘D键将其右移,可以通过按键盘A键将其左移,右移效果图如图3所示
图3右移效果图
通过按键盘W键将其上移,可以通过按键盘S键将其下移,上移效果图如图4所示
图4上移效果图
通过键盘操作旋转物体可以看到对光照操作处理的效果,如图5所示
图5光照效果图
⒍课程设计总结与体会
这次课程设计是我更加了解了计算机图形学这门课程,知道了很多以前一知半解的知识。
让我收获不小,到真正自己动手做的时候才会发现不足之处。
在做设计的期间,又温习了原来所学的知识,有助于知识系统的归纳。
任何知识和理论都要归结于实践。
同时设计程序的过程也是困难重重,在设计的过程中自己不断的查找相关书籍,了解知识,并运用这些知识解决设计中的问题,加深了对知识的了解,使自己更加熟练的运用各种知识。
对计算机图形学的了解也有加深,明白了计算机图形学在生活中的作用,它与我们息息相关。
只有自己亲手去做你才会真正的了解它,了解计算机图形学。
程序设计的过程不是枯燥无味的,当你去挖掘它的用法,设计的理念,你越好发现它的魅力。
一个生动有趣的图形可以用文章加以说明,用算法用程序绘制出来。
⒎致谢
本图形学设计是在我的老师杨斌的亲切关怀和悉心指导下完成的。
他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。
从课题的选择到设计的最终完成。
我要感谢杨老师对我的教育培养,您细心指导我的学习与研究,在此,我要向您深深地鞠上一躬。
还要感谢在我身边帮助过我的同学们,感谢你们热情的付出!
你们兢兢业业,奋发向上的精神,将是我今后人生前进道路上的一种力量!
再次感谢我的老师!
⒏参考文献
[1][美]SteveCunningham.计算机图形学[M].石教英,潘志庚,等译.北京:
机械工业出版社,2009.
[2][美]P.J.Deitel.C++大学教程[M].北京:
电子工业出版社,2007.
[3]孙波.OpenGL编程实例学习教程.范建华等译.北京:
北京大学出版社,2000.
⒐附录
程序源代码和部分注释:
#pragmacomment(lib,"glut32.lib")
#pragmacomment(lib,"opengl32.lib")
#pragmacomment(lib,"glu32.lib")
#pragmacomment(lib,"glaux.lib")
#include
#include
#include
#include
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,
WPARAMwParam,LPARAMlParam);
voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC);//初始化设备
voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC);//还原绘图设备
voidinitview();//初始化OPENGL的灯光,材质,雾,投影方式等;
voiddraw();//绘制图形如曲线,曲面,圆柱,球,点,线,多边形等;
voidberzer_surface(floatcontrol_point[],intm,intn);//绘制图形berzer曲面;
voidberzer_curve(floatcontrol_point[],intn,intf);//绘制图形berzer曲线;
voidset_texture1d(GLubyteimage[],intwidth);//设置一维纹理;
voidinitMaterial();//初始化OPENGL的材质;
#definestripeImageWidth64
GLubytestripeImage[3*stripeImageWidth];
//berzer曲线的控制点
floatcpoint[5][3]={{-1.5,-1.5,1.0},{-0.5,-1.5,3.0},{0.5,-1.5,5.0},{1.5,-1.5,2.0},{3,-1.5,0}};
//berzer曲面的控制点
GLfloatctrlpoints[4][4][3]={{{-1.5,-1.5,2.0},{-0.5,-1.5,2.0},{0.5,-1.5,-1.0},{1.5,-1.5,1.0}},
{{-1.5,-0.5,1.0},{-0.5,-0.5,2.0},{0.5,-0.5,1.0},{1.5,-0.5,-1.0}},{{-1.5,0.5,1.0},{-0.5,0.5,1.0},
{0.5,0.5,1.0},{1.5,0.5,1.5}},{{-1.5,1.5,-2.0},{-0.5,1.5,-1.0},{0.5,1.5,1.0},{1.5,1.5,-1.0}}};
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,
intiCmdShow)
{
WNDCLASSwc;
HWNDhWnd;
HDChDC;
HGLRChRC;
MSGmsg;
BOOLbQuit=FALSE;
floatrx=0.0f,ry=0;//rx代表X轴的转角,ry代表Y轴的转角
floatscale=0.5;//scale代表放大比例
floattx=0,ty=0,tz=-10;//tx,ty,tz代表X,Y,Z轴的移动量
//注册窗口的类
wc.style=CS_OWNDC;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="GLSample";
RegisterClass(&wc);
//创建主窗口
hWnd=CreateWindow("GLSample","OpenGLSample",
WS_CAPTION|WS_POPUPWINDOW|WS_VISIBLE,
0,0,600,600,NULL,NULL,hInstance,NULL);
//初始化设备和OPENGL
EnableOpenGL(hWnd,&hDC,&hRC);
initview();
//程序主循环
while(!
bQuit)
{
//检查窗口消息
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//分配窗口消息
if(msg.message==WM_QUIT)
{
bQuit=TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
//OPENGL代码如下
glClearColor(0.0f,0.6f,0.8f,0.0f);//设置窗口背景色
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓冲
if(GetAsyncKeyState(VK_UP)<0)//方向键,Z,X,W,A,S,D来控制旋转,移动,放大
rx+=1;
if(GetAsyncKeyState(VK_DOWN)<0)
rx-=1;
if(GetAsyncKeyState(VK_LEFT)<0)
ry+=1;
if(GetAsyncKeyState(VK_RIGHT)<0)
ry-=1;
if(GetAsyncKeyState('Z')<0)
scale+=0.02;
if(GetAsyncKeyState('X')<0)
scale-=0.02;
if(GetAsyncKeyState('D')<0)
tx+=0.05;
if(GetAsyncKeyState('A')<0)
tx-=0.05;
if(GetAsyncKeyState('W')<0)
ty+=0.05;
if(GetAsyncKeyState('S')<0)
ty-=0.05;
glPushMatrix();//保存
glTranslatef(tx,ty,tz);//目标分别沿三个轴向平移的偏移量
glRotatef(rx,1,0,0);//表示目标沿从点(x,y,z)到原点的方向逆时针旋转rx度
glRotatef(ry,0,1,0);
glScalef(scale,scale,scale);//目标分别沿三个轴向缩放的比例因子
draw();
glPopMatrix();//取回
SwapBuffers(hDC);//双缓冲交换
Sleep
(1);
}
}
//使OPENGL无效和还原设备
DisableOpenGL(hWnd,hDC,hRC);
DestroyWindow(hWnd);
returnmsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,
WPARAMwParam,LPARAMlParam)
{
switch(message)
{
caseWM_CREATE:
return0;
caseWM_CLOSE:
PostQuitMessage(0);
return0;
caseWM_DESTROY:
return0;
caseWM_KEYDOWN:
switch(wParam)
{
caseVK_ESCAPE:
PostQuitMessage(0);
return0;
}
return0;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
}
//设置设备的描述表和象素格式
voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC)
{
PIXELFORMATDESCRIPTORpfd;//设备的描述表
intiFormat;//getthedevicecontext(DC)
*hDC=GetDC(hWnd);//setthepixelformatfortheDC
ZeroMemory(&pfd,sizeof(pfd));
pfd.nSize=sizeof(pfd);
pfd.nVersion=1;
pfd.dwFlags=PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
pfd.iPixelType=PFD_TYPE_RGBA;
pfd.cColorBits=24;
pfd.cDepthBits=16;
pfd.iLayerType=PFD_MAIN_PLANE;
iFormat=ChoosePixelForma
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学 作业 范例
![提示](https://static.bingdoc.com/images/bang_tan.gif)