基于opengl的3d游戏的设计与实现内容摘要:

设备描述表 (DC)说明了笔和画刷的颜色绘制模式,调色盘信息,映射模式,以及其他 Windows 必须知道的怎样显示图形的属性。 与其他的 Windows 应用程序一样, OpenGL 应用程序也必须应用DC。 不过我们将其称为着色描述表( Rendering Context, RC),由它通知 Windows在窗口中绘制图形。 每一个 OpenGL都被连接到一个 RC上。 RC将所有的 OpenGL调用命令 连接到 DC上,应用程序必须在绘图之前调用专用函数 wglCreateContext()创建自己的 RC,调用 wglMakeCurrent 使其当前化,退出 OpenGL 时使 RC 非当前化。 及 主要要完成窗口的设置: 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。 /** 是否全屏 */ 以及 设置像素格式,设置像素格式首先要填充 PIXELFORMATDESCRIPTOR 结构,其默认设置如下 PIXELFORMATDESCRIPTOR pfd = /** 设置像素描述结构 */ { sizeof(PIXELFORMATDESCRIPTOR), /** 像素描述结构的大小*/ 1, /** 版本号 */ PFD_DRAW_TO_WINDOW | /** 缓存区的输出显示在一个窗口中 */ PFD_SUPPORT_OPENGL | /** 缓存区支持 OpenGL绘图 */ PFD_STEREO | /** 颜色缓存区是立体缓存 */ PFD_DOUBLEBUFFER, /** 颜色缓存区是双缓存 */ PFD_TYPE_RGBA, /** 使用 RGBA颜色格式 */ m_BitsPerPixel, /** 颜色缓存区中颜色值精品毕业论文、毕业设计,优质的论文服务: 精品论文网 提供毕业设计 (论文)和图文教程、视频教程等一揽子解决方案 所占的位深 */ 0, 0, 0, 0, 0, 0, /** 使用默认的颜色设置 */ 0, /** 无 Alpha缓存 */ 0, /** 颜色缓存区中 alpha成分的移位计数 */ 0, /** 无累计缓存区 */ 0, 0, 0, 0, /** 累计缓存区无移位 */ 32, /** 32位深度缓存 */ 0, /** 无蒙版缓存 */ 0, /** 无辅助缓存区 */ PFD_MAIN_PLANE, /** 必须为PFD_MAIN_PLANE,设置为主绘图层 */ 0, /** 表示 OpenGL实现所支持的上层或下层平面的数量 */ 0, 0, 0 /** 过时,已不再使用 */ }。 位图载入类 CBMPLoader BMP 图像文件格式 [3] BMP 是一种与硬件设备无关的图像 文件格式 ,使用非常广。 它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此, BMP 文件所占用的空间很大。 BMP 文件的图像深度可选 lbit、 4bit、 8bit及 24bit。 BMP 文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。 由于 BMP 文件格式是 Windows 环境中交换与图有关的数据的一种标准,因此在 Windows 环境中运行的图形图像软件都支持 BMP 图像格式。 典型的 BMP 图像文件由三部分组成 :位图文件头数据结构,它包含BMP 图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP 图像的宽、高、压缩方法,以及定义颜色等信息。 BMP 是( Windows 位图 ) Windows 位图可以用任何颜色深度(从黑白到 24 位颜色)存储单个光栅图像。 Windows 位图文件格式与其他 Microsoft Windows 程序兼容。 它不支持文件压缩,也不适用于 Web 页。 从总体上看, Windows 位图文件格式的缺点超过了它的优点。 为了保证照片图像的质量,请使用 PNG 、 JPEG、 TIFF 文件。 BMP 文件适用于 Windows 中的墙纸。 精品毕业论文、毕业设计,优质的论文服务: 精品论文网 提供毕业设计 (论文)和图文教程、视频教程等一揽子解决方案 优点: BMP 支持 1 位到 24 位颜色深度。 BMP 格式与现有 Windows 程序(尤其是较旧的程序)广泛兼容。 缺点: BMP 不支持压缩,这会造成文件非常大。 BMP 文件不受 Web 浏览器支持。 位图载入类 CBMPLoader 流程图 如图 所示: 图 位图载入类流程图 基本框架的组成 键盘类和程序框架类( GLFrame): 键盘类: class Keys { public: Keys() { Clear()。 } /** 构造函数 */ void Clear() { ZeroMemory(amp。 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] = 打开文件并检查错误 读位图文件头信息判断是否为位图文件 读全文件 保存文件 创建指针 进行文件格式转换将 BGR转为 RGB 是 退出并报错 否 精品毕业论文、毕业设计,优质的论文服务: 精品论文网 提供毕业设计 (论文)和图文教程、视频教程等一揽子解决方案 false。 }/** 设置某个键被释放 */ private: static const unsigned int MAX_KEYS = 256。 bool m_KeyDown[MAX_KEYS]。 /** 保存 各 按键的状态 */ }。 在继承类中完成以下函数的实现 GLApplication * GLApplication::Create(const char * class_name) //创建子类的一个实例 bool Init()。 //执行所有的初始化工作,如果成功函数返回 true void Uninit()。 // 执行所有的卸载工作 void Update(DWORD milliseconds)。 //执行所有的更新操作,传入的参数为两次操作经过的时间,以毫秒 //为单位 void Draw()。 //执行所有的绘制操作 windowExtendedStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE。 /** 使窗口具有 3D 外观 */ 5 视角控制 摄像机类解构图 如图 所示 摄像机类 设置速度 位置 旋转方向 根据鼠标设置摄像机观察方向 前后移动 左右移动 放置摄像机位置 与键盘关联 精品毕业论文、毕业设计,优质的论文服务: 精品论文网 提供毕业设计 (论文)和图文教程、视频教程等一揽子解决方案 图 摄像机类结构图 摄像机类主要的功能是实现三维漫游。 第一要做的事就是设置摄像机的位置: 设置摄像机的位置 ,朝向和向上向量。 设置函数为: void Camera::setCamera( float positionX, float positionY, float positionZ, float viewX, float viewY, float viewZ, float upVectorX, float upVectorY, float upVectorZ) 摄像机旋转功能的实现 旋转摄像机 旋转摄像机方向 函数为: void Camera::rotateView(float angle, float x, float y, float z) Angle为旋转的角度值, X,Y,Z为初始的位置。 Angle值由库函数获取。 下面是实现计算摄像机在空间中旋转了 angle弧度后,计算其视点 View更新的值newView。 Vector3 view = m_View m_Position。 /** 计算方向向量 */ /** 计算 sin 和 cos值 */ float cosTheta = (float)cos(angle)。 float sinTheta = (float)sin(angle)。 /** 计算旋转向量的 x值 */ = (cosTheta + (1 cosTheta) * x * x) *。 += ((1 cosTheta) * x * y z * sinTheta) *。 += ((1 cosTheta) * x * z + y * sinTheta) *。 /** 计算旋转向量的 y值 */ = ((1 cosTheta) * x * y + z * sinTheta) *。 += (cosTheta + (1 cosTheta) * y * y) *。 += ((1 cosTheta) * y * z x * sinTheta) *。 /** 计算 旋转向量的 z值 */ 精品毕业论文、毕业设计,优质的论文服务: 精品论文网 提供毕业设计 (论文)和图文教程、视频教程等一揽子解决方案 = ((1 cosTheta) * x * z y * sinTheta) *。 += ((1 cosTheta) * y * z + x * sinTheta) *。 += (cosTheta + (1 cosTheta) * z * z) *。 /** 更新摄像机的方向 */。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。