基于opengl的虚拟场景实现技术的研究与实现内容摘要:
OpenGL 需要的动态链接库 OpenGL 需要的头文件 OpenGL 指的是开放图形程序库 (Open Graphics Library),是由 Silicon Graphics Incorporated(SGI 公司 )为其图形工作站 IRIS 开发的一种快速的、高质量的 3D 图形软件,是近几年 发展起来的一个性能卓越的三维图形平台。 它的独立性、开放性、前瞻性和跨平台性。 它被集成到 Unix、 Windows 20 Windows XP 等窗口操作系统中。 OpenGL 集成了所有几何建模、图形变换、光源设置、材质设置、纹理映射、运动模糊、像素操作、融合等复杂的计算机图形算法。 开发人员可以利用这些函数对整个三维图形轻松进行渲染,这些都为三维图形开发提供了良好的便利条件。 在 VC++ 开发环境下 OpenGL 的编辑框架: 1) 构造 OpenGL 窗口风格; 2) 设置支持 OpenGL 的像素格式; 第 6 页 共 28 页 3) 创建 OpenGL 的绘图 描述表,并将其设置为当前绘图描述表; 4) 初始化 OpenGL 的绘制环境,例如光照模型、颜色和深度缓冲区的设置; 5) 添加 Windows 消息处理函数,例如鼠标、窗口、键盘消息,在这些消息处理函数中,就包含了 OpenGL 的绘制命令; 6) 在应用程序结束并撤消视窗时,删除绘制描述表。 最后,应把 和 3 个静态库加入到应用程序中,它们可以支持开发者对 100 多个 OpenGL 图形函数的调用 [7]。 构建系统的硬件环境 本系统建立所需的硬件平台是 : CPU: Intel( R) Celeron( R) 内存: 256M 显卡: Geforce4 MX 440 本章小结 本章先对三维虚拟场景漫游实验系统的总体功能进行了简单的描述,然后讲述了系统的模块划分结构,最后描述了系统的开发环境。 3 虚拟场景漫游实验 系统 的实现 笔者使用 VC++ 结合 OpenGL 技术实现了虚拟场景漫游实验系统。 本章详细 说明了 系统中 OpenGL 程序基本框架的建立,天空构建、地形的模拟,汽车、飞机模型的绘制,场景中树林的生成,最后描述了场景中的漫游控制的决方案和具体实现过程。 OpenGL程序基本框 架的建立 虚拟场景漫游实验系统需要建立 OpenGL 绘制窗口,本节说明了建立 OpenGL 窗口的准备工作和 OpenGL 窗口建立的详细过程。 创建 OpenGL 的渲染上下文 OpenGL 的绘图方式与 Windows 的一般的绘图方式是不同的,其区别主要表现在以下三个方面: (1) Windows 采用的是 GDI 绘图; (2) OpenGL 采用的是渲染上下文 RC( Render Context,又称渲染描述表)绘图; (3) OpenGL 使用的是特殊的像素格式。 在 Windows 中使用 GDI 绘图时必须指定在哪个设备上下文( Device Context,又称设备描述表)中绘制,同样地,在使用 OpenGL 函数时也必须指定一个所谓的渲染上下文。 正如设备上下文 DC要存储 GDI 的绘制环境信息如笔、刷和字体等,渲染上下文 RC 也必须存储 OpenGL 所需的渲染信息 , 如像素格式等。 渲染上下文主要由以下六个 wgl函数来管理 1. HGLRC wglCreateContext(HDC hdc) 第 7 页 共 28 页 该函数用来创建一个 OpenGL 可用的渲染上下文 RC。 Hdc 必须是一个合法的支持至少16 色的屏幕设备描述表 DC 或内存设备描述表的句柄。 该函数在调用之前,设备描述 表必须设置好适当的像素格式。 成功创建渲染上下文之后, hdc 可以被释放或删除。 函数返回NULL 值表示失败,否则返回值为渲染上下文的句柄。 2. BOOL wglDeleteContext(HGLRC hglrc) 该函数删除一个 RC。 一般应用程序在删除 RC 之前,应使它成为非现行 RC。 不过,删除一个现行 RC 也是可以的。 此时, OpenGL 系统冲掉等待的绘图命令并使之成为非现行 RC,然后删除之。 注意在试图删除一个属于别的线程的 RC时会导致失败。 3. HGLRC wglGetCurrentContext(void) 该函数返回 线程的现行 RC,如果线程无现行 RC 则返回 NULL。 4. HDC wglGetCurrentDC(void) 该函数返回与线程现行 RC关联的 DC,如果线程无现行 RC 则返回 NULL。 5. BOOL wglMakeCurrent(HDC hdc, HGLRC hglrc) 该函数把 hdc 和 hglrc 关联起来,并使 hglrc 成为调用线程的现行 RC。 如果传给 hglrc的值为 NULL,则函数解除关联,并置线程的现行 RC 为非现行 RC,此时忽略 hdc 参数。 传给该函数的 hdc 可以不是调用 wglCreateContext 时使用的值,但 是,它们所关联的设备必须相同并且拥有相同的像素格式。 注意,如果 hglrc 是另一个线程的现行 RC,则调用失败。 6. BOOL wglUseFontBitmaps(HDC hdc, DWORD dwFirst, DWORD dwCount, DWORD dwBase) 该函数使用 hdc 的当前字体,创建一系列指定范围字符的显示表。 可以利用这些显示表在 OpenGL 窗口画 GDI 文本。 如果 OpenGL 窗口是双缓冲的,那么这是往后缓冲区中画 GDI 文本的唯一途径。 在使用单个 RC 的应用程序中,在相应 WM_CREATE 消息时创建 RC,当 WM_CLOSE 或WM_DESTROY 到来时再删除它。 在使用 OpenGL 命令往窗口中绘图之前,必须先建立一个 RC,并使之成为现行 RC。 OpenGL 命令无需提供 RC,它将自动使用现行 RC。 若无现行 RC, OpenGL将简单地忽略所有的绘图命令。 OpenGL 的像素格式设置 首先获取需要绘图的设备环境( DC) ,选择合适的像素格式 并为该设备环境设置像素格式, 然后 创建基于该设备环境的 OpenGL 的 RC 渲染上下文 设备。 最后, 绑定 DC 和 RC, 初始化 OpenGL 绘制场景及状态设置 , PIXELFORMATDESCRIPTOR 是像素结构体。 int pixelformat。 PIXELFORMATDESCRIPTOR pfd={ sizeof(PIXELFORMATDESCRIPTOR), // pfd 结构的大小 1, // 版本号 PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图 第 8 页 共 28 页 PFD_SUPPORT_OPENGL | // 支持 OpenGL PFD_DOUBLEBUFFER, //双缓存模式 PFD_TYPE_RGBA, //RGBA 颜色模式 16, // 24 位颜色深度 0, 0, 0, 0, 0, 0, //忽略颜色位 0, // 没有非透明度缓存 0, // 忽略移位位 0, // 无累加缓存 0, 0, 0, 0, // 忽略累加位 16, //32 位深度缓存 0, // 无模板缓存 0, // 无辅助缓存 PFD_MAIN_PLANE, //主层 0, //保留 0,0,0 //忽略层 ,可见性和损毁掩模 }。 m_pDc=GetDC()。 //得到环境设备句柄 int iFormat=ChoosePixelFormat(m_pDCm_hDC,amp。 pfd)。 //设置象素格式 SetPixelFormat(m_pDCm_hDC,iFormat,amp。 pfd)。 //设置象素 m_hGlrc = wglCreateContext(m_pDCm_hDC)。 //创建渲染上下文 wglMakeCurrent(m_hDCm_hDC,m_hGlrc)。 //设置一个线程的当前绘图描述表 这里首先对描述像素存储格式的 PIXELFORMATDESCRIPTOR 结构变量进行了填充,在得到设备环境句柄后调用 ChoosePixelFormat()和 SetPixelFormat()函数以返回并设置最佳匹配的像素格式。 最后调用 wglCreateContext()创建一个渲染上下文 RC 并将其作为参数通过 wglMakeCurrent()来建立一个当前的绘图描述表,并在绘制完毕后(通常在WM_DESTORY 消息发出后执行)将其释放: if (m_hGlrc! = null) wglDeleteContext(m_hGlrc)。 //释放 RC OpenGL 窗口的建立流程 如 果 在 窗 口 系 统 中 使 用 OpenGL 则 必 须 给 窗 口 加 上 WS_CLIPSIBLINGS 和WS_CLIPCHILDREN 两个属性,否则只能得到黑色的屏幕。 OpenGL 窗口的建立需要从窗口句柄中获取设备描述表( Device Context),然后创建 OpenGL绘图所需要的渲染上下文( Render Context)。 图 2是建立 OpenGL 窗口的 流程示意图。 第 9 页 共 28 页 图 2 OpenGL 窗口的建立流程图 1. 初 始化并设置当前着色描述表 g_hDC=GetDC(g_hWnd)。 //根据窗口句柄获取设备描述表 if(!bSetupPixelFormat(g_hDC))//在 DC设备上设置匹配的象素格式 PostQuitMessage(0)。 g_hRC = wglCreateContext(g_hDC)。 //用 wglCreateContext 函数创建一个 RC wglMakeCurrent(g_hDC, g_hRC)。 //用 wglMakeCurrent 函数把它作为当前线程的 RC 2. 初始化 OpenGL 场景 glClearDepth()。 //定义深度缓冲区的清楚值 glEnable(GL_TEXTURE_2D)。 //开启 2D 纹理映射 第 10 页 共 28 页 glEnable(GL_DEPTH_TEST)。 //启用深度测试 glEnable(GL_LIGHT1); //使用 1 号光源 3. 处理视口变换和设置图形显示模式 通过视口变换在实际屏幕窗口中定义一个观察或显示虚拟场景的视口,由于 Windows窗口大小发生变化时, OpenGL 不会自动调整视口,须用 SizeOpenGLScreen ()函数进行处理。 另外,为了使三维物体变换为二维图形显示出来,必须 设置投影变换图形显示模式。 最常用、最基本的投影模式为:正射投影( Orthographic Projection)和透视投影( Perspective Projection)。 glViewport(0,0,width,height)。 //重置当前的视口( Viewport) glMatrixMode(GL_PROJECTION)。 //选择投影矩阵 glLoadIdentity()。 //重置投影矩阵 gluPerspective(,(GLfloat)width/(GLfloat)height, 4 ,)。 //计算窗口的外观比例 glMatrixMode(GL_MODELVIEW)。 //选择模型观察矩阵 glLoadIdentity()。 //重置模型观察矩阵 4. 程序退出处理 当处理完毕后,必须释放着色描述表并删除与之相连的 DC对象。 程序实现如下: wglMakeCurrent(NULL,NULL)。 //释放 DC和 RC的关联 wglDeleteContext(g_hRC)}。 //释放渲染描述表 ReleaseDC(g_hWnd,g_hDC)。 //释放上下文设备 UnregisterClass(GameTutorials,g_hInstance)。 //注销窗口类 PostQuitMessage (0)。 //向系统发出退出消息 三维虚拟 场景漫游实验系统的模型的建立 虚拟场景漫游实验系统的模型的建立包括了天空的模拟、地形的模拟、场景中雷达模型的建立、场景中汽车和飞机模型的构建、场景中树林的生成。 天空的模拟 天 空 是由一个长方体 (称为天空盒 ),在它的各个面上贴有表示天的图片形成的 (如图二、图三所示)。 用于天空背景的图片有特殊要求。 4 面图的边与顶图的边相连, 4 面图前后相连。 图片大小为 2 的 N 次方 (3 6 128...)。 图 3是立体天空盒子的构造示意图 ,在场景中绘制的天空图如图 4所示。 第 11 页 共 28 页 图 3 立体天空盒展开的平面图 图 4 绘制的立体天空的效果图 以下是实现构造立体天空盒子的关键代码: LoadT8(images/,g。基于opengl的虚拟场景实现技术的研究与实现
相关推荐
nextents 1 16 maxextents 99 17 pctincrease 0) 18 tablespace hyuser。 表已创建。 SQL select * from books。 BOOKID BOOKNAME CATEGORY AMOUNT LEFT_AMOUNT ISDISCOUNT PRICE DISCOUNTPRICE AUTHOR PUBLISH
M A X 7 5 0C 1C 2 (a) 上电复位电路 (b) 手动复位电路 (c) 自动复位电路 图 复位电路 手 动 复位电 路 是上电复位与 手 动 复位相结合的方 案 ,如 图 (b)所 示。 上电复位过 程与 图 (a)所 示 相 似。 手 动 复位时,按下复位按 钮 ,电容 C通 过 1kΩ电 阻 迅 速 放电,使 RST端迅 速 变 为高电 平 ,复位按 钮松 开 后,电容通 过
数,而构成一个倒排基本单位。 例如,一本旅游类书籍的第 130 页讲述了“冰糖葫芦”的来历。 在经过倒排后,“冰糖葫芦”被作为一个单独的关键字切分出来,保存在索引中,同时还带有其页码“ 130”,作为索引项的内容。 这样,当信息检索系统检索“冰糖葫芦”这个关键字 时,系统就可以迅速给出其页码,然后再到原书中取出相关页面文本内容。 这种查找方式要比从第 1页开始,线性匹配所有文本
而产生的,它是一个由可多到 65000 个无线数传模块组成的一个无线数传网络平台,十分类似现有的移动通信的 CDMA 网或 GSM 网,每一个 Zigbee 网络数传 模块类似移动网络的一个基站,在整个网络范围内,它们之间可以进行相互通信。 每个网络节点间的距离可以从标准的 75米,到扩展后的几百米,甚至几公里。 另外整个 Zigbee 网络还可以与现有的其它的各种网络连接。 Zigbee
.................. 30 哈尔滨理工大学学士学位论文 VI 报警主机的安装原则 ................................................................... 30 报警器防范范围 .......................................................................
C 语言知识,也对编程及 3D 设计产生了一定的兴趣,分析问题和解决问题的能力也得到了不小的提高。 而且,我也学到了很多人生的道理。 在做一件看似很难的事时,我14 们要有一个总体的框架,不要有畏难心理。 静下心来,沉着的分析问题,问题总会迎刃而解的。 因此,成功的关键在于你是否拥有这样的心理。 参考文献 [1]孙鑫 VC++深入详解 第三版 北京 电子工业出版社 2020年 126