程序设计大作业报告.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;jnumOfFaces;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;//模型中材质的数目
vectorpMaterials;//材质链表信息
vectorpObject;//模型中对象链表信息
};
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",