OSG的粒子特效仿真
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通常用粒子系统绘制一幅画面需要如下步骤: 1) 分析物体的静态特性, 定义粒子的初始属性。 2) 分析物体的运动规律, 建立粒子属性变化的动态特性。 3) 在系统中生成具有一定初始属性的新粒子。
4) 根据粒子属性变化的动态特性改变其属性值。 5) 删除系统中已死亡的粒子。 6) 绘制所有剩余的粒子。 步骤 3)、 4)、 5)、 6) 反复循环就形成了物体的动态变化 过程。
标 准 放 射 器 (osgParticle::ModularEmitter) 用 于 管 理 计 数 器、 放置器、 发射器和粒子群, 它为用户控制粒子系统中多个 元素提供了一个标准机制, 如图 1 所示。
2.2 osgParticle::ParticleSystem 粒子群 (osgParticle::ParticleSystem) 是 OSG 粒子系统的核
2.6 osgParticle::Counter 计数器 (osgParticle::Counter): 控制每一帧 产 生 的 粒 子 数 。
ConstantRateCounter 用 于 指 定 每 秒 或 每 帧 最 少 产 生 的 粒 子 数 ; RandomRateCounter 类 允 许 用 户 指 定 每 帧 产 生 粒 子 的 最 大 和 最 小数目, 如图 5 所示。
2.7 osgParticle::ParticleSystemUpdater 粒 子 群 更 新 器 (osgParticle::ParticleSystemUpdater) : 用 于
自动更新粒子。 将其置于场景中时, 它会在拣选遍历中调用所 有 “存活” 粒子的更新方法, 如图 6 所示。
66 2010. 11
2.3 osgParticle::Particle 粒子 (osgParticle::Particle) 是 粒 子 系 统 的 基 本 单 元 , 它 被
放射器创建后加入到粒子群中。 粒子具有物理属性和图像属 性 , 它 的 形 状 可 以 是 任 意 的 点 (POINT) 、 四 边 形 (QUAD) 、 四边形带 (QUAD_TRIPSTRIP)、 六角形 (HEXAGON) 或 者 线 (LINE)。 每个粒子都有自己的生命周期, 即每个粒子可以存活 的时间 (秒)。 生命周期为负数的粒子可以存活无限长时间。 粒子系统通过改变生命周期的最大和最小值来控制单个粒子的 渲 染 。 所 有 的 粒 子 都 具 有 大 小 ( SIZE) 、 ALPHA 来自百度文库 和 颜 色 (COLOR) 属 性 , 这 些 属 性 均 可 以 指 定 一 个 范 围 , 即 最 大 和 最 小值。 粒子属性会根据已经消耗的时间, 在最小和最大值之间 进行线性插值 (用户也可自定义插值方式)。 2.4 osgParticle::Placer
雨、 雾、 云、 爆炸、 火焰、 烟尘、 燃烧等战场特效是增强 虚拟环境逼真度的有效手段, 在三维游戏、 战场环境仿真中具 有 重 要 作 用 。 OSG 是 一 款 高 性 能 的 3D 图 形 开 发 库 , 在 游 戏 、 视景仿真、 可视化仿真、 虚拟现实等领域具有很高的市场占有 率。 OSG 基于粒子系统思想提供了一整套完整的 C++类库对特 效进行抽象、 建模与仿真, 如何有效利用这些类构建特定的战 场 特 效 是 广 大 OSG 开 发 者 非 常 关 注 的 问 题 , 也 是 一 个 难 点 问 题 。 在 此 主 要 介 绍 OSG 粒 子 类 及 特 效 仿 真 方 法 , 并 给 出 一 个 具体的仿真实例。
图形图像处理
2.8 osgParticle::ModularProgram 标准编程器 (osgParticle::ModularProgram) 在单个粒子的生
命周期中, 用户可以使用 ModularProgram 实例控制粒子的位置, ModularProgram 需要与 Operator 对象组合使用, 如图 7 所示。
1 粒子系统
对于诸如雨、 雪、 云、 火焰、 烟雾、 爆炸等这些特殊视景 效果的实时模拟一直是计算机图形学研究的难点, 而粒子系统 是解决这一难点的有效方法。
粒子系统的基本思想是: 用粒子群来描述不规则物体的属 性及其变化, 每个粒子均具有形状、 大小、 颜色、 透明度、 运 动速度、 运动方向、 生命周期等属性。 这些粒子不是一个静态 的整体, 而是随着时间的推移处在不断运动中的粒子集合体。 其中粒子群的分布结构可以改变, 各个粒子的位置可以移动, 新的粒子可以不断产生, 同时旧的粒子不断死亡。
同其他描述不规则物体的方法相比, 粒子系统具有以下 3 个特点:
(1) 对物体的描述不是通过原始的具有边界的面元 (如多边 形集合) 来描述, 而是通过一组定义在空间的原始粒子来描述。
(2) 粒子系统不是一个静态实体, 每个粒子的属性均是时 间的函数。
(3) 由粒子系统描述的物体不是预先定义好的, 其形状位 置等属性均用随机过程来描述。
3 开发方法
在 OSG 中 , 采 用 粒 子 系 统 模 拟 特 殊 效 果 有 两 种 方 法 : 一 是 采 用 OSG 中 已 经 定 义 好 的 粒 子 系 统 模 块 ; 二 是 根 据 需 要 , 自定义粒子系统。
(1) 预定义粒子系统的使用 1) 创建预定义粒子系统模块对象, 设置相应的参数。 2) 作 为 子 节 点 加 到 到 场 景 节 点 中 。 从 粒 子 系 统 的 的 关 系 继 承 图 中 , 可 以 知 道 它 们 继 承 自 osg::Node 或 者 osg::Group 节 点, 因此可以直接作为一个节点加入到场景中。 (2) 自定义粒子系统的方法与步骤 1) 创 建 粒 子 群 (osgPartlcle::ParticleSystem), 并 将 其 加 入 到场景中。 设置相应的属性, 如材质、 放射及光照。 2) 创建粒子 (osgParticle::Particle), 控制 场 景 中 每 一 个 粒 子的特性并关联到粒子群。 设置粒子对应的特性, 如大小、 颜 色、 生命周期及重量等。 3) 创建粒子系统放射器 (osgParticle::ModularEmitter), 标 准 的 放 射 器 包 括 3 个 组 成 部 分 计 数 器 ( Counter) 、 放 置 器 (Placer)、 发 射 器 (Shooter), 设 置 相 应 的 属 性 , 如 位 置 、 形 状、 速度和方向等。 4) 创建粒子系统编程器对象 (osgParticle::Program), 控制粒 子在声明周期内的运动。 一个标准编程器对象包含各种操作器, 如 osgParticle::AccelOperator, osgParticle::FluidFrictionoperator 等。 5) 创 建 粒 子 系 统 更 新 器 ( osgParticle::ParticleSystemUpdater), 用于管理每帧的粒子的属性, 如位置、 速度、 方向等。 通过上面的步骤, 可以完成一般粒子特殊效果的仿真, 用 户也可根据需要调整各对象实例的创建顺序。 各粒子特效对象 的调用关系如图 9 所示。
2 OSG 粒子特效相关类
OSG 提 供 了 一 系 列 类 对 粒 子 系 统 进 行 封 装 , 域 名 空 间 为 osgParticle, 程 序 员 使 用 这 些 类 可 以 设 计 各 种 粒 子 特 效 。 主 要 的相关类包括: 2.1 osgParticle:: ModularEmitter
放 置 器 (osgParticle::Placer) 将 粒 子 作 为 输 入 , 用 于 设 置 粒 子 的 位 置 。 它 作 为 ModularEmitter 的 一 部 分 , 用 户 可 以 使 用 预定义的放置器或者定义自己的放置器。 预定义的放置器包 括 : 点 放 置 器 PointPlacer (所 有 的 粒 子 从 同 一 点 出 生 )、 长 方 体放置器 BoxPlacer (所 有 的 粒 子 从 一 个 长 方 体 内 产 生 )、 扇 面 放置器 sectorPlacer (所有的粒子从一个指定中心点, 半径范围 和 角 度 范 围 的 扇 面 出 生 )、 线 段 放 置 器 SegmentPlacer (所 有 的 粒子从一条线段上产生), 以 及 多 段 放 置 器 MultiSegmentPhacer (用户指定一系列的点, 粒子沿着这些点定义的线段出生), 如 图 3 所示。
图形图像处理
O SG 的粒子特效仿真
侯学隆 宋伟健
摘 要: OSG 是一款市场占有率非常高的 3D 图形开发库, 粒子特效的开发的一直是其难点。 在 介绍粒子系统的基础上, 分析了 OSG 中的粒子对象类的功能与继承关系, 提炼粒子特效仿真的思 路, 并给出一个粒子特效实例。 关键词: 粒子系统; 特殊仿真; OSG
(1) osgParticle::ExplosionDebrisEffect (爆炸碎片); (2) osgParticle::ExplosionEffect (爆炸); (3) osgParticle::SmokeEffect (烟); (4) osgParticle::SmokeTrailEffect (尾焰轨迹); (5) osgParticle::FireEffect (火焰); (6) sgParticle::PrecipitationEffect (雨、 雪)。
在 OSG 中 除 了 以 上 粒 子 系 统 C++类 , 还 包 含 有 预 定 义 的 特效类:
2010. 11 67
4 开发实例
基 于 Visual Studio 8.0 和 OSG2.8, 利 用 粒 子 特 效 类 编 程 实
现了固定翼飞机螺旋桨引擎着火、 冒烟效果。
心, 它维护并管理一系列粒子的创建、 更新、 渲染和销毁。 粒
2010. 11 65
子 系 统 类 继 承 自 Drawable 类 , 控 制 粒 子 的 渲 染 , 因 此 与 其 他 Drawable 对 象 的 渲 染 类 似 , 控 制 其 渲 染 属 性 stateAttribute 即 可 。 OSG 提 供 了 一 个 方 便 的 函 数 setDeraultAttrihutes 以 允 许 用 户控制粒子使用的纹理、 允许/禁止发光、 允许/禁止光照 3 个 属 性 。 派 生 类 ConnectedParticleSystem 用 于 导 弹 、 飞 机 等 轨 迹 特效, 单个粒子被渲染成带状 (ribbon), 如图 2 所示。
2.9 osgParticle::Operator 操 作 器 (osgParticle::Operator) 提 供 了 控 制 粒 子 在 其 生 命
周期中的运动特性的方法。 用户可以改变现有 Operator 类实例 的参数, 或者定义自己的 Operator 类。 OSG 提供的 Operator 类 包括: AccelOperator (加速度)、 AngularAccelOperator (角加速 度 ) 、 FluidFrictionOperator ( 空 气 阻 力 或 者 流 体 操 作 ) 以 及 ForceOperator (压力), 如图 8 所示。
2.5 osgParticle::Shooter 发 射 器 (osgParticle::Shooter) 在 内 部 被 ModularEmitter 所
用, 是一个用于指定粒子的初始速度范围的抽象类。 派生类 RadialShooter 类允许用户指定一个速度范围 (米/秒) 以及弧度 值 表 示 的 方 向 。 方 向 由 两 个 角 度 指 定 : theta 角— ——速 度 矢 量 与 z 轴的夹角, phi 角— ——x 轴与速度矢量投影到 XY 平面所得 矢量的夹角, 如图 4 所示。
4) 根据粒子属性变化的动态特性改变其属性值。 5) 删除系统中已死亡的粒子。 6) 绘制所有剩余的粒子。 步骤 3)、 4)、 5)、 6) 反复循环就形成了物体的动态变化 过程。
标 准 放 射 器 (osgParticle::ModularEmitter) 用 于 管 理 计 数 器、 放置器、 发射器和粒子群, 它为用户控制粒子系统中多个 元素提供了一个标准机制, 如图 1 所示。
2.2 osgParticle::ParticleSystem 粒子群 (osgParticle::ParticleSystem) 是 OSG 粒子系统的核
2.6 osgParticle::Counter 计数器 (osgParticle::Counter): 控制每一帧 产 生 的 粒 子 数 。
ConstantRateCounter 用 于 指 定 每 秒 或 每 帧 最 少 产 生 的 粒 子 数 ; RandomRateCounter 类 允 许 用 户 指 定 每 帧 产 生 粒 子 的 最 大 和 最 小数目, 如图 5 所示。
2.7 osgParticle::ParticleSystemUpdater 粒 子 群 更 新 器 (osgParticle::ParticleSystemUpdater) : 用 于
自动更新粒子。 将其置于场景中时, 它会在拣选遍历中调用所 有 “存活” 粒子的更新方法, 如图 6 所示。
66 2010. 11
2.3 osgParticle::Particle 粒子 (osgParticle::Particle) 是 粒 子 系 统 的 基 本 单 元 , 它 被
放射器创建后加入到粒子群中。 粒子具有物理属性和图像属 性 , 它 的 形 状 可 以 是 任 意 的 点 (POINT) 、 四 边 形 (QUAD) 、 四边形带 (QUAD_TRIPSTRIP)、 六角形 (HEXAGON) 或 者 线 (LINE)。 每个粒子都有自己的生命周期, 即每个粒子可以存活 的时间 (秒)。 生命周期为负数的粒子可以存活无限长时间。 粒子系统通过改变生命周期的最大和最小值来控制单个粒子的 渲 染 。 所 有 的 粒 子 都 具 有 大 小 ( SIZE) 、 ALPHA 来自百度文库 和 颜 色 (COLOR) 属 性 , 这 些 属 性 均 可 以 指 定 一 个 范 围 , 即 最 大 和 最 小值。 粒子属性会根据已经消耗的时间, 在最小和最大值之间 进行线性插值 (用户也可自定义插值方式)。 2.4 osgParticle::Placer
雨、 雾、 云、 爆炸、 火焰、 烟尘、 燃烧等战场特效是增强 虚拟环境逼真度的有效手段, 在三维游戏、 战场环境仿真中具 有 重 要 作 用 。 OSG 是 一 款 高 性 能 的 3D 图 形 开 发 库 , 在 游 戏 、 视景仿真、 可视化仿真、 虚拟现实等领域具有很高的市场占有 率。 OSG 基于粒子系统思想提供了一整套完整的 C++类库对特 效进行抽象、 建模与仿真, 如何有效利用这些类构建特定的战 场 特 效 是 广 大 OSG 开 发 者 非 常 关 注 的 问 题 , 也 是 一 个 难 点 问 题 。 在 此 主 要 介 绍 OSG 粒 子 类 及 特 效 仿 真 方 法 , 并 给 出 一 个 具体的仿真实例。
图形图像处理
2.8 osgParticle::ModularProgram 标准编程器 (osgParticle::ModularProgram) 在单个粒子的生
命周期中, 用户可以使用 ModularProgram 实例控制粒子的位置, ModularProgram 需要与 Operator 对象组合使用, 如图 7 所示。
1 粒子系统
对于诸如雨、 雪、 云、 火焰、 烟雾、 爆炸等这些特殊视景 效果的实时模拟一直是计算机图形学研究的难点, 而粒子系统 是解决这一难点的有效方法。
粒子系统的基本思想是: 用粒子群来描述不规则物体的属 性及其变化, 每个粒子均具有形状、 大小、 颜色、 透明度、 运 动速度、 运动方向、 生命周期等属性。 这些粒子不是一个静态 的整体, 而是随着时间的推移处在不断运动中的粒子集合体。 其中粒子群的分布结构可以改变, 各个粒子的位置可以移动, 新的粒子可以不断产生, 同时旧的粒子不断死亡。
同其他描述不规则物体的方法相比, 粒子系统具有以下 3 个特点:
(1) 对物体的描述不是通过原始的具有边界的面元 (如多边 形集合) 来描述, 而是通过一组定义在空间的原始粒子来描述。
(2) 粒子系统不是一个静态实体, 每个粒子的属性均是时 间的函数。
(3) 由粒子系统描述的物体不是预先定义好的, 其形状位 置等属性均用随机过程来描述。
3 开发方法
在 OSG 中 , 采 用 粒 子 系 统 模 拟 特 殊 效 果 有 两 种 方 法 : 一 是 采 用 OSG 中 已 经 定 义 好 的 粒 子 系 统 模 块 ; 二 是 根 据 需 要 , 自定义粒子系统。
(1) 预定义粒子系统的使用 1) 创建预定义粒子系统模块对象, 设置相应的参数。 2) 作 为 子 节 点 加 到 到 场 景 节 点 中 。 从 粒 子 系 统 的 的 关 系 继 承 图 中 , 可 以 知 道 它 们 继 承 自 osg::Node 或 者 osg::Group 节 点, 因此可以直接作为一个节点加入到场景中。 (2) 自定义粒子系统的方法与步骤 1) 创 建 粒 子 群 (osgPartlcle::ParticleSystem), 并 将 其 加 入 到场景中。 设置相应的属性, 如材质、 放射及光照。 2) 创建粒子 (osgParticle::Particle), 控制 场 景 中 每 一 个 粒 子的特性并关联到粒子群。 设置粒子对应的特性, 如大小、 颜 色、 生命周期及重量等。 3) 创建粒子系统放射器 (osgParticle::ModularEmitter), 标 准 的 放 射 器 包 括 3 个 组 成 部 分 计 数 器 ( Counter) 、 放 置 器 (Placer)、 发 射 器 (Shooter), 设 置 相 应 的 属 性 , 如 位 置 、 形 状、 速度和方向等。 4) 创建粒子系统编程器对象 (osgParticle::Program), 控制粒 子在声明周期内的运动。 一个标准编程器对象包含各种操作器, 如 osgParticle::AccelOperator, osgParticle::FluidFrictionoperator 等。 5) 创 建 粒 子 系 统 更 新 器 ( osgParticle::ParticleSystemUpdater), 用于管理每帧的粒子的属性, 如位置、 速度、 方向等。 通过上面的步骤, 可以完成一般粒子特殊效果的仿真, 用 户也可根据需要调整各对象实例的创建顺序。 各粒子特效对象 的调用关系如图 9 所示。
2 OSG 粒子特效相关类
OSG 提 供 了 一 系 列 类 对 粒 子 系 统 进 行 封 装 , 域 名 空 间 为 osgParticle, 程 序 员 使 用 这 些 类 可 以 设 计 各 种 粒 子 特 效 。 主 要 的相关类包括: 2.1 osgParticle:: ModularEmitter
放 置 器 (osgParticle::Placer) 将 粒 子 作 为 输 入 , 用 于 设 置 粒 子 的 位 置 。 它 作 为 ModularEmitter 的 一 部 分 , 用 户 可 以 使 用 预定义的放置器或者定义自己的放置器。 预定义的放置器包 括 : 点 放 置 器 PointPlacer (所 有 的 粒 子 从 同 一 点 出 生 )、 长 方 体放置器 BoxPlacer (所 有 的 粒 子 从 一 个 长 方 体 内 产 生 )、 扇 面 放置器 sectorPlacer (所有的粒子从一个指定中心点, 半径范围 和 角 度 范 围 的 扇 面 出 生 )、 线 段 放 置 器 SegmentPlacer (所 有 的 粒子从一条线段上产生), 以 及 多 段 放 置 器 MultiSegmentPhacer (用户指定一系列的点, 粒子沿着这些点定义的线段出生), 如 图 3 所示。
图形图像处理
O SG 的粒子特效仿真
侯学隆 宋伟健
摘 要: OSG 是一款市场占有率非常高的 3D 图形开发库, 粒子特效的开发的一直是其难点。 在 介绍粒子系统的基础上, 分析了 OSG 中的粒子对象类的功能与继承关系, 提炼粒子特效仿真的思 路, 并给出一个粒子特效实例。 关键词: 粒子系统; 特殊仿真; OSG
(1) osgParticle::ExplosionDebrisEffect (爆炸碎片); (2) osgParticle::ExplosionEffect (爆炸); (3) osgParticle::SmokeEffect (烟); (4) osgParticle::SmokeTrailEffect (尾焰轨迹); (5) osgParticle::FireEffect (火焰); (6) sgParticle::PrecipitationEffect (雨、 雪)。
在 OSG 中 除 了 以 上 粒 子 系 统 C++类 , 还 包 含 有 预 定 义 的 特效类:
2010. 11 67
4 开发实例
基 于 Visual Studio 8.0 和 OSG2.8, 利 用 粒 子 特 效 类 编 程 实
现了固定翼飞机螺旋桨引擎着火、 冒烟效果。
心, 它维护并管理一系列粒子的创建、 更新、 渲染和销毁。 粒
2010. 11 65
子 系 统 类 继 承 自 Drawable 类 , 控 制 粒 子 的 渲 染 , 因 此 与 其 他 Drawable 对 象 的 渲 染 类 似 , 控 制 其 渲 染 属 性 stateAttribute 即 可 。 OSG 提 供 了 一 个 方 便 的 函 数 setDeraultAttrihutes 以 允 许 用 户控制粒子使用的纹理、 允许/禁止发光、 允许/禁止光照 3 个 属 性 。 派 生 类 ConnectedParticleSystem 用 于 导 弹 、 飞 机 等 轨 迹 特效, 单个粒子被渲染成带状 (ribbon), 如图 2 所示。
2.9 osgParticle::Operator 操 作 器 (osgParticle::Operator) 提 供 了 控 制 粒 子 在 其 生 命
周期中的运动特性的方法。 用户可以改变现有 Operator 类实例 的参数, 或者定义自己的 Operator 类。 OSG 提供的 Operator 类 包括: AccelOperator (加速度)、 AngularAccelOperator (角加速 度 ) 、 FluidFrictionOperator ( 空 气 阻 力 或 者 流 体 操 作 ) 以 及 ForceOperator (压力), 如图 8 所示。
2.5 osgParticle::Shooter 发 射 器 (osgParticle::Shooter) 在 内 部 被 ModularEmitter 所
用, 是一个用于指定粒子的初始速度范围的抽象类。 派生类 RadialShooter 类允许用户指定一个速度范围 (米/秒) 以及弧度 值 表 示 的 方 向 。 方 向 由 两 个 角 度 指 定 : theta 角— ——速 度 矢 量 与 z 轴的夹角, phi 角— ——x 轴与速度矢量投影到 XY 平面所得 矢量的夹角, 如图 4 所示。