首页 > 编程学习 > 粒子系统实现与原理

粒子系统实现与原理

发布时间:2022/10/1 15:46:26

粒子系统简介:

粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象、物理现象及空间扭曲上具备得天独厚的优势,能为我们实现一些真实自然而又带有随机性的效果(如爆炸、烟花、水流)提供了方便。Cocos2d-x引擎中就为我们提供了强大的粒子系统(确实Billboard Particle 是参考的cocos的源代码)。
cocos粒子系统源代码

粒子系统的分类:

现代的 Particle 有三种
• Billboard Particle
• Mesh Particle
• Ribbon Particle

在这里插入图片描述

作者本人先实现的是第一种 Billboard Particle粒子,后面还会实现 Mesh Particle。其实这两种斌没有本质上的区别,都是mesh+实例化+内存粒子+粒子的运动变换(可以各种物理量模拟仿真,甚至实现对象群)的管理等等,但是Billboard Particle粒子这种是最原始最简单的粒子,可以直接一张纹理或者播放序列帧,额Mesh Particle更通用,首先理论上可以是任意模型,而Billboard Particle粒子只是公告板或者通俗的说是四边形。再者发射的Mesh的材质可以任意,比Billboard Particle粒子效果更美更灵活~
相较而言,UE的粒子更多,还有另外三种:
在这里插入图片描述

粒子的属性:

粒子的属性包括很多,也包括各种受力,物理量的粒子。比如最常见的基本, 粒子属性: 坐标,初速度大小、速度的方向,大小,颜色,生命周期、质量、粒子的纹理(可以作成序列帧)等等。同时包括随机量!这个很关键 随机范围为 [start - variance/2, start + variance/2]-[end - variance/2, end + variance/2];

粒子发射器:

获取到所有的粒子,掌管整个粒子系统中该发射器发射的粒子,包括生命周期、消亡等等!除此之前粒子发射器有三个作用:
– 具体规定粒子产生的规则
– 具体规定粒子模拟的逻辑
– 描述如何渲染粒子(特别是透明混合等等的问题)

发射器属性:
发射器也有很多的属性,包括发射器的位置,比如我在项目中经常用的区域发射器,就有区域坐标属性,在该区域内随机new 粒子cell,甚至还可以做一个镂空,所以需要镂空坐标。对于线性发射器属性包括start的坐标,还有end的坐标

粒子的运动物理量-力场:

除此之外粒子还要受力场的影响
除此之外粒子还要受力场的影响,常见的三种力场:
在这里插入图片描述

本人身为物理课代表大学后特别工作以来物理有一些还给物理老师,所以复习啦一下下面理出各种力,匀变速运动,圆周运动等等的公式
1、 最常见的重力是一种全局设置,适用于场景中的所有物理系统。G = g*m;其中m为质量,g为重力加速度,G为重力。
2、空气阻力特别要指出,空气阻力跟速度的平方程正比,而且!空气阻力方向与运动方向或者说速度方向相反!
在这里插入图片描述

3、引力N/R^2 引力的大小N与所粒子当前与引力中心点的距离R,根据欧拉公式获取sqrt((x1-x2)2+((y1-y2)2+(z1-z2)^2)

匀变速运动公式:
速度:v1 = v0+at 其中v0初速度,a为加速度,t通常为当前一帧的时间。
位置公式 S=v0
t + (1/2 *a *t)
平均速度:V =( v1 +v2)/2
牛二定律:F=am 其中a为加速度,m为粒子的质量

圆周运动公式

1、v(线速度)=S/t=2πr/T=ωr=2πrf (S代表弧长,t代表时间,r代表半径) 。
  2、ω(角速度)=θ/t=2π/T=2πn (θ表示角度或者弧度) 。   3、T(周期)=2πr/v=2π/ω 。
  4、n(转速)=1/T=v/2πr=ω/2π 。
  5、Fn(向心力)=mrω2=mv2/r=mr4π2/T2=mr4π2f2 。
  6、an(向心加速度)=rω2=v2/r=r4π2/T2=r4π2n2 。   7、vmax(过最高点时的最小速度)=√gr
(无杆支撑)。

粒子的几种实现:

1、point sprites实现拖尾的粒子

在filament中的案例有point_sprites 效果如图:

在这里插入图片描述

//拖尾的核心

   static Vertex kVertices[NUM_POINTS];
    static float kPointSizes[NUM_POINTS];
    static uint16_t kIndices[NUM_POINTS];
    constexpr float dtheta = M_PI * 2 / NUM_POINTS;
    constexpr float dsize = MAX_POINT_SIZE / NUM_POINTS;
    constexpr float dcolor = 256.0f / NUM_POINTS;
    for (int i = 0; i < NUM_POINTS; i++) {
        const float theta = dtheta * i;
        const uint32_t c = dcolor * i;
        kVertices[i].position.x = cos(theta);
        kVertices[i].position.y = sin(theta);
        kVertices[i].color = 0xff000000u | c | (c << 8u) | (c << 16u);
        kPointSizes[i] = MIN_POINT_SIZE + dsize * i;
        kIndices[i] = i;
    }

2、追随粒子

在这里插入图片描述

本人最近实现了一种追随的粒子,跟随着某一点运动而运动,运动的轨迹是曲线的。
实现核心原理:每次update,识别点的pos 减去粒子当前的位置pos1得到的向量修改粒子的速度的方向(发射器或者粒子初始位置任意),速度大小恒定不变。

3、基于GPU的粒子

上述的两种都是基于CPU的粒子,因为它们都是在GPU中进行运算的,其实对于大量的顶点或者变换还是GPU最擅长,而且能充分发挥GPU的性能!感兴趣的可以详细看一下

在这里插入图片描述
github地址:keijiro/Skinner: Special Effects with Skinned Mesh in Unity (github.com)

Skinner is a collection of special effects that use vertices of an
animating skinned mesh as emitting points. It uses a special
replacement shader to convert vertex positions into GPU-friendly data,
and thus it avoids spending extra memory and CPU time for handling
them (uses GPU resources instead).

  • Skinner 是一种特效,它使用动画技术中的蒙皮网格的顶点作为发射点。 它使用特殊的替换着色器将顶点位置转换为GPU能识别并且使用的数据,从而避免花费额外的内存和CPU时间来处理它们(而是使用GPU资源)。

粒子系统的性能优化:

CPU的粒子:

GPU的粒子:

  • 高并行运算,适合大量粒子的模拟计算
  • 可以释放CPU功耗来进行游戏本身计算
  • 方便获得深度缓冲来做遮挡判断

参考资料:

Skinned Mesh原理解析和一个最简单的实现示例_n5的博客-CSDN博客
结合源码看《我所理解的cocos2dx-3.0》—— 粒子系统_fztfztfzt的博客-CSDN博客
GAMES104_Lecture12_Effects.pdf (boomingtech.com)

Copyright © 2010-2022 kler.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号