程序设计大作业报告.docx
- 文档编号:25719989
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:43
- 大小:230.79KB
程序设计大作业报告.docx
《程序设计大作业报告.docx》由会员分享,可在线阅读,更多相关《程序设计大作业报告.docx(43页珍藏版)》请在冰豆网上搜索。
程序设计大作业报告
学院
XX学院
班级
XXXXX
学号
2012XXXX
姓名
XXX
摘要
/*请你先撰写摘要,它简要叙述了你的大作业内容、基本设计思路、完成情况和使用到的新技术、新思想,还有你自己对你自己结果的评价等。
*/
/*注意:
这个文档中有许多这样的注释(/*和*/表示),它的目的是引导你正确写作这份报告,因此,在报告完成后,请将这些注释信息删除,但是不要损坏那些正式的内容和排版格式*/
/*这页是封面*/
/*在Word“文件”/“属性”菜单上,打开属性对话框,将你的邮件地址填入“作者”栏中,则页脚中的信息回自动改变过来。
*/
/*这个Word的文件名按下面的规则重命名(本次程序设计报告与程序等全部资料由计算机归档,因此请你按要求编写):
2010IE_你的班级_你的学号_你的姓名.DOC
例如:
10100501班李小明(2009309876)应为:
2010IE_10100501_2009309876_李小明.DOC
当报告与程序全部完成后,将本Word文件和程序压缩包文件上传到网络硬盘中的“大作业”文件夹上。
*/
/*在后面的文档编写中,请你不要修改各个标题的内容,从而确保报告内容和风格一致。
完成全部内容后,你只需要在上面的目录上右键“更新域”,选择“只更新页码”就可以更新正确的目录页码。
注意:
目录的左边距为6.5厘米。
*/
1摘要
1.1设计题目
opengl3D设计
1.2设计内容
用C语言中的opengl库设计卡通脸谱3D图
1.3开发工具
VisualC++6.0
1.4应用平台
Windows2000/XP/Vista32位
2详细设计
2.1界面设计
2.2程序结构
/*请在这里详细描述你的程序的整体结构,包括程序的流程,各过程的功能关系、参数传递等。
*/
2.3主要功能
通过C语言,设计一个opengl3D卡通脸谱图。
2.4过程实现
/*请在这里简要描述你的程序中各个过程程序代码的实现(包含算法、数据结构)*/
2.5开发日志
第一天:
找资料进行学习。
分以下几步:
第一步:
首先了解opengl,知道它的主要功能。
第二步:
在网上搜索一个用C语言opengl做成的程序,体验opengl。
只有运行并了解一个程序,才能知道程序里需要做什么。
第三步:
确定自己要做的方向(自己要做什么),如我要做脸谱,就需要搜集相关的图片。
第四步:
配置opengl库,包括库的下载和对核心库、实用库和辅助库的配置。
同时,遇到不太懂的,向他人请教,解决一些技术难题。
第二至五天:
动手进行编程,包括编写cpp文件、头文件等,并对程序进行修改,直至达到预期目的。
第六天:
写实验报告并总结反思。
3程序调试及运行
3.1程序运行结果
3.2程序使用说明
1.在VC++中输入附带的程序代码
2.在确保加入opengl库的前提下,进行构建,编译,得到可运行程序
3.打开程序,运行,即可看到用“卡通QQ”做成的动态3D脸谱。
3.3程序开发总结
通过本程序的编写和开发,进一步的提高了自己的基本编程能力,熟悉了C语言图形模式下的编程,深入地理解了程序中有关函数等方面的知识。
通过本程序的训练,使我对C语言有了一个更能深刻的了解。
通过这次程序开发,我对程序员有了更深刻的认识。
我意识到程序员不仅要有过人的思维,还要有足够的耐心,以及合作的意识、独立解决困难的意识。
通过这次程序开发,我学到了很多知识,遇到了一些问题,我明白了自己有很多的不足,程序也有缺陷,但这本来就是一个不断尝试、不断完善的过程,需要自己去不断摸索、试验,有了这次的体验,以后我会在这条路上走的更远。
4附件(源程序)
main.cpp/*main函数代码*/
#include"main.h"
#include"3ds.h"
boolg_bFullScreen=true;
HWNDg_hWnd;
RECTg_rRect;
HDCg_hDC;
HGLRCg_hRC;
HINSTANCEg_hInstance;
#defineFILE_NAME"face.3ds"
UINTg_Texture[MAX_TEXTURES]={0};
CLoad3DSg_Load3ds;
t3DModelg_3DModel;
intg_ViewMode=GL_TRIANGLES;
boolg_bLighting=true;
floatg_RotateX=0.0f;
floatg_RotationSpeed=0.8f;
voidInit(HWNDhWnd)
{
g_hWnd=hWnd;
GetClientRect(g_hWnd,&g_rRect);
InitializeOpenGL(g_rRect.right,g_rRect.bottom);
g_Load3ds.Import3DS(&g_3DModel,FILE_NAME);//将3ds文件装入到模型结构体中
//遍历所有的材质
for(inti=0;i { //判断是否是一个文件名 if(strlen(g_3DModel.pMaterials[i].strFile)>0) { //使用纹理文件名称来装入位图 CreateTexture(g_Texture,g_3DModel.pMaterials[i].strFile,i); } //设置材质的纹理ID g_3DModel.pMaterials[i].texureId=i; } glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); } WPARAMMainLoop() { MSGmsg; while (1) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message==WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } else { RenderScene(); } } //遍历场景中所有的对象 for(inti=0;i { //删除所有的变量 delete[]g_3DModel.pObject[i].pFaces; delete[]g_3DModel.pObject[i].pNormals; delete[]g_3DModel.pObject[i].pVerts; delete[]g_3DModel.pObject[i].pTexVerts; } DeInit(); return(msg.wParam); } voidRenderScene() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0,1.5f,8,0,0.5f,0,0,1,0); glRotatef(g_RotateX,0,1.0f,0); g_RotateX+=g_RotationSpeed; //遍历模型中所有的对象 for(inti=0;i { //如果对象的大小小于0,则退出 if(g_3DModel.pObject.size()<=0)break; //获得当前显示的对象 t3DObject*pObject=&g_3DModel.pObject[i]; //判断该对象是否有纹理映射 if(pObject->bHasTexture){ //打开纹理映射 glEnable(GL_TEXTURE_2D); glColor3ub(255,255,255); glBindTexture(GL_TEXTURE_2D,g_Texture[pObject->materialID]); }else{ //关闭纹理映射 glDisable(GL_TEXTURE_2D); glColor3ub(255,255,255); } //开始以g_ViewMode模式绘制 glBegin(g_ViewMode); //遍历所有的面 for(intj=0;j { //遍历三角形的所有点 for(intwhichVertex=0;whichVertex<3;whichVertex++) { //获得面对每个点的索引 intindex=pObject->pFaces[j].vertIndex[whichVertex]; //给出法向量 glNormal3f(pObject->pNormals[index].x,pObject->pNormals[index].y,pObject->pNormals[index].z); //如果对象具有纹理 if(pObject->bHasTexture){ //确定是否有UVW纹理坐标 if(pObject->pTexVerts){ glTexCoord2f(pObject->pTexVerts[index].x,pObject->pTexVerts[index].y); } }else{ if(g_3DModel.pMaterials.size()&&pObject->materialID>=0) { BYTE*pColor=g_3DModel.pMaterials[pObject->materialID].color; glColor3ub(pColor[0],pColor[1],pColor[2]); } } glVertex3f(pObject->pVerts[index].x,pObject->pVerts[index].y,pObject->pVerts[index].z); } } glEnd();//绘制结束 } SwapBuffers(g_hDC);//交换缓冲区 } LRESULTCALLBACKWinProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam) { LONGlRet=0; PAINTSTRUCTps; switch(uMsg) { caseWM_SIZE: if(! g_bFullScreen) { SizeOpenGLScreen(LOWORD(lParam),HIWORD(lParam)); GetClientRect(hWnd,&g_rRect); } break; caseWM_PAINT: BeginPaint(hWnd,&ps); EndPaint(hWnd,&ps); break; caseWM_LBUTTONDOWN: //按下鼠标左键,改变绘制模式 if(g_ViewMode==GL_TRIANGLES){ g_ViewMode=GL_LINE_STRIP; }else{ g_ViewMode=GL_TRIANGLES; } break; caseWM_RBUTTONDOWN: //按下鼠标右键,改变光照模式 g_bLighting=! g_bLighting; if(g_bLighting){ glEnable(GL_LIGHTING); }else{ glDisable(GL_LIGHTING); } break; caseWM_KEYDOWN: //键盘响应 switch(wParam){ caseVK_ESCAPE: //按下ESC键 PostQuitMessage(0); break; caseVK_LEFT: //按下向左键 g_RotationSpeed-=0.05f; break; caseVK_RIGHT: //按下向右键 g_RotationSpeed+=0.05f; break; } break; caseWM_CLOSE: PostQuitMessage(0); break; default: lRet=DefWindowProc(hWnd,uMsg,wParam,lParam); break; } returnlRet; } main.h/*main.h头文件*/ #ifndef_MAIN_H #define_MAIN_H #include #include #include #include #include #include #include #include #include #include usingnamespacestd; #defineSCREEN_WIDTH400 #defineSCREEN_HEIGHT300 #defineSCREEN_DEPTH16 #defineMAX_TEXTURES100//最大的纹理数目 //定义3D点的类,用于保存模型中的顶点 classCVector3 { public: floatx,y,z; }; //定义2D点类,用于保存模型的UV纹理坐标 classCVector2 { public: floatx,y; }; //面的结构定义 structtFace { intvertIndex[3];//顶点索引 intcoordIndex[3];//纹理坐标索引 }; //材质信息结构体 structtMaterialInfo { charstrName[255];//纹理名称 charstrFile[255];//如果存在纹理映射,则表示纹理文件名称 BYTEcolor[3];//对象的RGB颜色 inttexureId;//纹理ID floatuTile;//u重复 floatvTile;//v重复 floatuOffset;//u纹理偏移 floatvOffset;//v纹理偏移 }; //对象信息结构体 structt3DObject { intnumOfVerts;//模型中顶点的数目 intnumOfFaces;//模型中面的数目 intnumTexVertex;//模型中纹理坐标的数目 intmaterialID;//纹理ID boolbHasTexture;//是否具有纹理映射 charstrName[255];//对象的名称 CVector3*pVerts;//对象的顶点 CVector3*pNormals;//对象的法向量 CVector2*pTexVerts;//纹理UV坐标 tFace*pFaces;//对象的面信息 }; //模型信息结构体 structt3DModel { intnumOfObjects;//模型中对象的数目 intnumOfMaterials;//模型中材质的数目 vector vector }; externboolg_bFullScreen; externHWNDg_hWnd; externRECTg_rRect; externHDCg_hDC; externHGLRCg_hRC; externHINSTANCEg_hInstance; intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhprev,PSTRcmdline,intishow); LRESULTCALLBACKWinProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam); WPARAMMainLoop(); //生成纹理,并将其保存在纹理队列中 voidCreateTexture(UINTtextureArray[],LPSTRstrFileName,inttextureID); //改变显示为全屏模式 voidChangeToFullScreen(); //生成用户窗口 HWNDCreateMyWindow(LPSTRstrWindowName,intwidth,intheight,DWORDdwStyle,boolbFullScreen,HINSTANCEhInstance); //设置像素格式 boolbSetupPixelFormat(HDChdc); //初始化投影变换 voidSizeOpenGLScreen(intwidth,intheight); //初始化OpenGL voidInitializeOpenGL(intwidth,intheight); //初始化整个程序 voidInit(HWNDhWnd); //渲染场景 voidRenderScene(); //释放程序占用的内存空间 voidDeInit(); #endif Init.cpp/*从文件中创建纹理*/ #include"main.h" voidCreateTexture(UINTtextureArray[],LPSTRstrFileName,inttextureID) { AUX_RGBImageRec*pBitmap=NULL; if(! strFileName)//如果无此文件,则直接返回 return; pBitmap=auxDIBImageLoad(strFileName);//装入位图,并保存数据 if(pBitmap==NULL)//如果装入位图失败,则退出 exit(0); //生成纹理 glGenTextures(1,&textureArray[textureID]); //设置像素对齐格式 glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D,textureArray[textureID]); gluBuild2DMipmaps(GL_TEXTURE_2D,3,pBitmap->sizeX,pBitmap->sizeY,GL_RGB,GL_UNSIGNED_BYTE,pBitmap->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR); if(pBitmap)//释放位图占用的资源 { if(pBitmap->data) { free(pBitmap->data); } free(pBitmap); } } voidChangeToFullScreen() { DEVMODEdmSettings; memset(&dmSettings,0,sizeof(dmSettings)); if(! EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&dmSettings)) { MessageBox(NULL,"CouldNotEnumDisplaySettings","Error",
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 作业 报告