Scripted_Behavior : MAXObject

Scripted_Behavior - superclass: ReferenceTarget; super-superclass:MAXWrapper - 4:0 - classID: #(716798510, 1784546452) 
 

   

Character Studio - クイック ナビゲーション

群集システムの概要

群集システムを実行すると、有効なフォースの動作から代理オブジェクトのフォース ベクトルとスピードがすべて集められます。これらのフォース ベクトルとスピードが、代理オブジェクトのモーション パラメータに基づいて平均化されて統合され、代理オブジェクトの速度ができあがります。この速度は、代理オブジェクトに有効なコンストレイント動作があるか、または有効な既定値の回避動作がある場合には、変更されることがあります。

速度が設定された後、有効な方向動作があれば、この速度を使って代理オブジェクトの方向が設定されます。有効な方向動作がなければ、既定値の代理オブジェクト パラメータから方向が計算されます。最終的にこの速度は統合され、新しい位置が計算されます。

代理オブジェクトの新しい位置は、すべての動作に対してすべてのフォースが計算されるまで設定されません。

Biped 群集の場合、Biped の進む方向はフォースではなくゴールを基準に決定されます。したがって、Biped に作用するフォースの動作を作成するためには、ゴールの位置を指定する必要があります。Biped の動きは速度の計算に基づいているのではなく、モーション フロー グラフでのクリップの選択に基づいているので、フォースを速度に統合する必要はありません。

   

コンストラクタ

Scripted_Behavior ... ScriptedBehavior ... 

   

プロパティ

<scripted_behavior>.name String Default: "Scripted" 

   

<Scripted_Behavior>.scriptContextName String Default: "apply" Alias: Script_Context_Name 

[MAXScript を編集](Edit MaxScript)ウィンドウで宣言されたスクリプト関数が、非表示の MAXScript コンテキストに宣言されます。このテキストボックスは、コンテキストの名前を指定します。ここで一意の名前を指定すると、異なるスクリプト定義動作間での衝突が避けられます。

   

<Scripted_Behavior>.type Integer Default: 0 Alias: Behavior_Type 

[フォース](Force)、[コンストレイント](Constraint)、[方向](Orientation)の 3 つの動作タイプのうちの 1 つです。

フォース: タイプの動作は、代理オブジェクトを特定の方向に強制的に動かします(例:探査および反発)。フォース動作は、代理オブジェクトを動かす方向にフォース ベクトルを戻します。場合によっては、移動するスピードや到達目標とするゴールなども強制的に動かします。

コンストレイント: このタイプの動作は、代理オブジェクトの位置と動作を制限します(例: SurfaceFollow)。コンストレイント動作は、速度を設定し、ときにはコンストレイントを満たすために代理オブジェクトの位置も変更します。1 フレームの 1 代理オブジェクトにつき有効なコンストレイント動作が 1 つしかない場合もあります。

方向: このタイプの動作は、代理オブジェクトの方向にのみ影響を与えます(例: 方向)。これらの動作ではフォースは使用されませんが、代理オブジェクトが向くべき方向(クォータニオンによって表現される)を返します。有効な方向動作は、代理オブジェクトの既定値の方向を無効にします。速度は、既定値の方向を決定します。コンストレイント動作と同様に、1 フレームの 1 代理オブジェクトにつき有効な方向動作が 1 つしかない場合もあります。

注:

回避の動作タイプはありませんが、フォースまたはコンストレイント動作を使って回避動作を作成することも可能です。

群集計算のパイプラインにうまく統合されているため、既定値の回避動作を使用することをお勧めします

   

<scripted_behavior>.script: string 

MAXScript を編集

[MAXScript を編集](Edit MaxScript)ボタンは、スクリプト定義動作のロールアウトで、スクリプト定義動作のスクリプトを入力するために使用する[MAXScript エディタ](MAXScript Editor)ウィンドウを開きます。このエディタ ウィンドウは、MAXScript の他のエディタ ウィンドウと似ていますが、スクリプト定義動作用に若干カスタマイズされています。

[ファイル](File)メニューにある次の要素は、機能が異なります。

[新規](New): 1 つのスクリプト定義動作につき 1 つのエディタしか開けないので、無効になっています。

[開く](Open): 既存のエディタ ウィンドウでファイルを開きます。既存のテキストは失われます。

[評価](Evaluate): スクリプトを評価し、動作のパラメータ ブロックに保存します。

[閉じる](Close): エラーが検出されなければ、動作のパラメータ ブロックに保存してエディタを閉じます。

スクリプト定義動作の構文

スクリプト定義動作のスクリプトは、シミュレーションの計算時に群集システムによって呼び出される一連のイベント ハンドラを定義して実行します。イベント ハンドラは、自動的に非表示の MAXScript コンテキストに含められます。コンテキストの名前は、このダイアログ ボックスの[スクリプトのコンテキスト名](Script Context Name)テキスト ボックスか、それと等しい .scriptContextName から取得されます。

スクリプト定義動作のイベント ハンドラ

on execute do <expr> 

