您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告
实时三维图形绘制实验报告基于粒子系统的雪花场景模拟一、实验目的通过一学期对《实时三维图形绘制》的学习,在熟练掌握OpenGL理论的前提下,动手实践,将课本知识转化为实际应用。二、实验要求编程实现绘制OpenGL场景并可交互式操作,体现课堂所学内容。三、实验内容1、搭建OpenGL程序框架首先在VS2015中新建项目,在该项目中建立3个主要的类:GLWindow、Keys和GLApplication,其中GLWindow类负责窗口属性的设置,包括建立、更新、删除窗口等操作。Keys类负责读取键盘的输入,这样才能实现交互的要求。GLApplication类负责建立我们的应用程序,包括初始化、更新、绘制图形等操作。(1)窗口类GLWindow的设计在新建项目中添加类GLWindow,它包括程序主窗口的属性,以及建立、改变和删除窗口的方法(具体程序见代码)。/**windows窗口类*/classGLWindow{public:/**构造函数*/GLWindow();/**创建windows窗口*/boolCreate(constchar*window_title,constchar*class_name,boolfullscreen,HINSTANCEh_instance,LPVOIDlpParam);/**删除OpenGL窗口*/voidDestroy();/**改变窗口的显示设置*/boolChangeScreenSetting();/**当窗口大小改变时,通知OpenGL调整大小*/voidReshapeGL();/**SwapBuffers(DoubleBuffering)*/voidSwapBuffers(){::SwapBuffers(m_hDC);}/**设置窗口左上角的位置*/voidSetPosX(intx);voidSetPosX(unsignedshortx){SetPosX((signedshort)x);}voidSetPosY(inty);voidSetPosY(unsignedshorty){SetPosY((signedshort)y);}/**返回窗口的大小*/intGetWidth();intGetHeight();/**设置窗口的大小*/voidSetWidth(intwidth);voidSetHeight(intheight);/**返回窗口左上角的位置*/intGetPosX();intGetPosY();/**设置窗口的颜色位深*/voidSetHiColor(){m_BitsPerPixel=16;}voidSetTrueColor(){m_BitsPerPixel=32;}/**重载运算符,可以让GL_Windowm_Window声明后的m_Window作为窗口句柄使用*/operatorHWND(){returnm_hWnd;}private:HWNDm_hWnd;/**窗口句柄*/HDCm_hDC;/**设备描述表*/HGLRCm_hRC;/**OpenGL渲染描述表*/intm_WindowPosX;/**窗口的左上角的X位置*/intm_WindowPosY;/**窗口的左上角的Y位置*/intm_WindowWidth;/**窗口的宽度*/intm_WindowHeight;/**窗口的高度*/intm_ScreenWidth;/**全屏的宽度*/intm_ScreenHeight;/**全屏的高度*/intm_BitsPerPixel;/**颜色位深*/boolm_IsFullScreen;/**是否全屏*/};(2)键盘类Keys的设计定义键盘类Keys对我们的按键信息进行记录,用于程序达到交互的目的。/**定义键盘类*/classKeys{public:/**构造函数*/Keys(){Clear();}/**清空所有的按键信息*/voidClear(){ZeroMemory(&m_KeyDown,sizeof(m_KeyDown));}/**判断某个键是否按下*/boolIsPressed(unsignedintkey){return(keyMAX_KEYS)?(m_KeyDown[key]==true):false;}/**设置某个键被按下*/voidSetPressed(unsignedintkey){if(keyMAX_KEYS)m_KeyDown[key]=true;}/**设置某个键被释放*/voidSetReleased(unsignedintkey){if(keyMAX_KEYS)m_KeyDown[key]=false;}private:staticconstunsignedintMAX_KEYS=256;boolm_KeyDown[MAX_KEYS];/**保存256个按键的状态*/};(3)应用程序类GLApplication的设计类GLApplication为我们的应用程序提供统一的接口,当我们实现不同的程序时不用再从头开始,只要实现其对应的接口方法即可。/**基本的程序类,继承它用来创建OpenGL程序*/classGLApplication{public:/**创建一个全局的Create函数,这个函数必须被继承类实现*/staticGLApplication*Create(constchar*class_name);/**创建你自己的子类*//**虚析构函数*/virtual~GLApplication(){};protected:/**下面的函数必须被继承类实现,完成基本的OpenGL渲染过程*/virtualboolInit()=0;/**OpenGL的初始化*/virtualvoidUninit()=0;/**OpenGL的卸载*/virtualvoidUpdate(DWORDmilliseconds)=0;/**执行OpenGL程序的更新*/virtualvoidDraw()=0;/**绘制OpenGL场景*//**通用的函数*/voidToggleFullscreen();/**切换全屏/窗口模式*/voidTerminateApplication();/**结束程序*/voidResizeDraw(boolenable){m_ResizeDraw=enable;}/**设置在窗口改变大小的时候,可以绘制*/Keysm_Keys;/**按键类*//**构造函数*/GLApplication(constchar*class_name);private:/**程序的主循环*/friendintWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow);intMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow);/**消息处理回调函数*/friendLRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);LRESULTMessage(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);staticconstUINTWM_TOGGLEFULLSCREEN=(WM_USER+1);/**自定义消息,在切换窗口模式的时候发送*/GLWindowm_Window;/**Window类*/constchar*m_ClassName;/**程序名*/boolm_IsProgramLooping;/**程序循环标记,如果为false,则退出程序*/boolm_CreateFullScreen;/**若为true,则创建全屏模式*/boolm_IsVisible;/**窗口是否可见*/boolm_ResizeDraw;/**是否在改变大小时,调用了绘制函数*/DWORDm_LastTickCount;/**上一次计时器的值*/};2、纹理贴图(1)BMP位图文件的载入BMP格式是windows采用的常见的图像文件存储格式。定义位图类CBMPLoader,实现位图文件的载入。/**位图载入类*/classCBMPLoader{public:CBMPLoader();~CBMPLoader();boolLoadBitmap(constchar*filename);/**装载一个bmp文件*/voidFreeImage();/**释放图像数据*/boolLoad(constchar*fileName);/**载入位图并创建纹理*/unsignedintID;/**生成纹理的ID号*/intimageWidth;/**图像宽度*/intimageHeight;/**图像高度*/unsignedchar*image;/**指向图像数据的指针*/};(2)绘制场景并纹理贴图绘制正方体和球体,并贴图。/**绘制球体*/voidSnowDemo::DrawSphere(){glPushMatrix();glTranslatef(3.0f,0.0f,-10.0f);glRotatef(rot,1.0f,1.0f,1.0f);/**指定纹理*/glBindTexture(GL_TEXTURE_2D,texture2.ID);GLUquadricObj*sphere=gluNewQuadric();gluQuadricOrientation(sphere,GLU_OUTSIDE);gluQuadricNormals(sphere,GLU_SMOOTH);gluQuadricTexture(sphere,GL_TRUE);gluSphere(sphere,2.5,50,50);gluDeleteQuadric(sphere);glPopMatrix();}/**绘制立方体*/voidSnowDemo::DrawBox(){/**设置材质属性*/GLfloatmat_ambient[]={0.8f,0.8f,0.8f,1.0f};GLfloatmat_diffuse[]={0.8f,0.8f,0.8f,1.0f};glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glPushMatrix();glTranslatef(-5.0f,0.0f,-10.0f);glRotatef(rot,1.0f,1.0f,0.0f);/**绘制六个面*////前侧面glBindTexture(GL_TEXTURE_2D,texture[0].ID);glBegin(GL_QUADS);glNormal3f(0.0f,0.0f,1.0f);/**指定法线指向观察者*/glTexCoord2f(0.0f,0.0f);glVertex3f(-2.0f,-2.0f,2.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(2.0f,-2.0f,2.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(2.0f,2.0f,2.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-2.0f,2.0f,2.0f);glEnd();///后侧面glBindTexture(GL_TEXTURE_2D,texture[1].ID);glBegin(GL_QUADS);glNormal3f(0.0f,0.0f,-1.0f);/**指定法线背向观察者*/glTexCoord2f(1.0f,0.0f);glVertex3f(-2.0f,-2.0f,-2.0f);glTexCoord2f(1.0f,1.
本文标题:杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告
链接地址:https://www.777doc.com/doc-5464902 .html