3ds Max 2009 以降で提供されているノード イベント システムを使用すると、ノード関連のさまざまなシーン イベントに応じてトリガされるスクリプト関数を定義することができます。シーン イベントは 3ds Max SDK の INodeEventCallback クラスのイベント メソッドに 1 対 1 でマッピングされます。それぞれのイベント メソッドに関する詳細は、maxsdk¥include¥ISceneEventManager.h の INodeEventCallback クラスに関するメソッドのコメントを参照してください。
ノード イベント システムは一般イベント コールバック機能によく似ています。ノード イベント システムは一般イベント コールバック機能の上のレイヤとして動作しますが、従来のシステムでは処理できなかったようなノード メッセージ(ジオメトリ、トポロジ、マッピングの変更など)を受信することができます。ノード イベント システムは、従来のシステムでは捕らえることができない場合もあった、「元に戻す」や「やり直し」などの結果として発生するイベントも捕らえることができます。
このように、ノードに関連するイベントやノードに対する変更を捕らえたい場合には、ノード イベント システムを使用する方法が最適です。
<callbackItem>NodeEventCallback [mouseUp:<bool>] [delay:<integer>] \ [enabled:<bool>] \ [callbackBegin:<fn>] [all:<fn>] \ [added:<fn>] [deleted:<fn>] \ [linkChanged:<fn>] [layerChanged:<fn>]\ [groupChanged:<fn>] [hierarchyOtherEvent:<fn>] \ [modelStructured:<fn>] [geometryChanged:<fn>] \ [topologyChanged:<fn>] [mappingChanged:<fn>] \ [extentionChannelChanged:<fn>] [modelOtherEvent:<fn>] \ [materialStructured:<fn>] [materialOtherEvent:<fn>] \ [controllerStructured:<fn>] [controllerOtherEvent:<fn>] \ [nameChanged:<fn>] \ [wireColorChanged:<fn>] [renderPropertiesChanged:<fn>] \ [displayPropertiesChanged:<fn>] [userPropertiesChanged:<fn>] \ [propertiesOtherEvent:<fn>] \ [subobjectSelectionChanged:<fn>] [selectionChanged:<fn>] \ [hideChanged:<fn>] [freezeChanged:<fn>] \ [displayOtherEvent:<fn>] [callbackEnd:<fn>]
次のスクリプト例は、オプションのキーワード引数 all: に関数を登録することによって何らかのメッセージを受信した場合に、MAXScript リスナーに対してメッセージを出力します。
このスクリプトは linkChanged: イベントまたは layerChanged: イベントが発生した場合(1 つのノードが別のノードにリンクされた場合、別のノードへのリンクを解除された場合、別のレイヤに移動された場合)にもメッセージ ボックスを表示します。
NodeEventCallback() コンストラクタが呼び出されると、クラスのインスタンスが作成され、呼び出しの結果として返されます。
このインスタンスを開放して呼び出しを取り除くためには、インスタンスに対するハンドラを保持している変数の値を未定義に設定し、ガーベジ コレクタを呼び出してメモリをクリアして効率的に呼び出しを破棄します。
オプションのキーワード引数である mouseUp: が true に設定されている場合は、コールバックはマウス ボタンが押されていない場合にのみトリガされます。
オプションのキーワード引数である delay: が(ミリ秒単位の時間で)指定されている場合は、コールバックは指定された時間だけ一切のイベントが発生しなかった場合(指定された時間だけシステムがアイドル状態であった場合)にのみトリガされます。
ノード イベント システムによって受信されたメッセージ内に指定されたタイプのコールバックが含まれている場合に実行される定義済みの MAXScript 関数には、1 個または複数個のその他のオプションのキーワード引数を指定することができます。
重要: |
コールバック関数は常に 2 つのパラメータを取ります。1 つ目は関数呼び出しをトリガしたイベント名、2 つ目はノードの AnimHandle のリストです。 ノード自体を取得するためには、 GetAnimByHandle() メソッドを使用する必要があります。 指定した関数が 2 つの引数を予期しないものである場合は、エラーが発生します。たとえば、関数 ObjFn が渡されて、引数が何も指定されない場合は、次のようなエラーになります。 エラーの文章から、関数は正しくコールバックが誤っているものと誤解してしまう場合がありますが、そうとは限りません。 コールバックは常に 2 つの引数を渡しますが、関数が 2 つの引数を受け入れられない場合には、エラー メッセージは単に、関数が何によって呼び出されたのか、2 つのパラメータが渡されたのはなぜかを認識できないという事実を表しているにすぎません。 |
コールバックがトリガされると、キューイングされているすべてのイベントのメッセージが 1 つのバッチに送信されます。
callbackBegin: メッセージはバッチの開始を示し、 callbackEnd: はバッチの終了を示します。
この 2 つのオプション キーワード引数を使用して関数を登録すると、単一のメッセージ バッチの開始と終了の通知を受けることができます。
指定された関数は、ノードが別のノードにリンクされたり別のノードからリンク解除された場合に必ず呼び出されます。
指定された関数は、ノードが別のレイヤに移動された場合に必ず呼び出されます。
指定された関数は、ノードがグループに追加されたり、グループから削除された場合に必ず呼び出されます。
指定された関数は、モデルの構造が変更された場合に必ず呼び出されます。
指定された関数は、ノードのジオメトリが変更された場合(頂点が移動された場合など)に必ず呼び出されます。
指定された関数は、ノードのジオメトリのトポロジが変更された場合(エッジが追加または削除された場合など)に必ず呼び出されます。
指定された関数は、ノードのジオメトリのマッピングが変更された場合(UV 座標が割り当てられた場合や修正された場合など)に必ず呼び出されます。
指定された関数は、ノードの非マッピング チャネルが変更された場合(頂点アルファ、ソフト選択など)に必ず呼び出されます。
指定された関数は、マテリアルがノードに追加されたり、ノードから削除されたりした場合に必ず呼び出されます。
指定された関数は、コントローラがノードの SubAnim トラックに割り当てられたり、SubAnim トラックから削除されたりした場合に必ず呼び出されます。
指定された関数は、ノードの名前が変更された場合に必ず呼び出されます。
指定された関数は、ノードのワイヤフレーム カラーが変更された場合に必ず呼び出されます。
指定された関数は、ノードのレンダリング制御プロパティ([レンダリング可能](Renderable)、[カメラに対して可視](Visible to Camera)、[反射/屈折に対して可視](Visible to Reflection/Refraction)など)が変更された場合に必ず呼び出されます。
指定された関数は、ノードの表示プロパティ([ボックスで表示](Display as Box)、[頂点数](Vertex Ticks)、[背面非表示](Backface Culling)など)が変更された場合に必ず呼び出されます。
指定された関数は、ノードのユーザ定義プロパティ バッファが変更された場合に必ず呼び出されます。