スクリプトが評価されるたびに呼び出されます。初期化はすべてここで行われます。

   

on setupDelegates <delegates> <behavior>do<expr> 

<delegates> シミュレーションへの参加が命令された後のすべての代理オブジェクトの配列。すべての代理オブジェクトの配列[動作の割り当てとチーム](Behavior and Team Assignment)ダイアログ ボックスの[動作の割り当て](Behavior Assignments)ペインにリストされる代理オブジェクトは、すべてここにリストされます。

<behavior> は、現在の動作です。

シミュレーションが開始する前に呼び出されます。

注:この動作が割り当てられているかどうかに関係なく、すべての代理オブジェクトが渡されます。したがって、動作は、使用できる代理オブジェクトの最大数を把握できるため、どのようなデータ構造が必要になっても設定できます。動作によっては、代理オブジェクトごとにパラメータを追跡する必要があるものもあります。この関数では、動作によってデータ構造を設定し、その情報を入手することができます。これは、delegate.id が一意である理由の 1 つでもあります。これによって、これらのデータ構造を吟味したり指摘することができます。認識機能コントローラのおかげで、特定の動作に対して有効になる代理オブジェクトすべてを正確に把握する必要はありません。

   

on display <behavior> <time>do<expr> 

<behavior> は、現在の動作です。

<time> は、シミュレーションの現在の時間です。

群集システムが再描画されるたびに呼び出されます。ビューポート描画メソッドである gw 構造体の低レベルの描画関数を使って、動作のカスタム表示を指定することができます。

注:

このハンドラは何回も呼び出されるため、これが実行されるとシステムの処理速度は遅くなります。

   

on behaviorStarted <delegate> <behavior> <time>do<expr> 

<delegate> は、動作が割り当てられる代理オブジェクト ノードです。

<behavior> は、現在の動作です。

<time> は、シミュレーションの現在の時間です。

特定の代理オブジェクトについて動作が有効になるたびに呼び出されます。これは、割り当てられた動作のシミュレーションの最初や、認識機能コントローラが動作を有効にするときに呼び出されます。

   

on initAtThisTime <behavior> <time> 

この関数は、フレームの最初で各動作に対して呼び出されます。

   

on applyForce <delegate> <behavior> <time> <numSubSamples> <displayHelpers> <weight>do<expr> 

動作のタイプが[フォース](Force)または[方向](Orientation)の場合、このハンドラは各フレームで代理オブジェクトを動かすために呼び出されます。

<delegate> は、動作が割り当てられる代理オブジェクト ノードです。

<behavior> は、現在の動作です。

<time> は、シミュレーションの現在の時間です。

<numSubSamples> フレームごとに必要なサブ サンプルの数。

<displayHelpers> 値が true になるか false になるかは、<Crowd>.update と <Crowd>.updateFrequency および現在のフレームによって決まります。true の場合、代理オブジェクト構造から使用できる表示関数を使って、必要なヘルパー イメージを表示します。たとえば、true の場合は、ほとんどの動作はそのフォースを表示し、パスフローはそのターゲットを表示します。delegates.lineDisplay、.sphereDisplay、.bboxDisplay、および .textDisplay はすべて、群集シミュレーションの計算中に特定の代理オブジェクトに対してグラフィック プリミティブを描くことができる関数です。その他のビューポート描画方法については、「ビューポート描画メソッド」を参照してください。

注:

 「ビューポート描画メソッド」に説明されているグラフィック ウィンドウ関数 gw.* は、フレーム毎に計算するときには正しく表示されないか、またはまったく表示されません。

<weight> は、この動作の代理オブジェクトでの重みです。

イベント ハンドラは、次のタイプの配列を戻します。

#(<int_flags>, <point3_force>, <point3_goal>, <float_speed>, <Speed_Weight_at_the_Goal>)

<int_flags> は次の値の合計です。

0 - 戻り値は、群集システムで使用されません。

1 - フォースのみが影響を受けます。

2 - ゴールのみが影響を受けます。

4 - スピードのみが影響を受けます。

たとえば、5 (1+4) の値は、

<point3_force> は、フォースのベクトルです。正規化して、代理オブジェクトの平均スピードを乗算する単位です。フォースを強くする場合はこの値を大きくし、弱くする場合はこの値を小さくします。

<point3_goal> は、ワールド空間のゴール位置です。

<float_speed> は、代理オブジェクトの正味スピードです。この値は、代理オブジェクトの平均スピードに正規化されます。1.0 の値は、平均スピードで移動することを意味します。

<Speed_Weight_at_the_Goal> は、代理オブジェクトがゴールに到達するときのスピードを表します。この値は、代理オブジェクトの平均スピードで正規化されます。つまり、値 1.0 がその平均スピードになります。

注:スピードが影響を受けるように <int_flags> を設定する場合は、<float_speed><Speed_Weight_at_the_Goal> に対して有効な値を設定する必要があります。この場合、ゴールを設定する必要はありません。これは、「SpeedVary」動作を Biped に適用する場合に該当します。この動作のゴールは明示的に設定されませんが、<Speed_Weight_at_the_Goal> 値は修正されます。

   

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> は、動作が割り当てられる代理オブジェクト ノードです。

