粒子系统就是一堆很小的东西。建模的方式也很简单,就像烟花一样,打到天上分散出很多的小东西。我们可以把这些小东西一个一个都建模出来,之后去定义每一个粒子受到的力。这些力肯定有粒子和粒子之间的,像台球一样。外部的力也会有,例如重力,粒子本身很轻的话还会受到风力等。只要我们把这些力都描述出来,剩下的就是模拟了。
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)
- 流体可以用数学来描述,当成一个整体来看。也可以把流体看成由很多个小水滴组成。下图就是一个用流体当成很多小水滴来模拟的粒子,要考虑粒子之间的相互作用。
- 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
- 对于粒子、灰尘之间肯定会有作用力
Example: Galaxy Simulation
对于星系来说也是一样的,下面是 NASA 提供的渲染图,旁边的烟其实就是成千上万个粒子。
Example: Particle-Based Fluids
本文开头提到,流体模拟可以当成一个整体(用数学来描述),也可以当成粒子。下面就是模拟小球的碰撞等作用力来实现的。
粒子系统不仅可以研究点,粒子要看我们如何来理解。在很大规模内,有很多小的重复的东西就可以理解为粒子,例如群体中的个体。
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
- 一些鸟不愿意离群,就会沿着它能看到大家飞的主要(平均)方向。
这样就定义了个体的一些运动的属性,我们就可以通过粒子系统的方法来解(下一节课讲如何解)。
Simulate evolution of large particle system numerically
Emergent complex behavior (also seen in fish, bees, ...)
这个过程中还会有各种复杂的情况,如果都能考虑进去,我们就能搞定非常复杂的情况,例如鱼、蜜蜂。
Example: Molecular Dynamics
下图模拟的是分子结构。粒子系统本质上定义的是个体和群体的关系,这里定义分子是怎么运动形成群体的。
Example: Crowds + “Rock” Dynamics
下图中每个人都有自己运动的方式。这也是粒子系统的范畴,只不过个体的行为更加复杂,人还可以跑,每个粒子和地面、横杠的相互作用也是相当复杂的。