【问题标题】:Flocking boids behaviour problem植绒行为问题
【发布时间】:2011-09-06 18:42:16
【问题描述】:

昨天我遇到了 Craig Reynolds 的Boids,随后我想我会尝试用 Java 实现一个简单的 2D 版本。 我根据Conrad Parker's notes 整理了一个相当基本的设置。

但是,我得到了一些相当奇怪(在我看来)的行为。目前,我的身体相当快地移动到粗糙的网格或格子中,然后当场开始抽搐。我的意思是它们会四处移动并且非常频繁地旋转。

目前,我已经实现了:

  1. 对齐
  2. 凝聚力
  3. 分离
  4. 限速

最初,我的 boids 随机分布在屏幕区域(与 Parker 的方法略有不同),它们的速度都指向屏幕区域的中心(请注意,随机初始化的速度会产生相同的结果)。改变速度限制值只会改变小体进入这个模式的速度,而不是模式的形成。

在我看来,这可能是:

  1. 我使用的参数的结果(现在我的代码与 Parker 的伪代码中描述的一样;我还没有尝试过由 Reynolds 描述的角度和半径定义的影响区域。)
  2. 我需要实现但不知道的东西。
  3. 我做错了什么。

预期的行为将更像是在 Reynolds 的 boids 页面上的小程序中发生的二维版本,尽管目前我还没有实现任何方法来将 boids 保留在屏幕上。

有没有人遇到过这种情况?关于原因和/或如何解决它的任何想法?如果有帮助,我可以发布相关行为的 .gif。

【问题讨论】:

    标签: java simulation artificial-life boids


    【解决方案1】:

    也许你对分离规则的权重太强了,导致所有的 boid 尽可能远离所有相邻的 boid。我的伪代码中有各种常量充当权重:规则 1 中的 /100 和规则 3 中的 /8(以及规则 2 中的隐式 *1);这些可以进行调整,这对于模拟不同的行为通常很有用,例如密密麻麻的昆虫或滑翔的鸟类。

    还有任意的|距离|

    玩得开心!

    【讨论】:

    • 哇!男人本人!非常感谢 - 你的伪代码页面在理解如何实现集群行为时提供了巨大的帮助。我将在今天晚些时候玩各种重量 - 希望它会有所帮助。
    • 我的规则 2 也会导致抽搐,但 boids 仍然在移动。还有其他建议吗?我已经尝试制作规则 2 的平方反比版本,但它没有帮助,只是增加了频率并降低了抽搐的幅度。
    【解决方案2】:

    如果他们看到所有人,他们都会尝试以平均速度移动。如果他们只看到一些,则可能会有一些单独的组。

    如果它们是随机分布的,则将接近于零。

    如果你用矩形限制它们,要么将它们从墙壁上击退,要么在它们靠近时将它们传送到另一侧)并且间隔太高,它们将被推离墙壁(从墙壁本身或刚刚被传送的其他人,然后谁会被推到另一边(然后又被推又被推))。

    所以尝试更紧密的凝聚力、有限的视野、更多的空间并将它们集群分布(选择随机点并将它们中的多个放置在距那里小的随机距离),而不是均匀或正常。

    【讨论】:

    • 据我所知,我不需要将它们分布在集群中。然而,我已经实现了限制对齐和内聚的范围(分离已经在帕克的伪代码中完成)。由于内聚力限制半径相当小,我遇到了同样的问题,它以不同的方式表现出来——boids 现在形成集群,然后像以前一样振荡。这是一个改进,至少,因为我们有集群(这是有道理的,因为内聚不再是全局的)。
    • 如果有帮助,我的 boids 是三角形,高度和宽度为 30x20,分离半径现在为 50,内聚半径为 75,对齐半径为 80。
    【解决方案3】:

    我也遇到过这个问题。我通过确保更新每个 boid 速度的方法将新速度添加到旧速度而不是重置它来解决它。本质上,正在发生的事情是这样的:boids 试图远离彼此但无法加速(因为它们的速度正在被重置而不是像它们应该的那样增加),因此“抽搐”。你更新速度的方法应该是这样的

    def set_velocity(self, dxdy):
        self.velocity = (self.velocity[0] + dxdy[0], self.velocity[1] + dxdy[1])
    

    velocity 和 dxdy 是 2 元组。

    【讨论】:

    • 一个很好的检查建议,但我向你保证,这不是我的问题的原因。我正在正确更新速度,方法是将其设置为当前速度和计算出的该 boid 的加速度之和。
    【解决方案4】:

    我想知道您是否对碰撞矩形有疑问。如果您基于重叠矩形实现了某些东西(例如,this),那么当两个矩形足够接近以至于任何移动都会导致它们相交时,您最终会得到您所描述的行为。 (或者更糟糕的是,如果一个矩形最终完全在另一个矩形内。)

    解决这个问题的一个方法是确保每个 boid 只向前看。那么你就避免了A因为B在前面太近而不能移动,而B因为A在后面太近而不能移动的情况。

    快速检查是实际绘制所有碰撞矩形并将任何相交的矩形着色为不同的颜色。它通常会提供有关停止和抽搐的原因的线索。

    【讨论】:

    • 一个好主意,但我没有使用矩形。我没有进行任何碰撞检测,只是将 boid 建模为点并依靠施加的分离力来防止碰撞发生。据我了解,这是植绒的标准。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多