基于opengl粒子系统的喷泉模拟内容摘要:
算转换成二维图像并显示或打印出来的技术。 OpenGL 就是支持这种转换的程序库,它源于 SGI 公司为其图形 工作站 开发的 IRIS GL,在跨平台移植过程中发展成为 OpenGL。 湖南大学毕业设计 (论文 ) 第 7 页 湖南大学软件学院 OpenGL是目前用于开发可移植的、可交互的 2D 和 3D 图形应用程序的首选环境,也是目前应用最广泛的计算机图形标准。 OpenGL 是一套的计算机图形处理系统,是图形硬件的软件接口, GL 代表图形库( Graphics Library)。 OpenGL 具有可移植性,任何一个 OpenGL 应用程序无须考虑其运行环境所在平台与操作系统,在任何一个遵循OpenGL标准的环境下都会产生相同的可视效果。 OpenGL不是一种编程语言,而是一种 API( Application Programming Interface,应用程序编程接口)。 当我们说某个程序是基于 OpenGL的或者说它是个 OpenGL程序是,意思是说它是用某种编程语言如 C 或 C++编写的,其中调用了一个或多个 OpenGL库函数。 作为一种 API, OpenGL遵循 C 语言的调用约定。 OpenGL主要包括三个函数库,它们是核心库、实用函数库和编程辅助库。 核心库中包含了 OpenGL最基本的命令函数。 核心库提供了一百多个函数,这些函数都以 ”gl”为前缀,用来建立各种各样的几何模型、进行坐标变换、产生光照效果、进行纹理映射、产生雾化效果等所有的二维和三维图形操作。 实用函数库是比核心库更高一层的函数库,它提供四十多个函数,这些函数都以 ”glu”为前缀。 由于 OpenGL是一个图形标准,是独立于任何窗口系统或操作系统的,在 OpenGL中没有提供窗口管理和消息事件响应的函数,也没有鼠标和键盘读取 事件的功能,所以在编程辅助库提供了一些基本的窗口管理函数、事件处理函数和简单的事件函数。 这类函数以 ”aux”作为前缀。 值得一提的是,目前 AUX 编程辅助库已经很大程度上被 GLUT 库取代了。 GLUT代表 OpenGL应用工具包( OpenGL Utility Toolkit),是一个与窗口系统无关的工具包。 它作为 AUX 库的功能更强的替代品,用于隐藏不同窗口系统 API 的复杂性。 GLUT 的子程序的前缀使用 ”glut”。 MFC MFC 简单来说就是 VC 的类库,是一个编程框架。 MFC( Microsoft Foundation Class Library) 中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立 Windows 下的应用程序,这是一种相对 SDK 来说更为简单的方法。 湖南大学毕业设计 (论文 ) 第 8 页 湖南大学软件学院 从 总体上 来看 , MFC 框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。 Microsoft Visual C++提供了相应的工具来完成这个工作: AppWizard 可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard 用来协助添加代码到框架文件;最后编译,则通过类库实现了应用程序特定的逻辑。 构成 MFC 框架的是 MFC 类库。 MFC 类库是 C++类库。 这些类或者封装了 Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了 OLE 特性,或者封装了ODBC 和 DAO 数据访问的功能等等。 MFC 抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。 这些类中,最重要的类是 CObject 和 CCmdTarget。 CObject 是 MFC 的根类,绝大多数 MFC 类是其派生的,包括 CCmdTarget。 CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。 所有从 CObject 派生的类都将具备或者可以具备 CObject 所拥有的特性。 CCmdTarget 通过封装一些属性和方法,提供了消息处理的架构。 MFC 中,任何可以处理消息的类都从 CCmdTarget 派生。 针对每种不同的对象, MFC 都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。 这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是 CwinThread;文档对象,基类是 Cdocument,等等。 程序员将结合自己的实际,从适当的 MFC 类中派生出自己的类,实现特定的功能,达到自己的编程目的。 MFC 以 “C++”为基础,自然支持虚拟函数和动态约束。 但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。 例如, CWnd 封装 Windows 窗口对象时,每一条 Windows消息对应一个成员函数,这些成员函数为派生类所继承。 如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。 于是, MFC 建立了消息映射机制,以一 种富有效率、便于使用的手段解决消息处理函数的动态约束问题。 这样,通过虚拟函数和消息映射, MFC 类提供了丰富的编程接口。 程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入 MFC 的编程框架。 MFC 编程框架将在适当的时候、适当的地方来调用程序的代码。 湖南大学毕业设计 (论文 ) 第 9 页 湖南大学软件学院 如前所述, MFC 实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。 这样封装的结果对程序员来说,是一套开发模板(或者说模式)。 针对不同的应用和目的,程序员采用不同的模板。 例如, SDI 应用程序的模板, MDI 应用程序的模板,规 则 DLL 应用程序的模板,扩展 DLL 应用程序的模板,OLE/ACTIVEX 应用程序的模板,等等。 这些模板都采用了以文档 视为中心的思想,每一个模板都包含一组特定的类。 为了支持对应用程序概念的封装, MFC 内部必须作大量的工作。 例如,为了实现消息映射机制, MFC 编程框架必须要保证首先得到消息,然后按既定的方法进行处理。 又如,为了实现对 DLL编程的支持和多线程编程的支持, MFC 内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。 虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解 MFC 内部 机制有助于写出功能灵活而强大的程序。 总之, MFC 封装了 Win32 API, OLE API, ODBC API 等底层函数的功能,并提供更高一层的接口,简化了 Windows 编程。 同时, MFC 支持对底层 API 的直接调用。 MFC 提供了一个 Windows 应用程序开发模式,对程序的控制主要是由 MFC 框架完成的,而且 MFC 也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。 框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。 MFC 是 C++类库,程序员就是通过使用、继承 和扩展适当的类来实现特定的目的。 例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。 实现这种功能的基础是 C++对继承的支持,对虚拟函数的支持,以及 MFC 实现的消息映射机制。 湖南大学毕业设计 (论文 ) 第 10 页 湖南大学软件学院 3. 粒子 系统 的设计 Particle System API 为了方便粒子系统的运用, McAllister 以 OpenGL 为基础,利用 C++开发了一套Particle System API。 这套 API 具有以下优点:运行高效、运用灵活、参数独立、升级方便、硬件无关、学习简单等。 该系统共分为五个部分:粒子 组、活动、活动列表、属性和域。 所有的粒子都存在粒子组中,粒子组是一组具有相同作用力的粒子集合。 用户可以定义多个具有不同行为的粒子组分别进行调用,但在某一时刻,只能有一个粒子组是活动的。 活动是粒子组修改粒子属性的函数。 活动列表类似与 OpenGL中的显示列表,可以把一系列操作都封装在一个活动列表中,需要的时候调用相应的活动列表。 属性提供了一些函数,用来修改粒子的颜色、大小和生命周期等属性。 域定义了矩形、球体、园盘、圆柱等一些形状,使行为函数、属性函数能在域范围内做定义。 下面的伪代码描述了粒子系统运行 的流程: for each particle group j pCurrentGroup(j)//指定 group j 为当前粒子组 for each time step per rendered framepSource(…)// 产生新的粒子 other actions…// 改变粒子组属性 pMove() //更新粒子位置 end for pDrawGroup(…)// 绘制粒子 end for other drawing… 每颗粒子的生命周期或工作 处理 流程如图 31 所示: 湖南大学毕业设计 (论文 ) 第 11 页 湖南大学软件学院 图 31 每颗 粒子 的生命 图 常见的粒子运动模型 粒子运动中粒子产生的时候都具有一定的初始属性,粒子作为质点,按照动力学的规律进行运动。 以下是几种常见的运动形式: ( 1) 直线运动。 粒子的位置和速度变化遵循下面的原则 (如公式( 31)): P=P0+∫Vdt, V=V0+∫adt ( 31) 其中 P 为粒子位置, P0 为粒子初始位置, V为粒子速度, V0 为初始速度, a为粒子加速度。 ( 2) 阻尼运动。 在当前运动方向上的粒子根据阻尼的作用,其速度根据某种比例减少,一般取 值如公式( 32)所示: V=V0( 1d△ t) ( 32) 其中 d 为阻尼运动的阻尼因子, d=[0, 1]。 ( 3) 螺旋运动。 螺旋运动能按照给顶轴进行旋转,以产生粒子的翻滚等效果,使速度方向发生改变。 ( 4) 反弹运动。 反弹运动能改变粒子运动速度的大小与方向。 对于无能量损失的湖南大学毕业设计 (论文 ) 第 12 页 湖南大学软件学院 反弹运动,类似于光的反射 ,如公式( 33)所示: V0=V2( V0N) N ( 33) 其中 N 为反射面的方法向量。 喷泉模拟 的算法 想要有好的模拟效果,首先要构造合适的坐标系。 假想观察者的视点位于屏幕正前方,以喷泉出水的管嘴的中心位置为 O,设置 X 轴正向沿从左至右的方向, Y 轴正向沿从下至上的方向, Z轴正向为从里至外的方向。 喷泉种类多样, 本文 挑选出其中一些具有代表性的进行研究和模拟。 下面以 这样 的一个 喷泉为例 来 说明模拟方法 : 这个喷泉是从以原点 O 为中心的管嘴中喷出水柱,经过两次面反射之后落在水池之中。 图 32 描述了这个喷泉的大致形状,其 中虚线段表示的 σ1和 σ2平面为喷泉的反射面,他们的形状和位置可以由用户设置。 目前反弹面的形状可以设为矩形或者圆;粗实线表示喷泉水流的轮廓;最下方用实线表示的 σ0平面为水池表面。 在这个例子中, σ1与 Y 轴交于原点 O, σ2与 Y 轴交于 P1 点, σ0与 Y 轴交于 P2 点。 图 32 喷泉形状图示 喷泉粒子初始化 首先设定粒子的初始属性,包括粒子的初始速度、初始位置以及颜色。 将粒子的初始速度( Vx,Vy,Vz)限制在一个圆柱环的域内,圆柱的轴平行与 Y 轴并且长度很短,圆柱的外径和内径也都不大,这样可以保证粒子以比较稳定的状态变化。 然后设定粒子的初始颜色,由于是模拟喷泉水流,设定粒子颜色为白色。 现在就可以产生新粒了,将粒子产生的位置( x0, y0, z0)范围限制在 Z轴上一条很短的直线段上,这样可以使粒子产生的位置看起来就像 从一个很细的管嘴喷出来一样。 粒子的位置将按照下面公式 ( 34) 变化: 湖南大学毕业设计 (论文 ) 第 13 页 湖南大学软件学院 x=x0+∫Vxdt y=y0+∫Vydt ( 34) z=z0+∫Vzdt 其中 , ( x, y, z)是粒子的。基于opengl粒子系统的喷泉模拟
相关推荐
括 承保时的资产负债表、出险时的资产负债表( 2 分) 固定资产明细账或卡片( 1 分) 存货分类明细账,进货发票,出入库记录等( 1 分) 财产损失清单,包括直接财产损 失、各项施救、保护、整理费用清单( 2 分) 受损标的维修方案、维修合同等;( 1 分) 价格证明材料,包括财务凭证、采购发票、运输费用发票、维修费用发票、修复或新购费用预算表、残余物资回收价格或协商价值证明等( 1 分)
sorbent. This explains that the lithium bromide absorption system is strictly limited to evaporation temperatures above 0186。 C。 and the ammonia absorption system is mainly used for low temperatures
围栏与变压器外壳的距离大于 1m 4 必须在明显部位悬挂警告牌 5 栏门应有锁 6 栏内应清洁无杂物 检查记录: 检查人: 工程建设安全文明施工检查手册 配电室安全检查表 受检单位 负责人 检查地点 检查时间 序号 检 查 内 容 是 否 1 是否有以下规程、管理台账 ① 电气安全操作规程 ② 安全检查记录 ③ 事故台账 ④ 交接班记录 2 电工是否经培训、考试,持证上岗 3 电工是否穿绝缘鞋
共享和传播管理资源,引导管理人事先卓越管理 无忧商务网 共享和传播管理资源,引导管理人事先卓越管理 无忧商务网 . 共享和传播管理资源,引导管理人事先卓越管理 无忧商务网 共享和传播管理赚诧贡涪滔衰修柠眺丸汪械吨煎掖嫩针究急柿宽恋摄殃橡叔硝莲拣宿彝堆爪矗急室号亏仑撬鸵铡抨眩椒八谩迈慎怪穷觅樊缕囊输旱樟暖状釜甩冻备 客 户 需 求 建 议 书 (28)企业流程再造辅导资料 DOC64页无忧商务网