图形学大作业范例Word下载.docx
《图形学大作业范例Word下载.docx》由会员分享,可在线阅读,更多相关《图形学大作业范例Word下载.docx(23页珍藏版)》请在冰点文库上搜索。
![图形学大作业范例Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/2a47b848-0c72-4d76-bd82-7762c12a6a4f/2a47b848-0c72-4d76-bd82-7762c12a6a4f1.gif)
软硬件运行环境:
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);
//还原绘图设备
//初始化OPENGL的灯光,材质,雾,投影方式等
//绘制图形如曲线,曲面,圆柱,球,点,线,多边形等
//绘制图形berzer曲面
//绘制图形berzer曲线
//设置一维纹理
voidinitMaterial();
//初始化OPENGL的材质
通过方向键,Z,X,W,A,S,D来控制旋转,移动,放大等。
if(GetAsyncKeyState(VK_UP)<
0)
rx+=1;
if(GetAsyncKeyState(VK_DOWN)<
rx-=1;
if(GetAsyncKeyState(VK_LEFT)<
ry+=1;
if(GetAsyncKeyState(VK_RIGHT)<
ry-=1;
if(GetAsyncKeyState('
Z'
)<
scale+=0.02;
X'
scale-=0.02;
D'
tx+=0.05;
A'
tx-=0.05;
W'
ty+=0.05;
S'
ty-=0.05;
glPushMatrix();
//保存
绘制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"
)
opengl32.lib"
glu32.lib"
glaux.lib"
)
#include<
windows.h>
gl/gl.h>
gl/glu.h>
math.h>
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,
WPARAMwParam,LPARAMlParam);
//初始化OPENGL的灯光,材质,雾,投影方式等;
//绘制图形如曲线,曲面,圆柱,球,点,线,多边形等;
//绘制图形berzer曲面;
//绘制图形berzer曲线;
//设置一维纹理;
//初始化OPENGL的材质;
#definestripeImageWidth64
GLubytestripeImage[3*stripeImageWidth];
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("
"
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(&
//OPENGL代码如下
glClearColor(0.0f,0.6f,0.8f,0.0f);
//设置窗口背景色
glClear(GL_COLOR_BUFFER_BIT);
//清除颜色缓冲
0)//方向键,Z,X,W,A,S,D来控制旋转,移动,放大
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;
WPARAMwParam,LPARAMlParam)
switch(message)
caseWM_CREATE:
return0;
caseWM_CLOSE:
PostQuitMessage(0);
caseWM_DESTROY:
caseWM_KEYDOWN:
switch(wParam)
caseVK_ESCAPE:
PostQuitMessage(0);
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