杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告

  • 格式:docx
  • 大小:659.46 KB
  • 文档页数:18

下载文档原格式

  / 18
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实时三维图形绘制

实验报告

基于粒子系统的雪花场景模拟

一、实验目的

通过一学期对《实时三维图形绘制》的学习,在熟练掌握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程序的更新 */