【问题标题】:Falling Sand simulation落沙模拟
【发布时间】:2011-01-10 21:46:26
【问题描述】:

我正在尝试重新创建一个“落沙”模拟,类似于那些做同样事情的各种网络玩具 - 我失败得很厉害。我不确定从哪里开始。我正在尝试使用元胞自动机来模拟沙粒的行为,但我无法弄清楚如何让我更新“世界”的方向无关紧要......

例如,我想要的粒子类型之一是植物。当植物与水接触时,植物会将水粒子变成另一个植物粒子。但是这里的问题是,如果我从上到下和从左到右更新游戏世界,那么放置在水粒子海中间的植物粒子将立即导致所有水粒子在右边和下面那个新的植物粒子变成植物。这不是我所期望的行为。 =(

【问题讨论】:

  • 最近我一直在重新思考整个问题……我一直试图将世界视为一袋有位置的粒子——但我应该做的是将世界视为连接细胞的矩阵。

标签: simulation physics cellular-automata


【解决方案1】:

一个直接的解决方案是不要在原地进行每次迭代。取而代之的是,每次更新世界时,都创建一个副本……然后查看原始版本,但更新副本。这样,更新顺序就不再重要了,因为您在寻找粒子时完全忽略了更新。

【讨论】:

  • 这里的问题是如果两个粒子试图占据同一个空间。假设我有两个沙粒,每个沙粒水平相邻。在更新过程中,第一个粒子会选择它正下方的点来落下。第二个粒子(随机)选择相同的确切位置落入 - 但它不会知道该位置已被选中,因为它只考虑先前的世界状态,而不是当前正在创建的新状态。两个粒子最终都在同一个地方,这与一个粒子被自发地破坏是一样的。
  • 在这种情况下,您可以同时查看当前状态(以避免冲突)和过去状态(查看要应用哪些其他更新规则)。
  • 我想避免我的所有规则都必须引用这两个州。对我来说,这似乎是一个杂物。 =\
  • 所以您想同时考虑以前的状态和新的状态,而不实际引用您要考虑的状态?好吧,祝你好运。 ;)
【解决方案2】:

不要以顺序方式对其进行编程(循环遍历所有粒子),而是使用真正的模拟编程技术,其中每个粒子都被视为遵循物理定律并且可以异步运行(运行)的单个对象/代理并响应“事件”(与其他粒子的交互)。

如果将每个沙粒作为一个单独的对象过于细化,那么将世界划分为假设为 1000 个粒子的小块,并模拟这些块的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2013-05-19
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多