ソーシャルフォース
概要と主要な概念
ソーシャルフォースは、ソーシャルフォース動作がアクティブなエージェントに適用される、計算された方向性のフォースです。これらのフォースは個別のコンポーネントで構成され、加算することで累積的なフォースとなり、エージェントを特定の方向に加速させます。
式
フォースのユーザーインターフェイスには多くの場合、そのフォースの計算方法を表す式が表示されます。式をクリックすると、式の各コンポーネントが何を意味しているかのヒントを見ることができます。
式は通常、ユーザー定義のスケール係数で構成され、いくつかの方向性単位ベクトルで乗算されます。その後で、結果が係数により乗算されます。この係数は、エージェントからの距離により決定されます。指数値を入力して、周囲のエージェントからの距離が総合的なフォースの計算にどのような影響をおよぼすかを定義します。
例として、エージェントを周囲のエージェントに引き寄せる引力フォースについて考えます。
記号ûₙは、周囲のエージェントに向けられる、すなわちエージェントの中心から、周囲のエージェントの境界ボックスで最も近いポイントに向けられる、正規化された(単位)ベクトルを表します。この単位ベクトルは、ユーザーの定義するスケール係数でスケーリングされます。その結果が、記号‖uₙ‖で表される、エージェントからの距離によって決められる係数によって再度スケーリングされます。
例として、ûₙがベクトル[0.97, 0.24]で、‖uₙ‖が上図から得られる概算値で0.5と考えます。スケール係数は0.1で、距離の指数は-1に定義します。最初に、式でûₙを0.1でスケーリングし、ベクトル[0.097, 0.024]が得られます。次に、そのベクトルを0.5-1、すなわち2で乗算します。結果として、この周囲のエージェントについて得られるフォースは[0.194, 0.048]です。
fn = 0.1 · [0.97, 0.24] · 0.5-1 = [0.194, 0.048]
このシナリオでは、他のフォースがエージェントに影響しなければ、エージェントは[0.194, 0.048]の方向性加速度を得ることになります。
式における、2つのユーザー定義の値による影響に注意してください。スケール係数、この場合には0.1は、フォースの全体的なスケーリングを行います。このスケール係数を使用し、ソーシャルフォース動作を構成する他のフォースとの相対値で、このフォースの強度を調整できます。指数値(この場合は-1)は、エージェントからの距離に応じてフォースをスケーリングします。値が-1ということは、距離が大きくなるほどフォースは小さくなり、距離が小さくなるとフォースが大きくなることを意味します。指数値が-2なら、距離とフォースとの逆相関はさらに強くなり、重力と同様なフォースになります。指数値を0にすることもできます。この場合、フォースの規模に距離は影響しないことになります。または、指数を正の値にすることもできます。この場合、距離とフォースの規模は正相関します。距離が大きくなるほどフォースも大きくなります。
引力フォースなど近接ベースのフォースは、エージェントに近い周囲のエージェントのそれぞれについて計算されたフォースすべての合計です。この合計は、式のΣ記号で表されます。
近接ベースのフォース
近接ベースのフォースには、次のものがあります。
引力フォース
上で述べたように、引力フォースはエージェントを周囲の近くのエージェントに引き寄せるフォースです。最大距離以内に存在する周囲のエージェントのそれぞれについてフォースを計算してから、フォースをすべて合計します。
スケール値と指数に加えて、引力フォースには次のプロパティがあります。
- 最大距離 - フォースの最大検出距離を定義します。この距離以内にある周囲のエージェントについてのみ、フォースが適用されます。
- 近接規模ごと - このチェックボックスは、フォースを合計する方法に影響します。オンのとき、フォースは別々に計算されてから合計されます。このため、エージェントの周囲にエージェントが数多く存在するほど、フォースは大きくなります。これに対してチェックボックスがオフのとき、周囲のエージェントのフォースは、最初に距離係数で乗算されます。その後で、フォースの合計が行われます。最後に、合計のフォースが正規化され、スケール係数で乗算されます。この構成では、本質的に静的なフォースの規模を、エージェントの周囲にあるエージェントの重心に向けて定義することになります。言い換えれば、周囲に存在するエージェントの数にかかわらず、フォースの規模は同じ、具体的には入力したスケール係数になります。この構成は、結合フォースと呼ばれます。
- アクティブルール - [アクティブルール]の詳細については、ソーシャルフォースシステムの[動作]タブに関する説明を参照してください。
反発フォース
反発フォースは引力フォースと似ていますが、逆方向、すなわち周囲のエージェントから離れる方向に適用されます。標準の引力フォースのプロパティに加えて、次のプロパティが存在します。
- ハード制限 - 反発フォースの追加フィールド。エージェントが周囲のエージェントとの間で保つ必要がある最小距離を決定します。
結合フォース
結合フォースは、エージェントを周囲のエージェントの重心に引き寄せます。この結合は引力フォースで、[近接規模ごと]チェックボックスがオフの場合です。
横軸フォース
横軸フォースは、エージェントの周囲のエージェントが、エージェントに向かって移動している場合に適用されます。このフォースは、エージェントを右側にプッシュします。最初のフィールドはスケール係数で、この値が方向を決定します。正の値はエージェントを右側に動かし、負の値はエージェントを左側に動かします。2番目の値は指数値です。
- 視野 - このフィールドは、エージェントがこのフォースを適用するとき周囲のエージェントを探す範囲を角度で決定します。
- 移動方向しきい値 - エージェントは、自分の移動方向と最低でもこの角度だけ異なる移動方向を持つ周囲のエージェントにのみ、フォースを適用します。
- 最大距離 - フォースの最大検出距離を定義します。この距離以内にある周囲のエージェントについてのみ、フォースが適用されます。
整列フォース
整列フォースは、エージェントの速度を、周囲のエージェントの速度に合わせるように働くフォースです。このフォースについて、周囲のエージェントの速度と、エージェントの速度との差として、ベクトルΔvₙが計算されます。言い換えると、エージェントに適用された場合、エージェントの速度を周囲のエージェントの速度と同じに変更するフォースです。
- 最大距離 - フォースが適用可能な、エージェントからの有限の距離を指定します。
セルフベースフォース
セルフベースフォースには次のものがあります。
摩擦フォース
摩擦フォースは、エージェント移動と逆の方向に適用されます。
- 静止摩擦 - エージェントが停止しているときに適用されます。一般に、この値は動摩擦要素より大きくなります。この値はしきい値として働き、エージェントが動き始めるには、他のフォースの合計がこの値を超える必要があります。
- 動摩擦 - 移動しているエージェントに適用され、他のフォースがエージェントをプッシュしていなければ、エージェントの速度を低下させ、停止させます。指数フィールドは、エージェントの速度を考慮して、どのようにフォースが適用されるかに影響を及ぼします。正の数値は、速度が増加するほどフォースが強くなることを意味します。
モメンタムフォース
モメンタムフォースは、摩擦フォースの逆に働きます。移動パスに沿って、エージェントの移動を続けるようにプッシュします。最初のフィールドはスケール係数、2番目のフィールドは指数です。
目的ベースのフォース
目的ベースのフォースは、エージェントが目的地に向かって移動するように働きます。このフォースには、移動目的地フォースと、A*移動パスフォースがあります。目的ベースのフォースを定義するときは、どちらか片方のみを選択します。
移動目的地
移動目的地フォースは、エージェントに与えられた任意の移動タスクを取得して、最終目的地の場所をエージェントへのプルフォースとして使用し、エージェントを目的地に向かって移動させます。他のフォースと同様に、最初のフィールドはスケール係数で、指数フィールドも存在します。
- 完了しきい値 - この値は、エージェントが目的地からどれだけ近くに到達すれば目的地に達した、すなわち移動タスクが終了と見なされるかを定義します。
A* 移動パス
A*移動パスフォースは、A*ナビゲーションからの要素を使用してフォースを計算します。エージェントシステムは、A*システムとの通信によりパスを決定します。パスが計算されると、エージェントはこのフォースにより、パスに沿って目的地まで移動するように動かされます。エージェントがパスに沿って移動するときは、現在のターゲットノードが存在し、パスの現在のアンカーとして機能します。エージェントのパスの引力は、現在のターゲットノードに関連付けられている2つの主なフォースで構成されます。ノード引力フォースは、エージェントを直接ノードに引き寄せます。これに対してパス同調フォースは、パスが現在のターゲットノードに向かっている方向にエージェントを動かすように働きます。
- ノード引力フォース - このフォースは、エージェントから現在のターゲットノードに直接向かいます。ここでも、スケール係数と距離ベースの指数を入力できます。多くの場合は正の指数を使用します。この場合、エージェントがパスから離れるほど、エージェントをパスに引き戻すフォースが強くなります。
- パス同調フォース - このフォースは、エージェントが現在のノードにおけるパスと同じ方向に移動するようプッシュします。このフォースは、パス上で現在のターゲットノードのベクトル場所から、1つ前のターゲットノードの場所を引いて、正規化したものです。ここでも、スケール係数と距離ベースの指数を入力できます。デフォルトでは、パス同調フォースの指数は負の値です。この場合、エージェントがパスから離れるほど、ノード引力フォースが強くなり、エージェントがパスと同調するまで、パスに戻るようプッシュします。
- 目的フォース - このフォースは、エージェントが最終目的地に向かって移動するようプッシュします。最初のフィールドはベクトルのスケール係数、2番目のフィールドは式の指数です。デフォルトでは指数は負の値です。この場合、エージェントが目的地に近づくほど、エージェントを引き寄せるフォースが強くなります。
- パス進行角度 - エージェントが移動パス上を進行するにつれ、ターゲットノードが更新されます。このフィールドは、現在のターゲットノードを更新するときのしきい値を定義します。ノード引力フォースとパス同調フォースとのベクトルの差が、定義された角度よりも大きくなると、システムは現在のターゲットノードの進行をトリガーします。
- 位置差係数 - このフィールドは、現在のターゲットノードの進行を行うための、2番目の可能なしきい値を定義します。これは、現在のターゲットノードまでの距離と、次のターゲットノードまでの距離とを比較するために使用されます。たとえば、この値が1.0なら、次のターゲットノードまでの距離が、現在のターゲットノードまでの距離よりも小さくなると、エージェントは現在のターゲットノードを進行します。通常、この値は0~1の範囲です。0.5なら、次のターゲットノードまでの距離が、現在のターゲットノードまでの距離の半分より小さくなると、エージェントは現在のターゲットノードを進行します。
- パス再計算タイムアウト - 定義された時間が経過しても、エージェントが移動パスに沿って進行できない場合、システムはエージェントに新しいパスの再計算を強制的に行わせます。これにより、エージェントがデッドロックで停止することを回避できます。
- 完了しきい値 - エージェントが目的地からどれだけの距離内に到達すれば、目的地タスクが終了と見なされるかを決定します。
- バリアを静的エージェントとして追加 - このチェックボックスをオンにすると、フォースの判定においてバリアがエージェントとして扱われます。たとえば、バリアについてエージェントにより反発フォースが使用されます。
- A*ノード方向制限の適用 - A*バリア、壁、ディバイダーなどにハード制限を適用します。これにより、エージェントがフォースにより壁に向けてプッシュされても、壁を突き抜けることが防止されます。
カスタムフォース
カスタムフォースを使用して、カスタムコードでフォースを定義できます。
- 近接フォースごと - 周囲のエージェントのそれぞれにフォースを適用します。
- 最大距離 - フォースが適用される最大距離を定義します。
ランダムフォース
定義済みの規模に基づいて、エージェントをランダムな方向に引き寄せるフォースを適用します。
- 規模 - ランダムフォースの規模を定義します。