图形学大作业范例Word下载.docx

上传人:b****2 文档编号:5825143 上传时间:2023-05-05 格式:DOCX 页数:23 大小:82.66KB
下载 相关 举报
图形学大作业范例Word下载.docx_第1页
第1页 / 共23页
图形学大作业范例Word下载.docx_第2页
第2页 / 共23页
图形学大作业范例Word下载.docx_第3页
第3页 / 共23页
图形学大作业范例Word下载.docx_第4页
第4页 / 共23页
图形学大作业范例Word下载.docx_第5页
第5页 / 共23页
图形学大作业范例Word下载.docx_第6页
第6页 / 共23页
图形学大作业范例Word下载.docx_第7页
第7页 / 共23页
图形学大作业范例Word下载.docx_第8页
第8页 / 共23页
图形学大作业范例Word下载.docx_第9页
第9页 / 共23页
图形学大作业范例Word下载.docx_第10页
第10页 / 共23页
图形学大作业范例Word下载.docx_第11页
第11页 / 共23页
图形学大作业范例Word下载.docx_第12页
第12页 / 共23页
图形学大作业范例Word下载.docx_第13页
第13页 / 共23页
图形学大作业范例Word下载.docx_第14页
第14页 / 共23页
图形学大作业范例Word下载.docx_第15页
第15页 / 共23页
图形学大作业范例Word下载.docx_第16页
第16页 / 共23页
图形学大作业范例Word下载.docx_第17页
第17页 / 共23页
图形学大作业范例Word下载.docx_第18页
第18页 / 共23页
图形学大作业范例Word下载.docx_第19页
第19页 / 共23页
图形学大作业范例Word下载.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

图形学大作业范例Word下载.docx

《图形学大作业范例Word下载.docx》由会员分享,可在线阅读,更多相关《图形学大作业范例Word下载.docx(23页珍藏版)》请在冰点文库上搜索。

图形学大作业范例Word下载.docx

软硬件运行环境:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2