程序设计大作业报告.docx

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

程序设计大作业报告.docx

《程序设计大作业报告.docx》由会员分享,可在线阅读,更多相关《程序设计大作业报告.docx(43页珍藏版)》请在冰点文库上搜索。

程序设计大作业报告.docx

程序设计大作业报告

学院

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",

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

当前位置:首页 > 经管营销 > 经济市场

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

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