跳转到主要内容

流体:可分割性

虚拟世界里的物体大多是固体,实现时也基本按固体处理。不过,在对真实世界建模时,要完全避开流体——尤其是水——有点难 1。我用“流体”这个词,而不是“液体”,是为了不把那些(在朴素物理学里)表现得像液体的固体排除在外,比如沙子、灰烬和面粉;我这样说,也是为了把玻璃之类的物质排除在外:它们在定义上算液体,但在人类的时间尺度上主要表现为固体。

流体的核心问题是它们可以无限分割。你可以任意把它们拆开、合并 2。如果某人有一个水瓶和一只玻璃杯,他应当能把玻璃杯倒满水,而多出来的水留在瓶子里。这可以用取巧的方式实现:给所有防漏容器配上一对属性,说明里面装的是哪种流体、有多少;也可以“正规地”实现:为每一份流体创建单独的物体,并把体积作为绑在它们身上的属性。后者一般更可取,因为这意味着流体可以被引用,也可以独立于容器存在(比如你把它们倒在地上的时候)。烦人的玩家可能会把一个很大的容器里的东西反复倒进一个很小的容器,从而造出成千上万个流体物体;但只要你意识到存在这种可能,就不难防止它造成问题。

超过一定大小之后,大团的流体可以被当作生成器。你想从海洋里取多少盐水,就取多少,那里总会剩下很多。在实践中,能当作生成器的流体可以小得多;一片海滩的沙子取之不尽,就连池塘和私家游泳池也可以视为实际上是永远装满的。因为虚拟世界不是真的,甚至可以让小小的容器生成无限的流体 3。

流体从容器里倒进环境时,会有一些潜在的困难。如果倒进去的那个表面上已经有流体,就不是问题,因为任何一大团流体都可以放心地假定为会吸收(或以别的方式消散)加入其中的任何一份流体。往一个(虚拟的)淡水湖里倒油,无论玩家倒多少次,结果都只是把油销毁掉。

如果落点表面原本没有流体,那就是另一回事了。在光滑表面上,流体会顺着坡度流走;在粗糙表面上,它可能积成水洼或水坑;在岩石表面或木板路上,它可能马上渗进缝隙里消失;在干燥的土地上,它可能直接被吸收。实际会发生什么,取决于表面和流体。至少,这意味着所有表面类型都需要先分好类,物理才能判断该怎么处理。

最后一个可分割性问题与渗漏有关。渗漏可以看作随时间发生的体积损失。虽然在现实生活中,从渗漏容器里渗出的流体会留下一道痕迹,但要把这一点做进系统里相当难。一般来说,如果一只桶破了个洞,那么它所含的流体量会以恒定的速率减少,直到一点不剩,仅此而已。这并不意味着你可以把桶装满沙子,再倒出来在田野上写自己的名字。


  1. 药水和麦酒也很常见。 ↩︎

  2. 构成组合体的那些“原子”也可以拆开,但把它们再合起来要费更多工夫。 ↩︎

  3. 就像那个笑话里说的:一个人从精灵那里得到三个愿望。他许的第一个愿望是得到一瓶永远喝不完的啤酒。精灵照办了,他喝了个够,确认它确实管用。精灵问他另外两个愿望是什么。“那再给我来两瓶这样的,谢谢,”他答道。 ↩︎