Scripted_Behavior - superclass: ReferenceTarget; super-superclass:MAXWrapper - 4:0 - classID: #(716798510, 1784546452)
群集システムを実行すると、有効なフォースの動作から代理オブジェクトのフォース ベクトルとスピードがすべて集められます。これらのフォース ベクトルとスピードが、代理オブジェクトのモーション パラメータに基づいて平均化されて統合され、代理オブジェクトの速度ができあがります。この速度は、代理オブジェクトに有効なコンストレイント動作があるか、または有効な既定値の回避動作がある場合には、変更されることがあります。
速度が設定された後、有効な方向動作があれば、この速度を使って代理オブジェクトの方向が設定されます。有効な方向動作がなければ、既定値の代理オブジェクト パラメータから方向が計算されます。最終的にこの速度は統合され、新しい位置が計算されます。
代理オブジェクトの新しい位置は、すべての動作に対してすべてのフォースが計算されるまで設定されません。
Biped 群集の場合、Biped の進む方向はフォースではなくゴールを基準に決定されます。したがって、Biped に作用するフォースの動作を作成するためには、ゴールの位置を指定する必要があります。Biped の動きは速度の計算に基づいているのではなく、モーション フロー グラフでのクリップの選択に基づいているので、フォースを速度に統合する必要はありません。
[MAXScript を編集](Edit MaxScript)ウィンドウで宣言されたスクリプト関数が、非表示の MAXScript コンテキストに宣言されます。このテキストボックスは、コンテキストの名前を指定します。ここで一意の名前を指定すると、異なるスクリプト定義動作間での衝突が避けられます。
[フォース](Force)、[コンストレイント](Constraint)、[方向](Orientation)の 3 つの動作タイプのうちの 1 つです。
フォース: タイプの動作は、代理オブジェクトを特定の方向に強制的に動かします(例:探査および反発)。フォース動作は、代理オブジェクトを動かす方向にフォース ベクトルを戻します。場合によっては、移動するスピードや到達目標とするゴールなども強制的に動かします。
コンストレイント: このタイプの動作は、代理オブジェクトの位置と動作を制限します(例: SurfaceFollow)。コンストレイント動作は、速度を設定し、ときにはコンストレイントを満たすために代理オブジェクトの位置も変更します。1 フレームの 1 代理オブジェクトにつき有効なコンストレイント動作が 1 つしかない場合もあります。
方向: このタイプの動作は、代理オブジェクトの方向にのみ影響を与えます(例: 方向)。これらの動作ではフォースは使用されませんが、代理オブジェクトが向くべき方向(クォータニオンによって表現される)を返します。有効な方向動作は、代理オブジェクトの既定値の方向を無効にします。速度は、既定値の方向を決定します。コンストレイント動作と同様に、1 フレームの 1 代理オブジェクトにつき有効な方向動作が 1 つしかない場合もあります。
[MAXScript を編集](Edit MaxScript)ボタンは、スクリプト定義動作のロールアウトで、スクリプト定義動作のスクリプトを入力するために使用する[MAXScript エディタ](MAXScript Editor)ウィンドウを開きます。このエディタ ウィンドウは、MAXScript の他のエディタ ウィンドウと似ていますが、スクリプト定義動作用に若干カスタマイズされています。
[ファイル](File)メニューにある次の要素は、機能が異なります。
[新規](New): 1 つのスクリプト定義動作につき 1 つのエディタしか開けないので、無効になっています。
[開く](Open): 既存のエディタ ウィンドウでファイルを開きます。既存のテキストは失われます。
[評価](Evaluate): スクリプトを評価し、動作のパラメータ ブロックに保存します。
[閉じる](Close): エラーが検出されなければ、動作のパラメータ ブロックに保存してエディタを閉じます。
スクリプト定義動作のスクリプトは、シミュレーションの計算時に群集システムによって呼び出される一連のイベント ハンドラを定義して実行します。イベント ハンドラは、自動的に非表示の MAXScript コンテキストに含められます。コンテキストの名前は、このダイアログ ボックスの[スクリプトのコンテキスト名](Script Context Name)テキスト ボックスか、それと等しい .scriptContextName から取得されます。
スクリプトが評価されるたびに呼び出されます。初期化はすべてここで行われます。
<delegates> シミュレーションへの参加が命令された後のすべての代理オブジェクトの配列。すべての代理オブジェクトの配列[動作の割り当てとチーム](Behavior and Team Assignment)ダイアログ ボックスの[動作の割り当て](Behavior Assignments)ペインにリストされる代理オブジェクトは、すべてここにリストされます。
群集システムが再描画されるたびに呼び出されます。ビューポート描画メソッドである gw 構造体の低レベルの描画関数を使って、動作のカスタム表示を指定することができます。
<delegate> は、動作が割り当てられる代理オブジェクト ノードです。
特定の代理オブジェクトについて動作が有効になるたびに呼び出されます。これは、割り当てられた動作のシミュレーションの最初や、認識機能コントローラが動作を有効にするときに呼び出されます。
動作のタイプが[フォース](Force)または[方向](Orientation)の場合、このハンドラは各フレームで代理オブジェクトを動かすために呼び出されます。
<delegate> は、動作が割り当てられる代理オブジェクト ノードです。
<numSubSamples> フレームごとに必要なサブ サンプルの数。
<displayHelpers> 値が true になるか false になるかは、<Crowd>.update と <Crowd>.updateFrequency および現在のフレームによって決まります。true の場合、代理オブジェクト構造から使用できる表示関数を使って、必要なヘルパー イメージを表示します。たとえば、true の場合は、ほとんどの動作はそのフォースを表示し、パスフローはそのターゲットを表示します。delegates.lineDisplay、.sphereDisplay、.bboxDisplay、および .textDisplay はすべて、群集シミュレーションの計算中に特定の代理オブジェクトに対してグラフィック プリミティブを描くことができる関数です。その他のビューポート描画方法については、「ビューポート描画メソッド」を参照してください。
<weight> は、この動作の代理オブジェクトでの重みです。
<point3_force> は、フォースのベクトルです。正規化して、代理オブジェクトの平均スピードを乗算する単位です。フォースを強くする場合はこの値を大きくし、弱くする場合はこの値を小さくします。
<point3_goal> は、ワールド空間のゴール位置です。
<float_speed> は、代理オブジェクトの正味スピードです。この値は、代理オブジェクトの平均スピードに正規化されます。1.0 の値は、平均スピードで移動することを意味します。
<Speed_Weight_at_the_Goal> は、代理オブジェクトがゴールに到達するときのスピードを表します。この値は、代理オブジェクトの平均スピードで正規化されます。つまり、値 1.0 がその平均スピードになります。
on constraint <delegate> <behavior> <time> <numSubSamples> <displayHelpers> <finalSet> <velocity> <speed> <pos>do<expr>
動作のタイプ <Scripted_Behavior>. type がコンストレイントの場合、このハンドラは代理オブジェクトを制限するために少なくとも各フレームで 1 回呼び出されます。コンストレイント動作は、その他のフォース動作、回避動作をすべて変更する他、加速制限やスピード制限などもすべて変更します。コンストレイント動作をシミュレーションで使用するときは注意してください。
コンストレイント動作を使用すると、代理オブジェクトの現在の位置、速度、スピードが変更され、その移動する位置が制限されます。これらの位置の組み合わせで、次の位置が決まります(Next_position = Current_Position +Normalized(vel) * Speed)。現在の位置が変更されても、その実際の位置が変わるわけではなく、新しい位置を計算するときに使用する位置が変わるだけです。このデザインでは、コンストレイントによってオブジェクトの速度を急に変更してそのスピードを維持し、代理オブジェクトのエネルギーを節約することができます。
<delegate> は、動作が割り当てられる代理オブジェクト ノードです。
<numSubSamples> は、フレームごとに必要なサブ サンプルの数です。
<displayHelpers> 値が true になるか false になるかは、<Crowd>.update と <Crowd>.updateFrequency、および現在のフレームに応じて異なります。true の場合、代理オブジェクトから使用できる表示関数を使って、必要なヘルパー イメージを表示します。たとえば、true の場合は、ほとんどの動作はそのフォースを表示し、パスフローはそのターゲットを表示します。delegates .lineDisplay、.sphereDisplay、.bboxDisplay、および .textDisplay はすべて、群集シミュレーションの計算中に特定の代理オブジェクトに対してグラフィック プリミティブを描くために使用できる関数です。その他のビューポート描画方法については、「ビューポート描画メソッド」を参照してください。
<finalSet> は、これが最後であるかどうかに関係なく、現在のフレームで呼び出されます。
現在、コンストレイント動作の「on constraint」イベント ハンドラは、フレームごとに 2 回呼び出されます。最初は、値が false のパラメータ finalSet を持つ既存の Avoid_Behavior の前に呼び出されます。2 回目は、代理オブジェクトの制限と Avoid_Behavior が、値が true のパラメータ finalSet で適用された後に呼び出されます。この評価は、代理オブジェクトの制限と Avoid_Behavior が、コンストレイントが実行する変更に影響を与えることができるように行われます。2 回目の呼び出しは、コンストレイントが依然として満たされていることを確認するためのものです。
finalSet の状態をチェックする理由の 1 つは、内部でキャッシュされた内容が変更されないようにするためです。たとえば、Surface_Follow コンストレイント動作は、それが位置する三角形および重心座標を追跡します。シミュレーションでは、finalSet が true になるまで、これらの値は変わりません。
<velocity> は、このフレームにおける代理オブジェクトの現在の速度です。
<speed> は、このフレームにおける代理オブジェクトの現在のスピードです。
<pos> は、このフレームにおける代理オブジェクトの現在の位置です。
最後の代理オブジェクトの「on constraint」がシミュレーションの最後のフレームに対して実行された後、「on setupDelegates delegates behavior do」は空の配列「#() ReferenceTarget:Scripted_Behavior」によって呼び出されます。これは保証されているので、内部キャッシュをすべて消去するために、書き込まれたコンストレイント動作で使用できます。
<int_flags> は、次の値の合計です。<point3_pos> は、修正された現在の位置で、これを使って新しい位置が計算されます。コンストレイントを満たすために、この動作は代理オブジェクトの現在位置を修正することができます。
<point3_goal> は、ワールド空間のゴール位置です。
<float_speed> は、代理オブジェクトの正味スピードです。この値は、代理オブジェクトの平均スピードに正規化されます。
動作のタイプ <Scripted_Behavior>. type が「方向」の場合、このハンドラは各フレームで呼び出されます。このハンドラは、常に applyForce ハンドラとともに呼び出されます。
<delegate> は、動作が割り当てられる代理オブジェクト ノードです。
<velocity> は、このフレームにおける代理オブジェクトの現在の速度です。
<quat_orientation> は、クォータニオンの代理オブジェクトの方向です。