CA流水模拟

游戏课小作业,我挑了这个主题。前些时候看《Game Programming Gems 3》对Cellular Automata这个概念十分感兴趣。这其实是种很古老的智能模型,提出于冯·诺伊曼,上世纪50年代。

CA的概念可简单地表述为:
• 将世界粒子化,划分为固定大小的单元组成的网格(元胞空间);
• 严格上,每个CA单元在某一特定时间只有一个状态(元胞状态),不同的状态之间在一定条件下可相互转化,比如水加热后会变成水蒸气、木头被加热到一定温度后会燃烧;
• 每个CA单元包含气压、温度、质量、速度等等参数,参数的改变可带来状态的变化(世界规则);
• 元胞世界的时间是离散的(周期),并且CA单元在每个时刻的状态变化都是并行的,并且只与它本身以及它的邻居的状态历史相关(独立性);
邻居在CA中是一个非常重要的概念。CA单元只关心它和它的邻居们,而不关心整个世界中的大体趋势;但神奇的是,由于每个CA所遵循的变化规则都是相同或相似的,整个世界往往表现出惊人的规律性。


在CA的研究历史中,最著名的CA模型当属Conway的生命游戏(Life Game)。这是一个非常简单的CA模型。它的Cell只有两种状态,和几条极其简单的规则;但尽管如此,它却能带来一些非常复杂的行为,诸如类似生物群落的繁衍与消亡。

流水用CA是十分好实现的,每个Cell里需要定义的有状态(流体/固体)、压强、水体积等。我只做了二维空间的分割,因此没办法做到水的泼溅效果。不过涟漪什么的,已经做的很好了,比网络游戏那些个粗糙的重复贴图好看多了。