杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告
- 格式:docx
- 大小:659.46 KB
- 文档页数:18
实时三维图形绘制
实验报告
基于粒子系统的雪花场景模拟
一、实验目的
通过一学期对《实时三维图形绘制》的学习,在熟练掌握OpenGL理论的前提下,动手实践,将课本知识转化为实际应用。
二、实验要求
编程实现绘制OpenGL场景并可交互式操作,体现课堂所学内容。
三、实验内容
1、搭建OpenGL程序框架
首先在VS2015中新建项目,在该项目中建立3个主要的类:GLWindow、Keys 和GLApplication,其中GLWindow类负责窗口属性的设置,包括建立、更新、删除窗口等操作。Keys类负责读取键盘的输入,这样才能实现交互的要求。GLApplication类负责建立我们的应用程序,包括初始化、更新、绘制图形等操作。
(1)窗口类GLWindow的设计
在新建项目中添加类GLWindow,它包括程序主窗口的属性,以及建立、改变和删除窗口的方法(具体程序见代码)。
/** windows窗口类 */
class GLWindow
{
public:
/** 构造函数 */
GLWindow();
/** 创建windows窗口 */
bool Create(const char * window_title, const char * class_name, bool
fullscreen,HINSTANCE h_instance, LPVOID lpParam);
/** 删除OpenGL窗口 */
void Destroy();
/** 改变窗口的显示设置 */
bool ChangeScreenSetting();
/** 当窗口大小改变时,通知OpenGL调整大小 */
void ReshapeGL();
/** Swap Buffers (Double Buffering) */
void SwapBuffers() { ::SwapBuffers(m_hDC); }
/** 设置窗口左上角的位置 */
void SetPosX(int x);
void SetPosX(unsigned short x) { SetPosX((signed short)x); }
void SetPosY(int y);
void SetPosY(unsigned short y) { SetPosY((signed short)y); }
/** 返回窗口的大小 */
int GetWidth();
int GetHeight();
/** 设置窗口的大小 */
void SetWidth(int width);
void SetHeight(int height);
/** 返回窗口左上角的位置 */
int GetPosX();
int GetPosY();
/** 设置窗口的颜色位深 */
void SetHiColor() { m_BitsPerPixel = 16; }
void SetTrueColor() { m_BitsPerPixel = 32; }
/** 重载运算符,可以让GL_Window m_Window声明后的m_Window作为窗口句柄使用 */
operator HWND() { return m_hWnd; }
private:
HWND m_hWnd; /**< 窗口句柄 */
HDC m_hDC; /**< 设备描述表 */
HGLRC m_hRC; /**< OpenGL渲染描述表 */
int m_WindowPosX; /**< 窗口的左上角的X位置 */ int m_WindowPosY; /**< 窗口的左上角的Y位置 */ int m_WindowWidth; /**< 窗口的宽度 */
int m_WindowHeight; /**< 窗口的高度 */
int m_ScreenWidth; /**< 全屏的宽度 */
int m_ScreenHeight; /**< 全屏的高度 */
int m_BitsPerPixel; /**< 颜色位深 */
bool m_IsFullScreen; /**< 是否全屏 */
};
(2)键盘类Keys的设计
定义键盘类Keys对我们的按键信息进行记录,用于程序达到交互的目的。/** 定义键盘类 */
class Keys
{
public:
/** 构造函数 */
Keys() { Clear(); }
/** 清空所有的按键信息 */
void Clear() { ZeroMemory(&m_KeyDown, sizeof(m_KeyDown)); }
/** 判断某个键是否按下 */
bool IsPressed(unsigned int key) { return (key < MAX_KEYS) ? (m_KeyDown[key] == true) : false; }
/** 设置某个键被按下 */
void SetPressed(unsigned int key) { if (key < MAX_KEYS) m_KeyDown[key] = true; }
/** 设置某个键被释放 */
void SetReleased(unsigned int key) { if (key < MAX_KEYS) m_KeyDown[key] = false; }
private:
static const unsigned int MAX_KEYS = 256;
bool m_KeyDown[MAX_KEYS]; /**< 保存256个按键的状态 */ };
(3)应用程序类GLApplication的设计
类GLApplication为我们的应用程序提供统一的接口,当我们实现不同的程序时不用再从头开始,只要实现其对应的接口方法即可。
/** 基本的程序类,继承它用来创建OpenGL程序 */
class GLApplication
{
public:
/** 创建一个全局的Create函数,这个函数必须被继承类实现 */
static GLApplication * Create(const char * class_name); /**< 创建你自己的子类 */
/** 虚析构函数 */
virtual ~GLApplication() {};
protected:
/** 下面的函数必须被继承类实现,完成基本的OpenGL渲染过程 */
virtual bool Init() = 0; /**< OpenGL的初始化 */
virtual void Uninit() = 0; /**< OpenGL的卸载 */
virtual void Update(DWORD milliseconds) = 0; /**< 执行OpenGL程序的更新 */