• 基于C语言仿真实现的粒子火焰系统


    粒子系统文档

    设计思路

    本次作业设计的场景是夜晚露营地的炊火,主要仿真的粒子系统是火焰系统。项目模拟了火焰粒子的产生、运动、消亡的过程,火焰粒子的产生遵循一定的数学物理规律,并带有一定的随机性,较为真实地展现了火焰的产生过程,并且将火焰的光照效果反馈体现在周围的场景之中。

    场景是使用了网上的模型,通过编写模型 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 键可替换模拟风,改变火焰粒子的水平速度。

    项目截图

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    骨传导耳机用久了伤耳朵吗?骨传导耳机有什么优势
    小节8:Python之文件操作
    如何获取大数据平台 CDH 中 hive metastore db 的用户名和密码?
    【C语言 数据结构】顺序表的使用
    华为Hcia-数通学习(更改策略)
    机器学习预备03
    测试左移和右移怎么做,这篇文章写的太详细了
    Win11找不到gpedit.msc怎么办?Win11无法打开gpedit.msc解决教程
    「SpringCloud Alibaba」Nacos服务注册和中心配置
    【中秋国庆不断更】OpenHarmony组件内状态变量使用:@State装饰器
  • 原文地址:https://blog.csdn.net/newlw/article/details/126049047