当前位置:网站首页>基于C语言仿真实现的粒子火焰系统
基于C语言仿真实现的粒子火焰系统
2022-07-29 14:23:00 【biyezuopinvip】
粒子系统文档
设计思路
本次作业设计的场景是夜晚露营地的炊火,主要仿真的粒子系统是火焰系统。项目模拟了火焰粒子的产生、运动、消亡的过程,火焰粒子的产生遵循一定的数学物理规律,并带有一定的随机性,较为真实地展现了火焰的产生过程,并且将火焰的光照效果反馈体现在周围的场景之中。
场景是使用了网上的模型,通过编写模型 LOADER 类来读入,展现的是一个范围有限的场景。因此,还使用了天空盒技术,将远景贴在天空盒之中,让场景看起来给人一种场景非常庞大的幻觉,增加了美观性。
根据课程的讲解以及网上的教程,此次项目的光照模型采用的是PHONG 式光照模型,考虑了环境光、漫反射光以及镜面光照。光源的类型有平行光源、点光源、手电筒光源。并且考虑的光照随距离增加而衰减的效果。
本项目的纹理考虑了漫反射纹理和镜面反射纹理两种并且可以产生它们的叠加效果。在交互方面,本项目使用了相机漫游,通过键盘鼠标可以在场景中任意漫游。本项目还可以通过键盘,来动态改变粒子数量、打开和关闭手电筒、动态调节各个光源的亮度。 本次作业采用的是 GLFW 动态可编程管线,其在一些简单的操作上,如画正方体、画球、增加光源等等可能不如 GLUT 简单,但是其有更多地自由空间供我们去施展,进而能实现许多复杂的效果。
难点问题
火焰效果的生成:火焰、烟雾等粒子系统不同于其它离散性的粒子系统,它需要很多粒子产生的视觉效果叠加起来,产生宏观效果,在宏观上甚至看不出来有粒子的存在。
深度测试(depth test)与混合(blend)之间的矛盾:火焰的效果需要粒子系统的叠加生成,如果开启深度测试,则会前面的粒子先渲染的话,后面被遮挡的粒子的效果就会被丢弃。但火焰放在场景之中,与其它物体又必须要有深度关系,否则,火焰会永远可见。综上,需要采用想出一种方法,使得粒子之间不需要深度测试,而粒子系统与场景的其它物体需要进行深度测试。
隐藏 billboard 的侧面:火焰粒子是通过一张没有厚度的布告板贴上纹理实现的,需要实现无论从哪个位置观看布告板,都不会看到它的侧面,这样就将布告板没有厚度的事实隐藏了。
技术实现
火焰的物理仿真火焰中心的粒子数目多,而两边的粒子数目少,可用近似正态分布表示粒子数量或密度与其到火焰中心距离之间的关系。因此,在每次要发射粒子的时候,可以用正态分布随机得到粒子与中心点的距离,再进行一次均匀随机,得到 sinθ 以及 cosθ 的值,最终得到新的火焰粒子的初始坐标。

每个火焰粒子有其生命周期,可以通过在一定范围内的随机得到,但总体而言,距离火焰中心近的粒子,生命周期会更长。同理,距离火焰中心近的粒子,其速度会更快一些。
火焰物理效果的仿真:采用了布告板技术以及 alpha 混合技术,即通过一块没有厚度的四边形面片和一张只有透明度信息没有颜色的纹理,通过计算火焰的状态配上颜色,得到一个火焰粒子的效果。通过关闭深度测试以及开启混合模式,进行粒子色彩的叠加,最终得到由中心到外部从亮白到亮黄再到红色的渐变。
隐藏 billboard 的侧面:使得在任何角度观察火焰都能得到一样的效果,有两种方法可以处理,第一种方法是,每次渲染 billboard 的时候都检测当前相机的位置与 billboard 中心连线和 billboard 法向量之间的夹角,如果夹角大于 60°,则将 billboard 旋转 90°,这样就永远无法看到 billboard 的侧面。而第二种方法是,每次生成粒子的时候,就生成相互垂直的 billboard,这样也不会察觉到 billboard 没有厚度。
解决深度测试和混合的冲突:将火焰渲染放在渲染的最后,深度测试仍然开启,但是不写入 z Buffer,这样的话,粒子之间就不会相互遮挡,而整个火焰系统和其它物体仍然还有深度关系。
纹理加载:使用了 SOIL 纹理加载库,然后解析返回结果。
模型加载:使用了 ASSIMP 模型加载库,该库除了可以读取多种模型的顶点数据,还可以一并得到模型的纹理信息,结合上面 SOIL 纹理加载库,可制作一个方便简洁的 model loader。
操作说明
场景漫游: 通过 WASD 和鼠标键操作。
通过 1,2,3,4 分别改变 1 号、2 号、3 号、4 号光源的亮度,按下 F 键可开关手电筒。
按下 R 键可替换不同的粒子模型。
按下 K 键可替换模拟风,改变火焰粒子的水平速度。
项目截图


边栏推荐
- Guangzhou Emergency Management Bureau released the top ten safety risks of hazardous chemicals in summer
- 在金融服务行业数字化转型中,低代码值得被关注
- Introduction to several methods of making custom welcome interface on Weiluntong touch screen
- 国内helm快速安装和添加常用charts仓库
- hyperbench:plugin.Open(“./fabric“): plugin was built with a different version of package golang.
- 基于变胞机构的移动机器人构型设计研究综述
- human pose estimation-DEKR2021CVPR
- 全面质量管理理论
- 全球级的分布式数据库 Google Spanner原理 热:报错
- The reason for Apple's official price reduction has been found, and it is also facing declining sales and even inventory problems
猜你喜欢

搞直播啦,千视超高清4K NDI编解码器8月3日19:00准时开播

84.(cesium之家)cesium模型在地形上运动

【模板引擎】微服务学习笔记六:freemarker模板引擎的常用命令介绍

国内helm快速安装和添加常用charts仓库

FPGA刷题——跨时钟域传输(FIFO+打拍+握手)

威纶通触摸屏制作自定义欢迎界面的几种方法介绍

教育部等五部门联合推荐优质课外资源,腾讯产品青少年模式首发

dedecms编辑器支持pdf导入

【C语言】AI三子棋的成长之路

Work Efficiency - Fifteen minutes allows you to quickly learn Markdown syntax to proficient in typesetting practice notes
随机推荐
测试时间的评估:开发时间的1/3~1/2
Work Efficiency - Fifteen minutes allows you to quickly learn Markdown syntax to proficient in typesetting practice notes
kubernetes中正strace etcd
力扣 206.反转链表--递归解决
【JS高级】js之闭包对象_04
84.(cesium之家)cesium模型在地形上运动
没遇到过这三个问题都不好意思说用过Redis
面试官:生产环境中 CPU 利用率飙高怎么办?
Shared memory - shmget filling holes
尚硅谷大叔培训:揭秘Flink四种执行图——ExecutionGraph和物理执行图
你会看 MySQL 的执行计划(EXPLAIN)吗?
立足本土,链接全球 | 施耐德电气“工业SI同盟”携手伙伴共赴未来工业
暴力递归到动态规划 02 (绝顶聪明的人的纸牌游戏)
Nine kinds of way, teach you to read the resources files in the directory path
基于SSM实现在线聊天系统
Topic 1125: - delegate * C language training
国内helm快速安装和添加常用charts仓库
解决:Parameter 0 of method ribbonServerList in com.alibaba.cloud.nacos.ribbon.NacosRibbonClientConfigu
关于内部类
【C语言】AI三子棋的成长之路