8

昨天我遇到了 Craig Reynolds 的Boids,随后我想我会尝试用 Java 实现一个简单的 2D 版本。我根据康拉德·帕克的笔记整理了一个相当基本的设置。

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

目前,我已经实现:

  1. 结盟
  2. 凝聚
  3. 分离
  4. 限速

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

在我看来,这可能是:

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

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

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

4

4 回答 4

11

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

也是任意的|距离| < 100 应修改分隔规则以匹配您的模拟单位;这条规则应该只适用于附近的生物,基本上是为了避免碰撞。

玩得开心!

于 2011-08-30T00:47:43.423 回答
2

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

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

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

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

于 2011-06-02T11:18:56.360 回答
1

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

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

其中速度和 dxdy 是 2 元组。

于 2011-07-18T01:01:41.973 回答
0

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

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

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

于 2011-12-30T16:19:39.250 回答