オブジェクトをパスに沿って移動させるにはどうすればよいですか?


7

下の画像のようなものを取得しようとしています。ご覧のように、高速道路があり、その中には移動しているオブジェクトがあります(ミリ秒)。通りの行動はパイプラインのようなものだと思います。高速道路がオブジェクトをロードすると、オブジェクトは最初に表示され、高速道路のもう一方の端に到達するまで高速道路を移動します。

私の主な問題は、いくつかのオブジェクトを高速道路の内側だけに移動するにはどうすればよいですか?

bloon td4レベル1からの画面キャプチャー

回答:


17

それは依存します:どのようにしたいですそれらを移動しますか?

不自然なオプション

一連の頂点でプリセットパスを定義し、バルーンがパスに厳密に従うようにします。

より自然なオプション

風船をボイドにし群衆のパスの追跡動作を実装する。これが互いに衝突しないようにしながら、パスに追従します(パスから遠すぎないようにします)。これらのページには、Javaアプレットの例が含まれています。

それらのページの作者は、サンプルのソースコードを配布することはできないと述べていますが、OpenSteerいますがはそれらのアルゴリズムのC ++実装を提供しています。

(私はC#boidsライブラリ、または適切なチュートリアルを認識していません-私がやったことはコード例に従うだけです)


良い答えは+1です。描かれた動作をシミュレートするために必要なのは、単純なパス追跡だけだと思います。経路が急に広くなったり、「ボイド」が待ち行列に入る場所に障害物が表示されたりした場合、ステアリング動作が役立ちます。
bummzack 2011

最初のオプションの方が簡単だと思います。私に例を示すことができますか?
oscar.fimbres 2011

@ oscar.fimbres:非常に簡単なはずです。ウェイポイント座標のリスト(配列など)を作成し、最初の座標をターゲットとして、エージェントをその方向に移動します。エージェントがウェイポイントに到達したら、次のものをターゲットにします。エージェントが一定の速度で移動する場合、オーバーシュートを次のターゲットに簡単にマッピングすることもできます。
bummzack 2011

ええ、想像できます..私はサイトをチェックしています:enchantedage.com/node/78 しかし、私はスプライトをそのパスに移動できます
oscar.fimbres '21

IMO、boidsは、このような単純な問題には過剰です。任意の時点での動きは基本的に1Dであり、方向を逆にすることさえありません。ステアリングの動作は非常に単純である可能性が高く、そのようなシステムを実際に保証するものではありません。その上、風船は群れとして機能せず、自律的に機能して「群れ」を維持しようとする実際の試みを示さず、それらは道路に引っかかってすべて同じ方向に進んでいます。これは偶然の一致であり、明示的にプログラムされた動作ではありません。群れのようにそれらを扱うことは、運転のコンテキストにおいてさえ、実際には何の意味もありません。みんなをフォローしていますか?
PatrickB 2011

4

ポイントのリストとバルーンのリストが必要です

class Path 
{
   List<Vector2> Points;
   float[] Lengths;
   Vector2[] Directions;

   void Build()
   {
       Lengths = new float[Points.Count-1];
       Directions = new float[Points.Count-1];
       for (int i=0; i<Points.Count-1;i++)
       {
            Directions[i] = Points[i+1] - Points[i];
            Lengths[i] = Directions[i].Length();
            Directions[i].Normalize();
       }  
   }
}

class Balloon
{
     Vector2 Position;
     float StagePos;
     int StageIndex;
     Path Path;
     float Speed;

     void Update(float Seconds)
     {
         if (StageIndex!=Path.Points.Count-1)
         {
             StagePos += Speed * Seconds;
             while (StagePos>Path.Lengths[StageIndex])
             {
                 StagePos -= Path.Lengths[StageIndex]; 
                 StageIndex++;              
                 if (StageIndex == Path.Points.Count-1) 
                 {
                     Position = Path.Points[StageIndex];
                     return;
                 }
             }
             Position = Path.Points[StageIndex] + Directions[StageIndex] * StagePos;
         }
     }    
}

3

単一のパスを持つタイルで構成された道路(「パイプライン」と呼ぶ)がある場合、ボイド、回避、AI、または本当に特別なものは必要ありません。それぞれの風船を道路タイルの自然な方向に動かしてください。たとえば、砂以外のタイルを1つだけタッチする開始タイルを指定すると、移動する方向を見つけることができます。これは、「ここではなく、どこにいても砂ではない」方向です。道路には流れの方向が2つしかないため、最初の方向とタイルが確立されると、アルゴリズムが問題を解決します。

行くところが他にないからといって、風船はお互いに続いているように見えます。それらがすべて一定の速度で移動する場合、衝突は起こりません。一定の速度で移動しない場合でも、「ここではなく、どこにいても砂ではない」に「十分なスペースがあることを確認して」を追加できます。

少し一般化して、方向を抽出する方法としてタイルの画像を使用できます。たとえば、L字型の道路ストライプは、「南に行く場合は東に向ける」または「西に行く場合は北に向ける」のいずれかを意味します。

このシステムは、実行する意思決定を行うと故障します。つまり、実行できる単一のパスではありませんが、スクリーンショットと問題の説明から、それは問題ではないようです。それがアプリケーションの要件である場合は、間違いなく、よりAI中心のアプローチに投資してください。

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