上一篇文章中,我给出了一个相对完整的粒子引擎的模拟,那么关于粒子引擎的应用,我将在本篇文章中进行探讨。
首先,粒子系统主要应用于模拟火花、子弹(弹道)等,当然粒子系统还能有更大的作用,那就是模拟柔体(例如布料),那么这篇文章的主要内容就是关于扩展粒子系统使之能够模拟布料或类似布料的柔体。
要完成这样的模拟,首先就要谈谈粒子之间的“联系”,粒子之间只有能够相互作用或者影响,才能够模拟一个相对复杂的物体,在柔体模拟中,这种“联系”就是“弹簧”,也就是弹性联系,粒子与粒子之间通过一个“弹簧”来连接,弹簧的压缩或伸长都会制约两个粒子之间的移动,并使整个粒子系统趋向一个较为稳定的状态。
下图展示的就是两个粒子通过弹簧联系的示意图:

弹簧的特点就是,弹簧对物体所施加的力,只取决于弹簧的伸长(压缩)量的大小,换句话说,只要知道被联系的两者的间距有多大,就可以十分方便的获取主体粒子受到的来自其它粒子制约的力的大小。
用这张图来进行说明,假设弹簧的弹性系数为k,弹簧原始长度(无压缩或伸长)为x0:
A粒子(主体粒子)的位置向量为(xA, yA),B粒子的位置向量为(xB, yB),由此可以计算A所受的牵引力:
这里特别注意
A -> B 的方向向量:
AB = (xB – xA, yB – yA)

由此得弹簧当前长度为:
d = |AB|

由此可得出力的大小:
F = k * (d – x0)
这里有一点需要特别注意,那就是F的值会有正负之分,这正负之分源于弹簧是被“压缩”还是“拉伸”,我在模拟的过程中,取与AB同向的(也就是“拉伸”状态)为正,则F的公式如上。

在粒子引擎部分,我们已经知道,力应当以向量的形式体现,并以向量的形式添加到粒子上,所以这里需要将F转化为向量:
由于F与向量AB共线,即F在AB上的模为F,由此可得:
F = F * AB / |AB|
F = F * AB / d
在这一步中AB / |AB|为AB方向上的单位向量(模长度为1),注意到,如果F的值小于零(弹簧处于压缩状态),弹簧对A的力与方向向量AB反向。

简单的几步计算就可以得出B作用于A的力的向量,那么如果有多个粒子与A进行了弹性联系,那么由于向量分量的正交化,也可以非常方便的直接使用向量的加法进行力的累加。至此,有关弹性关联的基础部分,就已经构成了。

那么所谓柔体的模拟,就是基于上面的弹性联系,我们将视野放大,一块布料,可以被拉扯,却不会断,就是因为“线”作为了制约布料整体散架的联系因素,我们将这种线看做为一种特殊的弹簧(k相对比较大),那么我们就可以对这样的布料进行模拟了,如图所示:

所有的蓝色点,代表粒子,而红色的线,表明了粒子与粒子之间的连接关系,粒子首先连接与之上下左右相邻的粒子,然后连接与其对角相邻的粒子。
以左上的粒子为P(0, 0),右下粒子为P(M, N),我们现在就来构造这样的联系,这里,我使用语法类似于C语言的形式的伪代码,以A <- B[x0, k]表示将B连接到A,弹簧原长为x0,弹性系数为k:

由此就可以得到一个完整的布料型柔体模型,这样的模型通常可以用来模拟旗子。比如将左侧(0, 0) -> (0, N)的粒子的质量全部设置为无穷(反转质量为0),并在系统中给整个粒子系统加入“风力”,则可以模拟出红旗迎风飘的景象(众:为什么是红旗?)。

当然,对于这样的弹簧联动系统所能模拟的物体绝非仅限于此,例如桥梁的绳索,甚至桥梁的刚性连接结构,都可以通过弹性联动系统来进行模拟(无论是否为刚性联动,其力的制约产生,都由结构的形变产生,但实际上桥梁在某些方面单纯用粒子 – 弹性联动来模拟并不合适,毕竟刚结构的质量分布是不可忽略的,对于这个方面,采用刚体 – 弹性联动来模拟会更为合适,当然,这是后话)

关于此次探究的物理引擎的具体实现,将会在接下来的探索中逐步给出。

说点什么

  Subscribe  
提醒