🚚

Particle Systems

notion image
粒子系统就是一堆很小的东西。建模的方式也很简单,就像烟花一样,打到天上分散出很多的小东西。我们可以把这些小东西一个一个都建模出来,之后去定义每一个粒子受到的力。这些力肯定有粒子和粒子之间的,像台球一样。外部的力也会有,例如重力,粒子本身很轻的话还会受到风力等。只要我们把这些力都描述出来,剩下的就是模拟了。
Popular technique in graphics and games (模拟魔法、雾、灰尘等)
  • Easy to understand, implement
  • Scalable: fewer particles for speed, more for higher complexity
Challenges
  • May need many particles (e.g. fluids)
    • 流体可以用数学来描述,当成一个整体来看。也可以把流体看成由很多个小水滴组成。下图就是一个用流体当成很多小水滴来模拟的粒子,要考虑粒子之间的相互作用。
      • Macklin and Müller, Position Based Fluids
        Macklin and Müller, Position Based Fluids
  • May need acceleration structures (e.g. to find nearest particles for interactions)
    • 前面提到粒子和粒子之间有作用力,有可能有碰撞或引力,要考虑引力的话,就要考虑一个粒子周围的几个粒子。要知道周围的粒子,就需要有一些加速结构,粒子位置还会经常移动,我们还要去更新加速结构。
 

Particle System Animations

下面是一个简单的算法:
For each frame in animation
  • [If needed] Create new particles
    • 如果有一些粒子要动态生成
  • Calculate forces on each particle
    • 要考虑粒子的作用力,包括内部和外部。
  • Update each particle’s position and velocity
    • 根据作用力来更新粒子的位置和速度。
  • [If needed] Remove dead particles
    • 如果有一些粒子有存活时间,就需要移除死亡的粒子。
  • Render particles
    • 算出来每一帧粒子的位置后,就渲染出来。
💡
算法看起来简单,其实重要的是如何把粒子之间的作用力模拟清楚。如果把粒子之间的作用力描述成水滴和水滴之间的作用力的话,那模拟出来的就会是水。 还有得到作用力之后如何去计算、更新粒子的位置也困难,也就是如何解它们。 定义作用力是 Modeling 一块的过程,学术界更关心的是如何去解。

Particle System Forces

粒子之间有各种各样的作用力。
Attraction and repulsion forces
  • Gravity, electromagnetism, … 吸引力、电磁力
  • Springs, propulsion, … 粒子离得足够近会有斥力
Damping forces
  • Friction, air drag, viscosity, … 摩擦力、空气阻力、黏滞性
Collisions 粒子跟自己也会碰撞
  • Walls, containers, fixed objects, … 跟墙、容器等的碰撞
  • Dynamic objects, character body parts, …

Gravitational Attraction 万有引力

Newton’s universal law of gravitation
  • Gravitational pull between particles
    • 对于粒子、灰尘之间肯定会有作用力
notion image

Example: Galaxy Simulation

对于星系来说也是一样的,下面是 NASA 提供的渲染图,旁边的烟其实就是成千上万个粒子。
Video preview

Example: Particle-Based Fluids

本文开头提到,流体模拟可以当成一个整体(用数学来描述),也可以当成粒子。下面就是模拟小球的碰撞等作用力来实现的。
Video preview
💡
粒子系统不仅可以研究点,粒子要看我们如何来理解。在很大规模内,有很多小的重复的东西就可以理解为粒子,例如群体中的个体。

Simulated Flocking as an ODE

例如我们可以模拟一个鸟群,用一些简单的规则来定义个体的鸟如何听从于集体。
Model each bird as a particle
Subject to very simple forces:
  • attraction to center of neighbors
    • 任何一只鸟都会找周围的一些鸟并试图融入进去。
  • repulsion from individual neighbors
    • 任何一只鸟都不希望离其他鸟太近
  • alignment toward average trajectory of neighbors
    • 一些鸟不愿意离群,就会沿着它能看到大家飞的主要(平均)方向。
notion image
这样就定义了个体的一些运动的属性,我们就可以通过粒子系统的方法来解(下一节课讲如何解)。
Simulate evolution of large particle system numerically
Emergent complex behavior (also seen in fish, bees, ...)
这个过程中还会有各种复杂的情况,如果都能考虑进去,我们就能搞定非常复杂的情况,例如鱼、蜜蜂。
Credit: Craig Reynolds (see http://www.red3d.com/cwr/boids/)
Credit: Craig Reynolds (see http://www.red3d.com/cwr/boids/)

Example: Molecular Dynamics

下图模拟的是分子结构。粒子系统本质上定义的是个体和群体的关系,这里定义分子是怎么运动形成群体的。
model of melting ice crystal
model of melting ice crystal

Example: Crowds + “Rock” Dynamics

下图中每个人都有自己运动的方式。这也是粒子系统的范畴,只不过个体的行为更加复杂,人还可以跑,每个粒子和地面、横杠的相互作用也是相当复杂的。
notion image