MY BLOG DIRECTORY:
YivanLee:专题概述及目录![图标](https://i-blog.csdnimg.cn/blog_migrate/b09af8aa7673f507dda5232c8fed91cd.png)
INTRODUCTION:
如果我们想要做流体模拟或者是一些特殊的物理粒子效果,我们就需要自己制作一个粒子发射器。下面就来写一个简单的粒子发射器。先看下我做的动力学粒子发射器的效果吧:
![v2-e7768d5ed7c62f8a289b8327f6cd0d28.jpg](https://i-blog.csdnimg.cn/blog_migrate/9115441627976b0f22d94c55c06bded5.jpeg)
MAIN CONTENT:
不知道为什么,一提到”粒子“就会想到(特效),(特效粒子编辑器器)等概念,也许是我特效编辑器用多了。在物理篇种其实反复强调,”粒子“其实就是一个抽象的概念,一坨数据。这坨数据的主要组成是两个位置数据,OldPos和NewPos,用这两个位置来进行韦尔来计算和Constraint等操作。所谓的粒子发射器其实就是spawn一堆这种粒子的东西,所以我简单粗暴地做了一个spawn函数
![v2-b3e78096a0a96bfafaa293ef898a9550_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/b5139737920298005c224a3ed41e30c6.jpeg)
![v2-0d01397adc0ea86d7ac5774efcdcfffb_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/bb2538440bd031ab95e238e2b60da4da.jpeg)
就是简单粗暴地往粒子网格数组里塞粒子然后对这些粒子进行解算就完了。
![v2-6a7a971eb2f7ddf3d812ff5723d87080_b.png](https://i-blog.csdnimg.cn/blog_migrate/1a6d4f1feed3d3d818cfc08e5b0dd408.png)
![v2-6ca225af1c42187166bd79fe94da129f_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/abb55c39b2924baca90aa209ff937817.jpeg)
然后我们就得到了一个非常粗暴的粒子发射器,效果如下:
![v2-ee4056c53502127fc073607141c076c9.jpg](https://i-blog.csdnimg.cn/blog_migrate/726f794ac6d17884390cc4e8c50d0e16.jpeg)
为了让粒子发射器能和我们认知的粒子发射器一致,所以我在Spawn粒子之后对所有粒子的状态进行检测,这样就可以让我的粒子发射器发射的粒子处于循环状态,依然是非常暴力的方法。
![v2-4b4b455ebfc2c8018c165c52ea69d045_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/ada48a531cf8819568364ad8559d3d1c.jpeg)
其实这里可以进行一个简单的封装,比如各种生命检测,位置约束等等都可以在Spawn完粒子之后进行。
把Spawn完成后的那部分代码封装到一个叫PhyGXEmitterSolver的类中,然后在PhyGXParticleEmitter中做一个约束列表
![v2-eb27ff0c0d7c611aee2c2b118a94401c_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/c7ae45fa0059466f1d0775605862a43e.jpeg)
![v2-2c9c4424b9d087d39d70c805dfaaf00b_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/c9298a74e1f26417106eda4e7ff8c442.jpeg)
然后在Spawn完成后执行这个列表
![v2-cfecb8262c13cc6dff2d1bf8630706e8_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/95c75451f82f7e83635f9c247c699600.jpeg)
我们可以得到如下效果:
![v2-6a1eebcbe68c827645dd59e65f891178_b.gif](https://i-blog.csdnimg.cn/blog_migrate/2f4feb7e4b4dd2a36e4114da72c114c5.gif)
至此我们完成了我们的粒子发射器。
完成粒子发射器以后对每个粒子进行SPH流体解算就可以得到一个简单的流体啦。下面是伪代码:
![v2-e8747b20c361f369adac1bacfdeec291_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/c25c3bb610913eb09ab4b914a2218ac3.jpeg)
可以得到的效果如下:
![v2-5882e37d22f3c8d5cdb5093a61ff25b7_b.gif](https://i-blog.csdnimg.cn/blog_migrate/72c53c4f5ae527395be3805f0208c5e7.gif)
SUMMARY AND OUTLOOK:
虽然我们的方法粗暴简单,但是我们初步建立了一个粒子系统的框架。先由粒子发射器向粒子塞粒子数据,塞完后对粒子进行各种循环检测,生命检测等,完成了这些检测再对粒子进行运动迭代。
完成了简单的粒子发射器就可以使用MarchingCube在粒子的基础上生成流体模型了。上述方法是我个人的想法及总结,也没在网上找到物理粒子系统的实现思路,如果有巨佬有更好的方式还请给我留言交流。
部分源码:PhyGX
Enjoy it。
NEXT:
YivanLee:虚幻4渲染编程(物理模拟篇)【第四卷:基于粒子的物理水面】
Reference
【1】http://matthias-mueller-fischer.ch/publications/sca03.pdf