杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告(共29页).docx
《杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告(共29页).docx》由会员分享,可在线阅读,更多相关《杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告(共29页).docx(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实时三维图形绘制实验报告基于粒子系统的雪花场景模拟一、 实验目的通过一学期对实时三维图形绘制的学习,在熟练掌握OpenGL理论的前提下,动手实践,将课本知识转化为实际应用。二、 实验要求编程实现绘制OpenGL场景并可交互式操作,体现课堂所学内容。三、 实验内容1、搭建OpenGL程序框架首先在VS2015中新建项目,在该项目中建立3个主要的类:GLWindow、Keys和GLApplication,其中GLWindow类负责窗口属性的设置,包括建立、更新、删除窗口等操作。Keys类负责读取键盘的输入,这样才能实现交互的要求。GLApplication类负责建立我们的
2、应用程序,包括初始化、更新、绘制图形等操作。(1) 窗口类GLWindow的设计在新建项目中添加类GLWindow,它包括程序主窗口的属性,以及建立、改变和删除窗口的方法(具体程序见代码)。/* windows窗口类 */class GLWindowpublic:/* 构造函数 */GLWindow();/* 创建windows窗口 */boolCreate(const char * window_title, const char * class_name, bool fullscreen,HINSTANCE h_instance, LPVOID lpParam);/* 删除OpenGL窗口
3、 */voidDestroy();/* 改变窗口的显示设置 */boolChangeScreenSetting();/* 当窗口大小改变时,通知OpenGL调整大小 */voidReshapeGL();/* Swap Buffers (Double Buffering) */voidSwapBuffers() :SwapBuffers(m_hDC); /* 设置窗口左上角的位置 */voidSetPosX(int x);voidSetPosX(unsigned short x) SetPosX(signed short)x); voidSetPosY(int y);voidSetPosY(un
4、signed short y) SetPosY(signed short)y); /* 返回窗口的大小 */intGetWidth();intGetHeight();/* 设置窗口的大小 */voidSetWidth(int width);voidSetHeight(int height);/* 返回窗口左上角的位置 */intGetPosX();intGetPosY();/* 设置窗口的颜色位深 */voidSetHiColor() m_BitsPerPixel = 16; voidSetTrueColor() m_BitsPerPixel = 32; /* 重载运算符,可以让GL_Wind
5、ow m_Window声明后的m_Window作为窗口句柄使用 */operator HWND() return m_hWnd; private:HWNDm_hWnd;/* 窗口句柄 */HDCm_hDC;/* 设备描述表 */HGLRCm_hRC;/* OpenGL渲染描述表 */intm_WindowPosX;/* 窗口的左上角的X位置 */intm_WindowPosY;/* 窗口的左上角的Y位置 */intm_WindowWidth;/* 窗口的宽度 */intm_WindowHeight;/* 窗口的高度 */intm_ScreenWidth; /* 全屏的宽度 */intm_Scr
6、eenHeight; /* 全屏的高度 */intm_BitsPerPixel;/* 颜色位深 */bool m_IsFullScreen; /* 是否全屏 */;(2) 键盘类Keys的设计定义键盘类Keys对我们的按键信息进行记录,用于程序达到交互的目的。/* 定义键盘类 */class Keys public:/* 构造函数 */Keys() Clear(); /* 清空所有的按键信息 */void Clear() ZeroMemory(&m_KeyDown, sizeof(m_KeyDown); /* 判断某个键是否按下 */bool IsPressed(unsigned int ke
7、y) return (key MAX_KEYS) ? (m_KeyDownkey = true) : false; /* 设置某个键被按下 */void SetPressed(unsigned int key) if (key MAX_KEYS) m_KeyDownkey = true; /* 设置某个键被释放 */void SetReleased(unsigned int key) if (key MAX_KEYS) m_KeyDownkey = false; private:static const unsigned int MAX_KEYS = 256;bool m_KeyDownMAX
8、_KEYS; /* 保存256个按键的状态 */;(3) 应用程序类GLApplication的设计类GLApplication为我们的应用程序提供统一的接口,当我们实现不同的程序时不用再从头开始,只要实现其对应的接口方法即可。/* 基本的程序类,继承它用来创建OpenGL程序 */class GLApplicationpublic:/* 创建一个全局的Create函数,这个函数必须被继承类实现 */static GLApplication * Create(const char * class_name);/* 创建你自己的子类 */* 虚析构函数 */virtual GLApplicati
9、on() ;protected:/* 下面的函数必须被继承类实现,完成基本的OpenGL渲染过程 */virtual boolInit() = 0;/* OpenGL的初始化 */ virtual voidUninit() = 0;/* OpenGL的卸载 */virtual voidUpdate(DWORD milliseconds) = 0; /* 执行OpenGL程序的更新 */virtual voidDraw() = 0; /* 绘制OpenGL场景 */* 通用的函数 */voidToggleFullscreen(); /* 切换 全屏/窗口模式 */voidTerminateApp
10、lication(); /* 结束程序 */voidResizeDraw(bool enable) m_ResizeDraw = enable; /* 设置在窗口改变大小的时候,可以绘制 */Keysm_Keys; /* 按键类 */* 构造函数 */GLApplication(const char * class_name);private:/* 程序的主循环 */friend int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);intMain(HINS
11、TANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);/* 消息处理回调函数 */friend LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);LRESULTMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);static const UINT WM_TOGGLEFULLSCREEN = (WM_USER + 1);/* 自定
12、义消息,在切换窗口模式的时候发送 */GLWindowm_Window;/* Window类 */const char* m_ClassName;/* 程序名 */boolm_IsProgramLooping;/* 程序循环标记,如果为false,则退出程序 */bool m_CreateFullScreen; /* 若为true,则创建全屏模式 */boolm_IsVisible;/* 窗口是否可见 */boolm_ResizeDraw;/* 是否在改变大小时,调用了绘制函数 */DWORD m_LastTickCount; /* 上一次计时器的值 */;2、 纹理贴图(1)BMP位图文件的
13、载入BMP格式是windows采用的常见的图像文件存储格式。定义位图类CBMPLoader,实现位图文件的载入。/* 位图载入类 */class CBMPLoader public: CBMPLoader(); CBMPLoader(); bool LoadBitmap(const char *filename); /* 装载一个bmp文件 */ void FreeImage(); /* 释放图像数据 */ bool Load(const char* fileName); /* 载入位图并创建纹理 */ unsigned int ID; /* 生成纹理的ID号 */ int imageWidt
14、h; /* 图像宽度 */ int imageHeight; /* 图像高度 */ unsigned char *image; /* 指向图像数据的指针 */;(2) 绘制场景并纹理贴图绘制正方体和球体,并贴图。/* 绘制球体 */void SnowDemo: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 =
15、gluNewQuadric();gluQuadricOrientation(sphere, GLU_OUTSIDE);gluQuadricNormals(sphere, GLU_SMOOTH);gluQuadricTexture(sphere, GL_TRUE);gluSphere(sphere, 2.5, 50, 50);gluDeleteQuadric(sphere);glPopMatrix();/* 绘制立方体 */void SnowDemo:DrawBox()/* 设置材质属性 */GLfloat mat_ambient = 0.8f, 0.8f, 0.8f, 1.0f ;GLfloa
16、t mat_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, texture0.ID);glBegin(GL_QUADS);glNorma
17、l3f(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_
18、2D, texture1.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.0f); glVertex3f(-2.0f, 2.0f, -2.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f, 2.0f, -2.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, -2.0f,
19、 -2.0f);glEnd();/ 顶面glBindTexture(GL_TEXTURE_2D, texture2.ID);glBegin(GL_QUADS);glNormal3f(0.0f, 1.0f, 0.0f);/* 指定法线向上 */glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 2.0f, -2.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);glTexCoord2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实时三维图形绘制 杭州 电子科技大学 实时 三维 图形 绘制 OpenGL 作业 实验 报告 29
限制150内