C语言程序设计大作业报告-OpenGL——舞动的文字旋转的校徽.doc_第1页
C语言程序设计大作业报告-OpenGL——舞动的文字旋转的校徽.doc_第2页
C语言程序设计大作业报告-OpenGL——舞动的文字旋转的校徽.doc_第3页
C语言程序设计大作业报告-OpenGL——舞动的文字旋转的校徽.doc_第4页
C语言程序设计大作业报告-OpenGL——舞动的文字旋转的校徽.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计大作业报告2013年6月24日学 院班 级学 号姓 名摘要本次大作业是在高级编程技术中的Win32编程模式,利用SDK编程框架,结合OpenGL的相关API调用,可以编写支持窗口的OpenGL应用程序的软件开发编程。此程序编写了Windows界面,能够动态显示2D图像和文字,3D图像:1、 以李萨如曲线轨迹动态显示“KANGYAO”、“2013OpenGL”、“NORTHWESTERN POLYTECHNICAL UNIVERSITY CPP BIGWORK”。2、 将西北工业大学校徽显示在两个旋转相互垂直正方形;3、 动静显示两个垂直的正方形绕两个静止的3D物体形成的轴转动。此程序能够动态显示文字和图形,静态显示四面体,动静结合,更生动,更加有三维立体感。此程序可作为校徽动态演示程序,更加有气势的显示了西北工业大学校徽。 目录1 摘要31.1 设计题目31.2 设计内容31.3 开发工具31.4 应用平台32 详细设计32.1 程序结构32.2 主要功能42.3 函数实现42.4 开发日志53 程序调试及运行63.1 程序运行结果63.2 程序使用说明73.3 程序开发总结74 附件(源程序)81 摘要1.1 设计题目OpenGL舞动的文字,旋转的校徽1.2 设计内容基于Windows界面编程下的SDK编程框架,调用OpenGL的相关API,设计一个图形输出、渲染的Windows窗口的程序,动态显示文字和图形:1、 运用四边形纹理贴图把文字和图像显示在屏幕上,把256个不同的文字从一个256x256的纹理图像中分别提取出来,并为每一个文字创建一个显示列表,接着创建一个输出函数来创建任意你希望的文字,以李萨如曲线轨迹动态显示“KANGYAO”、“2013OpenGL”、“NORTHWESTERN POLYTECHNICAL UNIVERSITY CPP BIGWORK”。2、 运用四边形纹理贴图将西北工业大学校徽显示在两个旋转相互垂直正方形;3、 使用三角形创建两个静止的3D物体金字塔形,动静显示,两个垂直的正方形绕两个3D物体形成的轴转动。运行程序,动态显示,按F1键退出全屏模式,按ESC键退出程序。1.3 开发工具Visual C+ 6.0和Win32SDKApp1.4 应用平台Windows 2000/XP/7 32位2 详细设计2.1 程序结构一、 程序的整体结构1. 在SDK编程框架基础上使用OpenGL,需要包含以下头文件:#include / Windows头文件#include / OpenGL核心库文件#include / OpenGL实用头文件#include /Visaul C+ OpenGL辅助库头文件2. SDK编程框架:a) 头文件和全局变量 b) Windows主函数 c) 根据用户设置配置OpenGL的窗口 d) 创建OpenGL运行的窗口,并返回窗口的句柄 e) 设置绘制字体的参数 f) 程序循环g) 退出程序3. 在SDK框架下,在DrawGLScene函数中绘制自己想要的图形,例如2D图形文字,3D图形等。二、 程序的流程1、 根据用户设置配置OpenGL的窗口 2、 创建OpenGL运行的窗口,并返回窗口的句柄3、 程序循环 运行DrawGLScene绘图函数,动态显示,屏幕时常刷新。4、 退出程序2.2 主要功能一、 以李萨如曲线轨迹动态显示“KANGYAO”、“2013OpenGL”、“NORTHWESTERN POLYTECHNICAL UNIVERSITY CPP BIGWORK”。二、 将西北工业大学校徽显示在两个旋转相互垂直正方形;三、 动静显示两个垂直的正方形绕两个静止的3D物体形成的轴转动。2.3 函数实现一、 主要的SDK框架函数1、 InitGL /初始化窗口2、 CALLBACK WndProc /窗口过程3、 CreateGLWindow/创建窗口4、 KillGLWindow/关闭窗口5、 WINAPI WinMain/SDK主函数二、 在DrawGLScene函数中调用绘图函数:1、 glBegin/图形绘制开始2、 glVertex2f/2D坐标确定点绘制多边形3、 glVertex3f/3D坐标确定点绘制多边形或3D图形4、 glTexCoord2d/纹理点坐标确定5、 glEnd/图形绘制结束6、 glRotatef/确定动态旋转轴和旋转速度7、 glColor3f/配置图形颜色8、 glTranslatef/调整图形在窗口显示位置2.4 开发日志刚开始的时候,先对已有的OpenGL例子进行输入,发现运行有错,头文件缺失,添加头文件。继续排错,发现有好多输入错误,大小写,没有分号等问题,面对错误不要惊慌,毕竟头一次编Windows窗口程序,但我把所有错排完以后,出现了一个问题,输出结果不是我想要的。这时就纠结。不知是哪个数据泄露了,或者不是自己控制。所以只得一边一边地看程序,看是哪出问题了。在一次一次的反复尝试中总结了,那些函数是干什么的,怎样值传递。在一次一次的摸索当中,不断的积累,对Windows窗口程序有了新的了解,对OpenGL的API函数有了认识,感觉OpenGL函数使用很方便。最后,运行成功了,得到我想要的结果。在这基础上,就要涉及开始自己的程序了。首先,绘制3D图形时,最重要的是算准3D图形空间坐标。在改参数的时候,很容易出错,需要更改好几次,看是哪出问题了,重新计算3D图形空间坐标。但参数改好的时候,运行结果预想的一样,感觉非常好。继续对它进行创作,在2D图形文字上加纹理图,使图形更加有标志性。 将这些代码编好以后对他进行调试,编译通过,整个程序趋向完善。最终,呈现现在的界面。3 程序调试及运行3.1 程序运行结果程序运行弹出窗口按F1退出全屏3.2 程序使用说明1. 运行程序,动态显示;2. 按F1键退出全屏模式;3. 按ESC键退出程序。3.3 程序开发总结一、 编写界面编程的收获很多:1、 了解了一些Windows界面编程语言,能够读懂一些程序2、 能够在SDK框架下,运用OpenGL的API函数编写窗口程序3、 能够运用OpenGL建简单的模型4、 当然还有,编写成功带来的快乐二、 对编写程序的思考:1、其实任何语言都有相同之处,了解其本质;就能很快地掌握另一门语言。Windows编程语言主要都是大写英文字母,大多数是首字母大写。在要用的时候可以直接查找这方面的书籍,很快就知道什么意义怎么用。调用函数也是同样的道理,可以根据要实现的功能来查找相应的函数。可已不用背许多代码。2、 Windows界面编程有着巨大的现实作用,是C+语言的延伸和拓展,一个C+语言具体应用的实例可通过Windows界面编程提高C+语言的编程能力,同时解决实际问题,来方便生活和学习,将计算机的作用发挥出来了。发展编程能力,最终达到:灵活自如应用,丰富多彩呈现。3、 OpenGL的API函数,是一个强大的绘图函数库,积累了前人的智慧,为后人方便编程。4 附件(源程序)#include #include #include #include #include #include HDChDC=NULL;HGLRChRC=NULL;HWNDhWnd=NULL;HINSTANCEhInstance;boolkeys256;boolactive=TRUE;boolfullscreen=TRUE;GLuintbase;GLuinttexture2;/纹理数组变量GLuintloop;GLfloatcnt1;GLfloatcnt2;LRESULTCALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);/ 声明CALLBACK WndProc函数AUX_RGBImageRec *LoadBMP(char *Filename) /加载图片函数 FILE *File=NULL; if (!Filename) return NULL; File=fopen(Filename,r); if (File) fclose(File); return auxDIBImageLoad(Filename); return NULL; int LoadGLTextures() / 加载图片到纹理里 int Status=FALSE; AUX_RGBImageRec *TextureImage2; memset(TextureImage,0,sizeof(void *)*2); if (TextureImage0=LoadBMP(Data/Font.bmp) &(TextureImage1=LoadBMP(Data/Bumps.bmp) Status=TRUE; glGenTextures(2, &texture0); for (loop=0; loopsizeX, TextureImageloop-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImageloop-data); for (loop=0; loopdata) free(TextureImageloop-data);free(TextureImageloop); return Status; GLvoid BuildFont(GLvoid)/用图片纹理创建字体floatcx;floatcy;base=glGenLists(256);glBindTexture(GL_TEXTURE_2D, texture0);for (loop=0; loop1)set=1;glBindTexture(GL_TEXTURE_2D, texture0);glDisable(GL_DEPTH_TEST);glMatrixMode(GL_PROJECTION);glPushMatrix();glLoadIdentity();glOrtho(0,640,0,480,-1,1);glMatrixMode(GL_MODELVIEW);glPushMatrix();glLoadIdentity();glTranslated(x,y,0);glListBase(base-32+(128*set);glCallLists(strlen(string),GL_UNSIGNED_BYTE,string);glMatrixMode(GL_PROJECTION);glPopMatrix();glMatrixMode(GL_MODELVIEW);glPopMatrix();glEnable(GL_DEPTH_TEST);GLvoid ReSizeGLScene(GLsizei width, GLsizei height)/调整和初始化窗口if (height=0)height=1;glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();int InitGL(GLvoid)/ 初始化函数if (!LoadGLTextures()return FALSE;BuildFont();glClearColor(0.0f, 0.0f, 0.0f, 0.0f);glClearDepth(1.0);glDepthFunc(GL_LEQUAL);glBlendFunc(GL_SRC_ALPHA,GL_ONE);glShadeModel(GL_SMOOTH);glEnable(GL_TEXTURE_2D);return TRUE;int DrawGLScene(GLvoid)/ 绘图函数glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 清屏glLoadIdentity();/ 重置当前观察矩阵glBindTexture(GL_TEXTURE_2D, texture1);/ 选择校徽图形纹理glTranslatef(0.0f,0.0f,-5.0f);/ 向窗口空间里缩进5个单位glRotatef(45.0f,0.0f,0.0f,1.0f);/ 绕Z轴旋转45glRotatef(cnt1*30.0f,1.0f,1.0f,0.0f);/ 沿(1,1,0)轴旋转30度glDisable(GL_BLEND);/ 关闭混合glColor3f(1.0f,1.0f,1.0f);/设置颜色为白色glBegin(GL_QUADS);/ 绘制第一个纹理四边形glTexCoord2d(0.0f,0.0f);glVertex2f(-1.0f, 1.0f);glTexCoord2d(1.0f,0.0f);glVertex2f( 1.0f, 1.0f);glTexCoord2d(1.0f,1.0f);glVertex2f( 1.0f,-1.0f);glTexCoord2d(0.0f,1.0f);glVertex2f(-1.0f,-1.0f);glEnd();glRotatef(90.0f,1.0f,1.0f,0.0f);/沿(1,1,0)轴旋转30度glBegin(GL_QUADS);/ 绘制第二个纹理四边形glTexCoord2d(0.0f,0.0f);glVertex2f(-1.0f, 1.0f);glTexCoord2d(1.0f,0.0f);glVertex2f( 1.0f, 1.0f);glTexCoord2d(1.0f,1.0f);glVertex2f( 1.0f,-1.0f);glTexCoord2d(0.0f,1.0f);glVertex2f(-1.0f,-1.0f);glEnd();glRotatef(-cnt1*30.0f,1.0f,1.0f,0.0f);/沿(1,1,0)轴旋转30度(反方向),使四面体静止glBegin(GL_TRIANGLES);/ 绘制第一个四面体glColor3f(1.0f,0.0f,0.0f);glVertex3f( 1.0f, 1.0f, 0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.035355f,1.10605f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f( 1.07071f,1.07071f, 0.05f);glColor3f(1.0f,0.0f,0.0f);glVertex3f( 1.0f, 1.0f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f( 1.07071f,1.07071f, 0.05f);glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.10605f,1.035355f, 0.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f( 1.0f, 1.0f, 0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.10605f,1.035355f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.07071f,1.07071f, -0.05f);glColor3f(1.0f,0.0f,0.0f);glVertex3f( 1.0f, 1.0f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.07071f,1.07071f, -0.05f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.035355f,1.10605f, 0.0f);glEnd();glBegin(GL_TRIANGLES);/ 绘制第二个四面体glColor3f(1.0f,0.0f,0.0f);glVertex3f( -1.0f, -1.0f, 0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.035355f,-1.10605f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f( -1.07071f,-1.07071f, 0.05f);glColor3f(1.0f,0.0f,0.0f);glVertex3f( -1.0f, -1.0f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f( -1.07071f,-1.07071f, 0.05f);glColor3f(0.0f,1.0f,0.0f);glVertex3f( -1.10605f,-1.035355f, 0.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f( -1.0f, -1.0f, 0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f( -1.10605f,-1.035355f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.07071f,-1.07071f, -0.05f);glColor3f(1.0f,0.0f,0.0f);glVertex3f( -1.0f, -1.0f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.07071f,-1.07071f, -0.05f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.035355f,-1.10605f, 0.0f);glEnd();glEnable(GL_BLEND);/打开混合glLoadIdentity();/ 重置当前观察矩阵glColor3f(1.0f*float(cos(cnt1),1.0f*float(sin(cnt2),1.0f-0.5f*float(cos(cnt1+cnt2);glPrint(int(280+250*cos(cnt1),int(235+200*sin(cnt2),KANGYAO,0);/ 以李萨如曲线轨迹显示KANGYAOglColor3f(1.0f*float(sin(cnt2),1.0f-0.5f*float(cos(cnt1+cnt2),1.0f*float(cos(cnt1);glPrint(int(280+230*cos(cnt2),int(235+200*sin(cnt1),2013OpenGL,1);/ 以李萨如曲线轨迹显示斜体2013OpenGLglColor3f(0.0f,0.0f,1.0f);/ 设置颜色为蓝色glPrint(int(70+80*cos(cnt2+cnt1),2,NORTHWESTERN POLYTECHNICAL UNIVERSITY CPP BIGWORK,0);/ 以水平简谐运动轨迹显示斜体NORTHWESTERN POLYTECHNICAL UNIVERSITY CPP BIGWORKglColor3f(1.0f,1.0f,1.0f);/ 设置颜色为白色glPrint(int(72+80*cos(cnt2+cnt1),2,NORTHWESTERN POLYTECHNICAL UNIVERSITY CPP BIGWORK,0);/ 以水平简谐运动轨迹显示斜体NORTHWESTERN POLYTECHNICAL UNIVERSITY CPP BIGWORKcnt1+=0.01f;/ 运动速度1cnt2+=0.0081f;/ 运动速度2return TRUE;/ 一切运行正确GLvoid KillGLWindow(GLvoid)/退出窗口函数if (fullscreen)ChangeDisplaySettings(NULL,0);ShowCursor(TRUE);if (hRC)if (!wglMakeCurrent(NULL,NULL)MessageBox(NULL,Release Of DC And RC Failed.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);if (!wglDeleteContext(hRC)MessageBox(NULL,Release Rendering Context Failed.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hRC=NULL;if (hDC & !ReleaseDC(hWnd,hDC)MessageBox(NULL,Release Device Context Failed.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hDC=NULL;if (hWnd & !DestroyWindow(hWnd)MessageBox(NULL,Could Not Release hWnd.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hWnd=NULL;if (!UnregisterClass(OpenGL,hInstance)MessageBox(NULL,Could Not Unregister Class.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hInstance=NULL;KillFont(); BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)/创建窗口函数GLuintPixelFormat;WNDCLASSwc;DWORDdwExStyle;DWORDdwStyle;RECTWindowRect;WindowRect.left=(long)0;WindowRect.right=(long)width;WindowRect.top=(long)0;WindowRect.bottom=(long)height;fullscreen=fullscreenflag;hInstance= GetModuleHandle(NULL);wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;wc.lpfnWndProc= (WNDPROC) WndProc;wc.cbClsExtra= 0;wc.cbWndExtra= 0;wc.hInstance= hInstance;wc.hIcon= LoadIcon(NULL, IDI_WINLOGO);wc.hCursor= LoadCursor(NULL, IDC_ARROW);wc.hbrBackground= NULL;wc.lpszMenuName= NULL;wc.lpszClassName= OpenGL;if (!RegisterClass(&wc)MessageBox(NULL,Failed To Register The Window Class.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if (fullscreen)DEVMODE dmScreenSettings;memset(&dmScreenSettings,0,sizeof(dmScreenSettings);dmScreenSettings.dmSize=sizeof(dmScreenSettings);dmScreenSettings.dmPelsWidth= width;dmScreenSettings.dmPelsHeight= height;dmScreenSettings.dmBitsPerPel= bits;dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)if (MessageBox(NULL,The Requested Fullscreen Mode Is Not Supported BynYour Video Card. Use Windowed Mode Instead?,NeHe GL,MB_YESNO|MB_ICONEXCLAMATION)=IDYES)fullscreen=FALSE;elseMessageBox(NULL,Program Will Now Close.,ERROR,MB_OK|MB_ICONSTOP);return FALSE;if (fullscreen)dwExStyle=WS_EX_APPWINDOW;dwStyle=WS_POPUP;ShowCursor(FALSE);elsedwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;dwStyle=WS_OVERLAPPEDWINDOW;AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);if (!(hWnd=CreateWindowEx(dwExStyle,OpenGL,title,dwStyle |WS_CLIPSIBLINGS |WS_CLIPCHILDREN,0, 0,WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,NULL)KillGLWindow();MessageBox(NULL,Window Creation Error.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;staticPIXELFORMATDESCRIPTOR pfd=sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,bits,0, 0, 0, 0, 0, 0,0,0,0,0, 0, 0, 0,16, 0,0,PFD_MAIN_PLANE,0,0, 0, 0;if (!(hDC=GetDC(hWnd)KillGLWindow();MessageBox(NULL,Cant Create A GL Device Context.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)KillGLWindow();MessageBox(NULL,Cant Find A Suitable PixelFormat.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if(!SetPixelFormat(hDC,PixelFormat,&pfd)KillGLWindow();MessageBox(NULL,Cant Set The PixelFormat.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if (!(hRC=wglCreateContext(hDC)KillGLWindow();MessageBox(NULL,Cant Create A GL Rendering Context.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;if(!wglMakeCurrent(hDC,hRC)KillGLWindow();MessageBox(NULL,Cant Activate The GL Rendering Context.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;ShowWindow(hWnd,SW_SHOW);SetForegroundWindow(hWnd);SetFocus(hWnd);ReSizeGLScene(width, height);if (!InitGL()KillGLWindow();MessageBox(NULL,Initialization Failed.,ERROR,MB_OK|MB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论