下の画像のようなものを取得しようとしています。ご覧のように、高速道路があり、その中には移動しているオブジェクトがあります(ミリ秒)。通りの行動はパイプラインのようなものだと思います。高速道路がオブジェクトをロードすると、オブジェクトは最初に表示され、高速道路のもう一方の端に到達するまで高速道路を移動します。
私の主な問題は、いくつかのオブジェクトを高速道路の内側だけに移動するにはどうすればよいですか?
下の画像のようなものを取得しようとしています。ご覧のように、高速道路があり、その中には移動しているオブジェクトがあります(ミリ秒)。通りの行動はパイプラインのようなものだと思います。高速道路がオブジェクトをロードすると、オブジェクトは最初に表示され、高速道路のもう一方の端に到達するまで高速道路を移動します。
私の主な問題は、いくつかのオブジェクトを高速道路の内側だけに移動するにはどうすればよいですか?
回答:
それは依存します:どのようにしたいですかそれらを移動しますか?
一連の頂点でプリセットパスを定義し、バルーンがパスに厳密に従うようにします。
風船をボイドにし、群衆のパスの追跡動作を実装する。これが互いに衝突しないようにしながら、パスに追従します(パスから遠すぎないようにします)。これらのページには、Javaアプレットの例が含まれています。
それらのページの作者は、サンプルのソースコードを配布することはできないと述べていますが、OpenSteerいますがはそれらのアルゴリズムのC ++実装を提供しています。
(私はC#boidsライブラリ、または適切なチュートリアルを認識していません-私がやったことはコード例に従うだけです)
ポイントのリストとバルーンのリストが必要です
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;
}
}
}
単一のパスを持つタイルで構成された道路(「パイプライン」と呼ぶ)がある場合、ボイド、回避、AI、または本当に特別なものは必要ありません。それぞれの風船を道路タイルの自然な方向に動かしてください。たとえば、砂以外のタイルを1つだけタッチする開始タイルを指定すると、移動する方向を見つけることができます。これは、「ここではなく、どこにいても砂ではない」方向です。道路には流れの方向が2つしかないため、最初の方向とタイルが確立されると、アルゴリズムが問題を解決します。
行くところが他にないからといって、風船はお互いに続いているように見えます。それらがすべて一定の速度で移動する場合、衝突は起こりません。一定の速度で移動しない場合でも、「ここではなく、どこにいても砂ではない」に「十分なスペースがあることを確認して」を追加できます。
少し一般化して、方向を抽出する方法としてタイルの画像を使用できます。たとえば、L字型の道路ストライプは、「南に行く場合は東に向ける」または「西に行く場合は北に向ける」のいずれかを意味します。
このシステムは、実行する意思決定を行うと故障します。つまり、実行できる単一のパスではありませんが、スクリーンショットと問題の説明から、それは問題ではないようです。それがアプリケーションの要件である場合は、間違いなく、よりAI中心のアプローチに投資してください。