昨天我遇到了Craig Reynolds'Boids,后来发现我会用Java实现一个简单的2D版本。 我已经基于Conrad Parker's notes密切建立了一个相当基本的设置。
然而,我得到了一些相当离奇的(在我看来)行为。目前,我的boids合理地快速移动到粗糙的网格或格子中,然后在现场进行抽搐。我的意思是他们四处移动并经常旋转。
目前,我已实施:
最初,我的boids随机分布在屏幕区域(与Parker方法略有不同),它们的速度都指向屏幕区域的中心(请注意,随机初始化的速度会产生相同的结果)。更改速度限制值只会改变boids进入此模式的速度,而不是形成模式。
我认为,这可能是:
预期的行为将更像雷诺兹的boids页面上applet中发生的二维版本,尽管现在我还没有实现任何方法来保持屏幕上的boid。
之前有没有遇到过这个?有关原因和/或如何解决的任何想法?如果它有帮助,我可以发布一个.gif的行为。
答案 0 :(得分:11)
也许你对分离规则的加权太强,导致所有的boid尽可能远离所有相邻的boids。我的伪代码中有各种常量作为权重:规则1中的/ 100和规则3中的/ 8(规则2中的隐含* 1);这些可以调整,这通常有助于模拟不同的行为,如紧密蜂拥或昆虫。
也是任意|距离| <应修改分离规则中的100以匹配模拟的单位;此规则应仅适用于近距离的boids,基本上是为了避免碰撞。
玩得开心!
答案 1 :(得分:2)
如果他们看到每个人,他们都会尝试以平均速度移动。如果他们只看到一些可能会有一些分离的群体。
如果它们是随机分布的,它将接近于零。
如果你用矩形来限制它们,或者从墙壁上排斥它们或者当它们靠近时将它们传送到另一侧并且分离得太高,它们将被推离墙壁(墙壁本身或其他刚被传送的人,谁将被推到另一边(并推动并再次被推))。
因此,尝试更紧密的凝聚力,有限的视力,更多的空间并将它们分散聚集(挑选随机点并将它们的多个随机距离放置在那里),不均匀或正常。
答案 2 :(得分:1)
我也遇到了这个问题。我通过确保更新每个boid的速度的方法将新速度添加到旧速度而不是重置它来解决它。从本质上讲,正在发生的事情就是:这些人正在试图远离彼此而不能加速(因为他们的速度正在被重置而不是增加,因为他们应该),因此“抽搐”。您更新速度的方法应该类似于
def set_velocity(self, dxdy):
self.velocity = (self.velocity[0] + dxdy[0], self.velocity[1] + dxdy[1])
其中velocity和dxdy是2元组。
答案 3 :(得分:0)
我想知道你是否遇到碰撞矩形问题。如果你基于重叠的矩形(例如,this)实现了某些东西,当两个矩形足够接近任何移动导致它们相交时,你可以得到你描述的行为。 (或者更糟糕的是,如果一个矩形可以完全在另一个矩形内部结束。)
解决这个问题的一个方法是确保每个boid只向前看。然后你避免A不能移动的情况,因为B在前面太靠近,但B不能移动,因为A太靠近了。
快速检查是实际绘制所有碰撞矩形,并将任何相交的矩形颜色为不同颜色。它经常给出停止和抽搐原因的线索。