<behavior> は、現在の動作です。

<time> は、シミュレーションの現在の時間です。

<numSubSamples> は、フレームごとに必要なサブ サンプルの数です。

<displayHelpers> 値が true になるか false になるかは、<Crowd>.update と <Crowd>.updateFrequency、および現在のフレームに応じて異なります。true の場合、代理オブジェクトから使用できる表示関数を使って、必要なヘルパー イメージを表示します。たとえば、true の場合は、ほとんどの動作はそのフォースを表示し、パスフローはそのターゲットを表示します。delegates .lineDisplay、.sphereDisplay、.bboxDisplay、および .textDisplay はすべて、群集シミュレーションの計算中に特定の代理オブジェクトに対してグラフィック プリミティブを描くために使用できる関数です。その他のビューポート描画方法については、「ビューポート描画メソッド」を参照してください。

<finalSet> は、これが最後であるかどうかに関係なく、現在のフレームで呼び出されます。

注:回避システムでコンストレイントを正しく機能させるために、コンストレイント動作を 1 フレームにつき 2 回以上呼び出す必要がある場合もあります。渡されたパラメータ finalSettrue のとき、このフレームでこのコンストレイント関数が呼び出されるのは最後になります。

現在、コンストレイント動作の「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_velocity>, <point3_pos>, <point3_goal>, <float_speed>)

   

<int_flags> は、次の値の合計です。

0 - 戻り値は、群集システムで使用されません。

1 - 戻り値は、群集システムで使用されます。

<point3_velocity> は、速度です。

<point3_pos> は、修正された現在の位置で、これを使って新しい位置が計算されます。コンストレイントを満たすために、この動作は代理オブジェクトの現在位置を修正することができます。

<point3_goal> は、ワールド空間のゴール位置です。

<float_speed> は、代理オブジェクトの正味スピードです。この値は、代理オブジェクトの平均スピードに正規化されます。

   

on orient <delegate> <behavior> <time> <velocity> do <expr> 

動作のタイプ <Scripted_Behavior>. type が「方向」の場合、このハンドラは各フレームで呼び出されます。このハンドラは、常に applyForce ハンドラとともに呼び出されます。

<delegate> は、動作が割り当てられる代理オブジェクト ノードです。

<behavior> は、現在の動作です。

<time> は、シミュレーションの現在の時間です。

<velocity> は、このフレームにおける代理オブジェクトの現在の速度です。

   

イベント ハンドラは、次のタイプの配列を戻します。

 #(<int_flags>, quat_orientation)

<int_flags> は、次の値の合計です。

0 - 戻り値は、群集システムで使用されません。

1 - 戻り値は、群集システムで使用されます。

<quat_orientation> は、クォータニオンの代理オブジェクトの方向です。

注:

群集の代理オブジェクトと動作をすべてのイベント ハンドラに渡す目的は、シーンとともに保存された存続グローバル、2 つ以上の群集シミュレーションで動作する MAXScript 関数を呼び出せるようにすることです。

例:

次に、「FormationConstraint」および「FormationOrientation」と呼ばれるスクリプト定義動作のペアを示します。

「FormationOrientation」は、方向を固定位置に制限します。ここでは、最初の回転キーフレームでの現在の代理オブジェクトの方向が基準になります。スクリプトされた方向動作全体を次の 1 つのイベント ハンドラを使って実行することができます。

on orient delegate behavior time vel do
(
#(1,delegate.rotation.keys[1].value as quat )
)

「FormationConstraint」は、リーダーに指定された「FormationLeader」のペースと方向を維持しながら、与えられた位置構成で代理オブジェクトのチームを維持します。これは鼓手隊長とマーチング バンド、あるいはあらゆる方向に突進できるランニング バックの前を走っているフットボールのブロッカーのようなものです。このリーダーが、その構成が移動するメソッドと場所を指示します。「FormationLeader」は、スクリプトされた動作を使用しません。

この動作は、代理オブジェクトの位置にも方向にも影響します。方向は、代理オブジェクトの速度によって計算されます。そうすることで、この速度が正しく設定されます。

on execute do( print" executed")
 
on constraint delegate behavior time numsubsamples displayHelpers finalSet vel speed pos do
(
leader_velocity = delegates.velocity $TheFormationLeader   
Normalized_Leader_Velocity= normalize (delegates.velocity $TheFormationLeader)   
magVel = speed*Normalized_Leader_Velocity   
temp_dis = (pos+leader_velocity)- magVel   
the_goal =temp_dis + magVel  
if displayHelpers== true then  
( 
delegates.textDisplay delegate the_goal delegate.wirecolor delegate.name 
delegates.lineDisplay delegate pos (pos+leader_velocity) delegate.wirecolor true 
delegates.sphereDisplay delegate (pos+ (leader_velocity * $Crowd01.vectorScale)) 4 
delegate.wirecolor  
)   
#(1, Normalized_Leader_Velocity, temp_dis, the_goal, speed) 
) 

関連事項