8

昨日、Craig ReynoldsのBoidsに出くわし、その後、Javaでの単純な2Dバージョンの実装を試してみることにしました。私は、コンラッド・パーカーのメモに密接に基づいて、かなり基本的な設定をまとめました。

しかし、私は(私の意見では)かなり奇妙な振る舞いをしています。現在、私のボイドはかなり速くラフなグリッドまたはラティスに移動し、その場でけいれんを起こします。つまり、彼らは少し動き回り、非常に頻繁に回転します。

現在、私は以下を実装しました:

  1. アラインメント
  2. 凝集
  3. 分離
  4. 速度制限

最初、私のボイドは画面領域全体にランダムに分散され(パーカーの方法とは少し異なります)、それらの速度はすべて画面領域の中心に向けられます(ランダムに初期化された速度でも同じ結果が得られることに注意してください)。速度制限値を変更すると、ボイドがこのパターンに移動する速度のみが変更され、パターンの形成は変更されません。

私が見ているように、これは次のようになります。

  1. 私が使用しているパラメーターの結果(現在、私のコードはパーカーの擬似コードで説明されているとおりです。レイノルズで説明されている角度と半径で定義される影響範囲はまだ試していません)。
  2. 実装する必要があるが、気付いていないもの。
  3. 私が間違っていること。

予想される動作は、レイノルズのボイドページのアプレットで発生することの2次元バージョンに沿ったものになりますが、現在、ボイドを画面に表示する方法は実装していません。

誰かがこれに遭遇したことがありますか?原因および/またはそれを修正する方法についてのアイデアはありますか?問題の動作の.gifを投稿できます。

4

4 に答える 4

11

おそらく、分離ルールの重み付けが強すぎて、すべてのボイドがすべての隣接するボイドから可能な限り遠くに移動します。私の擬似コードには、重みとして機能するさまざまな定数があります。ルール1では/ 100、ルール3では/ 8(およびルール2では暗黙の* 1)。これらは微調整することができます。これは、昆虫の群れや鳥の滑走など、さまざまな行動をモデル化するのに役立つことがよくあります。

また、任意の|距離| 分離ルールの<100は、シミュレーションの単位に一致するように変更する必要があります。このルールは、基本的に衝突を回避するために、近接するボイドにのみ適用する必要があります。

楽しむ!

于 2011-08-30T00:47:43.423 に答える
2

全員を見ると、全員が平均速度で移動しようとします。一部しか表示されない場合は、いくつかのグループが分離されている可能性があります。

そして、それらがランダムに分布している場合、それはゼロに近くなります。

それらを長方形で制限し、壁から反発するか、近づいたときに反対側にテレポートする場合)、距離が高すぎる場合、それらは壁から(壁自体またはテレポートされたばかりの他の人から)押し出されます。反対側に押される(そして押され、また押される))。

したがって、均一または通常ではなく、より緊密な結束、限られた視界、より多くのスペースを試して、それらをクラスター化して分散させます(ランダムなポイントを選択し、そこから小さなランダムな距離にそれらの複数を配置します)。

于 2011-06-02T11:18:56.360 に答える
1

私もこの問題に遭遇しました。各ボイドの速度を更新する方法が、リセットするのではなく、古い速度に新しい速度を追加することを確認することで、それを解決しました。基本的に、何が起こっているのかというと、ボイドは互いに離れようとしていますが、加速できません(速度が上がるのではなくリセットされているため)。したがって、「けいれん」します。速度を更新する方法は次のようになります。

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

ここで、velocityとdxdyは2タプルです。

于 2011-07-18T01:01:41.973 に答える
0

衝突長方形に問題があるのだろうか。オーバーラップする四角形に基づいて何かを実装した場合 (たとえば、this )、2 つの四角形が十分に接近していて、動きによってそれらが交差する場合に、記述した動作になる可能性があります。(または、ある長方形が別の長方形の中に完全に収まる場合は、さらに悪いことになります。)

この問題の解決策の 1 つは、各ボイドが前方のみを向くようにすることです。そうすれば、B が前に近すぎて A が動けないが、A が後ろに近すぎて B が動けないという状況を回避できます。

簡単なチェックは、実際にすべての衝突長方形をペイントし、交差する長方形を別の色に着色することです。多くの場合、停止とけいれんの原因についての手がかりが得られます。

于 2011-12-30T16:19:39.250 に答える