




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何真实地模拟火焰效果 作者 周军 游戏制作离不开各种各样的特效 火焰效果更是这些特效当中最常用的一 种 在网上有很多的这方面的例子 但似乎都不太理想 下面我主要介绍几种 有效的火焰模拟算法 在讲述火焰算法之前 我想先介绍一个经典的 Blur 算法 这将为我们后 面的文章提供很好的技术基础 因为这是模拟火焰的关键所在 对于不 同的效果我们要采取不同的模糊 Blur 算法 在这里我只介绍最简单的一种 其实 Blur 算法相当简单 并不像很多人想象的那么神秘 只要一句话就 可以解释清楚 我们所要做的不过是把屏幕上的每一个点用它周围的四个点的 平均值代替即可 即 好了 下面我们进入主题 Let s get in FIRE 总的来说 模拟一个火焰效果需要以下这三个步骤 放置热源 火焰上升 减掉衰减因子 1 放置热源 放置热源很好理解 也很好实现 我们只需要在屏幕的适当位置 想 升起火焰的地方 放上一些亮点就可以了 比如 for int i 0 i 320 i putpixel i 199 rand 256 2 火焰上升 我们已经有了热源 那么如何使火焰升起来呢 这就要用到我们刚才讲 到的 Blur 了 由于火焰是要向上升的 所以我们不能简单的选择待处 理 pixel 的上 下 左 右四个相临 pixel 而是要选择它本身和它下 面的三个 pixel 具体实现的 pseudo code 如下 for int y 0 y 200 y for int x 0 x 320 x pixel x y pixel x y pixel x 1 y 1 pixel x y 1 pixel x 1 y 1 4 putpixel x y bright 3 减衰减因子 看到上面的 了么 对了 那儿就是我们要添加如下这段代码 的地方 为什么要减掉一个衰减因子呢 让我们通过两副图的对比来 说明它的重要性吧 图 1 减掉了衰减因子 Fire exe 图 2 没有衰减 不可取 具体实现的 pseudo code 如下 if bright 0 记住 千万不要忘了检验不要让 bright 小于 0 否则 自己试试就知 道了 嘿嘿 也许读者会发现我们现在的火焰有些死板 所以我们不妨试着在火焰上 加入一些 spark 火星 这可以使我们的火焰更加有戏剧性虽然它在一定程度 上削弱了火焰的真实性 其效果图如下 图 3 添加了火星的效果 FireWithSpark exe 看过 Seumas McNally 我很崇拜的大师 呵呵 的 ParticleFire 粒子 火焰 见 ParticleFire exe 的朋友可能会知道 他在他的火焰处理上就用这 个算法以使他的火焰更富戏剧性 到此为止 我已经完整地介绍了模拟一个火焰效果地全部算法 但是这样 模拟出来的火焰始终过于死板 不够逼真 当然 最为逼真的效果莫过于通过 基于 Alpha 通道的伪粒子系统的实现 在这里我们不作讨论 如何才能解决 这个问题呢 一个很好的办法是把我们的热源放置在一个运动的物体上 Hugo 就曾使用 feed back 和 warp 的技术逼真地模拟了火焰的效果 中国的程序员 也有用与 Hugo 完全相同的算法真实模拟了这个效果 而不是放在屏幕底部 这样通过物体的运动再加上一些放缩 模糊技巧就可以使我们的火焰产生出意 想不到的效果了 具体运行效果如图 4 所示 图 4 通过 Rotate 产生的火焰效果 CoolFire exe 下面我就对这个算法的具体步骤进行简要地分析 并在适当的地方给出相 应的代码 伪码 这个算法主要也分成四个步骤 放置热源 移动物体 放缩 模糊 1 放置热源 这个步骤和上面步骤完全一样 不过就是画出一个物体 2 移动物体 在我的程序中我用了一系列的矩阵变换以完成物体的运动 当然也可以 像 Hugo 一样 用 feed back 的技巧 只不过就是在一个平面上而不是 3 维空间中旋转物体 具体实现见 CoolFire cpp 关于矩阵运算的具 体实现见我的 走进 3D 的世界 C 中用运算符重载实现矩阵运算 一文 有关矩阵的运算请参考计算几何的有关书籍 在这里不作过多讨 论 Obj rotX thetaX rotY thetaY rotZ thetaZ 3 放缩 在程序中我的放缩采用了这样一个算法 先任取一定点 x y 然后依 次把屏幕上的每一个点与这个点比较 用它们之间的距离乘上一个放缩 因子在加到 x y 上 这个值便是放缩的索引值 以下便是实现的代码 未优化 long Offset 0 for y 0 y 200 y for x 0 x 320 x IndexX sx x sx ScaleX IndexY sy y sy ScaleY lpVideoBuffer Offset lpSrcBuffer IndexY 320 IndexX 为了便于理解 我没有对代码进行优化 读者在编写程序时必须对以上 代码进行有效地优化 具体方法是 先在一次循环中算出 IndexX 和 IndexY 的值并保存在数组中 待进行放缩操作时直接用它们作索引放 缩 而不是像上面的代码一样边计算边操作放缩 4 模糊 现在全国人民都知道 Blur 了吧 那我就不再罗嗦了 好了 我想 对于火焰的算法我已经很清晰地展示在您地面前了 有效地 运用这些算法一定会为您地游戏开发带来很大地便利 文章中的所有实例 除了文章中的所有实例 除了ParticleFire以外 均在以外 均在Watcom C 中调试成中调试成 功 读者在运行的时候必须保证您的运行目录里有功 读者在运行的时候必须保证您的运行目录里有do
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版四年级数学上学期专项归类复习卷(四)《公顷和平方千米、角的度量》(含答案)
- 吉林省松原市前郭尔罗斯县第三中学2024-2025学年八年级下学期4月月考生物试题(含答案)
- 教育咨询招生方案范文
- 甘肃省陇南市成县城关中学2025-2026学年上学期第一次月考八年级历史试卷(含答案)
- 2025年江苏省镇江市中考真题化学试卷(含答案)
- 动态测试方法-洞察及研究
- 常州市委托物业管理合同5篇
- 中级消防设施操作员试题题库测试卷和答案
- 预算考试题及答案
- 初级会计《初级会计实务》模拟题库及答案
- 2025年国家能源投资集团有限责任公司校园招聘笔试备考题库附答案详解(综合题)
- 2025年零碳园区综合能源技术发展现状与展望报告-华电电科院
- 环保工程现场施工方案(3篇)
- 索尼微单相机A7 II(ILCE-7M2)使用说明书
- 中级护理真题题库及答案解析
- 一年级新生开学第一课常规训练
- 直播助农培训课件
- 长期照护师抗压考核试卷及答案
- 2025版自然人个人创业孵化器贷款协议
- 火力发电厂汽水管道设计技术规定
- 内部控制与风险管理(第3版)题库
评论
0/150
提交评论