移動/障害物の回避


12

障害物(赤)を配置できる「ゲーム」を作成したいのですが、黒点がそれを避け、緑のターゲットに到達しようとします。
非常に簡単な方法を使用して、黒い点が赤に近く、方向を変え、しばらく移動した後、緑の点に進みます。
「非現実的な」パス

コンピューター制御の「プレーヤー」の「スムーズ」パスを作成するにはどうすればよいですか?
編集:滑らかさが主なポイントではありませんが、赤いブロック「壁」を回避し、それに衝突してそれを回避しないようにします。

基本的に3つのポイントしかない場合、どのようにパス検索アルゴリズムを実装できますか?
(そして、あなたが複数の障害物を置くことができたら、それは物事をはるかに複雑にしますか?)
スムーズなパス

回答:


9

非常に一般的で一般的なアプローチは、ワールド空間をグリッドに分割し、A *などのアルゴリズムを使用することです。

このリンクは、A *アルゴリズムの理解と実装の開始に役立ちました。

編集

私の頭に浮かぶもっと簡単な考えは...あなたがグリッドセルへの世界を持っているときです。常に、黒い点が緑の点までのマンハッタン距離をたどるようにします。次に、各セルに重みを割り当てることができます。障害物はグリッドセルに高い重みを付けることができ、自由移動は(たとえば)重みを0にすることができます。マンハッタン距離に沿って移動するごとに、次のセルの重量が現在のセルの重量よりも大きくないかどうかを確認してください。高い場合は、隣接するセルの重量を確認してから先に進みます。

お役に立てれば


このA *アルゴリズムの記事は私が探していたもののようですが、残念ながら私はまだ「世界」をグリッドに分割する方法を知りません:S-
ユーザー

それは本当に異なります。考え:世界を32 x 32のグリッドに分割し、2D配列の位置を表します。たとえば、あなたの場合:赤いドットは120、120ピクセル(または120/32 x 120/32:3.75 x 3.75)にあります。3.75x 3.75はワールドグリッド(または2D配列)上の位置を表します。配列は整数でインデックス付けされるため、整数部分のみが必要です。したがって、赤い点は3 x 3になります。これが役立つことを願っています
brainydexter

18

ステアリング動作は、ほぼこの正確な問題セット向けに設計されています。

http://www.red3d.com/cwr/steer/

基本的には、障害物回避行動とおそらくシークまたは追跡行動を組み合わせます。そのページには、さまざまな動作とその動作に関するJavaアニメーションがたくさんあります。ステアリング動作のオープンソース実装がいくつかあります。 ここに一つあります。


これには、ステアリング動作が最適です。
-tenpn

2

簡単に試せるのは、黒のドットより先に見えないドットを作成して、最初の画像のパスを実行することです。黒いドットは、目に見えないドットの後ろにわずかな距離をおいて続きます。
私はこの仕事を良い結果で見ましたが、もちろんあなたのニーズに合わないかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.