チュートリアル - マテリアルの自動割り当て

MAXScript によって、オブジェクトの選択、レンダリングの開始や停止などのシーン イベントを監視するコールバック スクリプトを作成することができます。このスクリプトで、監視対象のシステム イベントが検出されたときに常に一定のアクションが自動的に実行されます。

以下のスクリプトで、マテリアル エディタのスロット 1 から、選択した、または新規に作成した任意のオブジェクトに自動的にマテリアルを割り当てます。

関連トピック:

マクロ スクリプトの定義 および そのイベント ハンドラ

コールバック スクリプト

マテリアルの割り当て

マテリアル エディタのマテリアルへのアクセス

全体の流れ:

ボタン、メニューまたはショートカットとして使用する macroScript としてコードをパッケージ化します。

コールバックがアクティブなときに macroScript ボタンがチェックされていることを示します。

実行されるときに、ボタンが既にアクティブかどうかを調べます。 実行と実行の間にアクティブな状態を記憶しておく必要があります。

アクティブでない場合は、選択したオブジェクトのすべてのマテリアルを巡回するようにコールバックを定義し、マテリアル エディタのスロット 1 をそのすべてに割り当てます。

既にアクティブな場合は、古いコールバックを削除します。

MAXScript

    macroScript AutoMat category: "HowTo"
    (
     local AutoMat_Enabled
     on isChecked return AutoMat_Enabled
     on Execute do
     (
      if AutoMat_Enabled == undefined then
       AutoMat_Enabled = true
      else
       AutoMat_Enabled = not AutoMat_Enabled
      if AutoMat_Enabled then
      (
       txt ="if superclassof meditmaterials[1] != texturemap do \n"
       txt +="selection.material = meditmaterials[1]"
       callbacks.addscript #selectionSetChanged txt \
        id:#AssignMaterial persistent:false
      )
      else
       callbacks.removescripts id:#AssignMaterial
      updateToolbarButtons()
     )--end Execute
    )--end macroScript

ステップごとの解説:

macroScript AutoMat category:"HowTo"
(

macroScript は AutoMat と呼ばれます。スクリプトを使用する場合は、[カスタマイズ...] (Customize...)を使用してスクリプトを "HowTo" カテゴリからツールバー、メニュー、またはクアッド メニューにドラッグするか、キーボード ショートカットを割り当てることができます。

MacroScript の定義

local AutoMat_Enabled

AutoMat スクリプトがアクティブかそうでないかを追跡するために、変数内にスクリプトの状態を格納する必要があります。変数はローカルとして宣言され、最初に undefined が格納されます。 まだ値が何も割り当てられていないためです。

変数のスコープ

on isChecked return AutoMat_Enabled

isChecked ハンドラは true または true を返し、ボタンの状態を判別します。true の場合、ボタンはツールバー上で押された状態で表示されるか、メニューやクアッド メニューにチェックマークが付きます。false の場合は、通常の状態で表示されます。AutoMat_Enabled はローカル変数で、コールバックがアクティブな場合は true、アクティブでない場合は false、スクリプトがまだ開始されていないときは undefined が格納されています。

Macroscript_Body_Event_Handlers

on Execute do
(

on Execute ハンドらは、ボタンを押す、メニューから選択する、ショートカットを押すなどして macroScript が実行されるたびに実行されます。ハンドラには、スクリプトの「本体」が含まれています。

Macroscript_Body_Event_Handlers

if AutoMat_Enabled == undefined then
AutoMat_Enabled = true
else
AutoMat_Enabled = not AutoMat_Enabled

スクリプトが初めて開始され、変数に undefined が含まれている場合は、これに true を代入します。そうでない場合は、Not 論理式(truefalse に、false は true になる)を使用して変数の値を逆にします。

If 式

論理式

if AutoMat_Enabled then
(

変数が true を含んでいる場合は、先に進んでコールバックを作成します。if では、then の後の式または else の後の式のどちらかを評価するためのブール値があると想定されます。そのため、AutoMat_Enabled == true を書く必要はありません。変数自体が、正しい選択を行うために if にとって十分な true または false を含んでいるためです。ただし、いずれの形式とも有効です。

If 式

txt = "if superclassof meditmaterials[1] != texturemap do \n"

コールバックには、実行されるスクリプトを含んだ文字列が必要です。スクリプトのテキストが複数の行から構成される場合は、それを文字列の変数に格納しておくことができます。この例では、変数 txt に格納されます。"\\n" は、文字列内部で改行復帰を示すために使用されます。

マテリアル エディタはスロット内でマテリアルとマップの両方を表示することができるので、スロット 1 には現在のところテクスチャ マップが含まれていないことを確認する必要があります。そのため、スロット 1 内のオブジェクトのスーパークラスをテクスチャ マップと比較して、それがテクスチャ マップでない場合にのみ先に進みます。

クラスとオブジェクトの調査関数

txt +="selection.material = meditmaterials[1]"

このコード行では、前の行で既に定義済みの文字列に、文字列を追加して成長させます。最初の行の文字列の末尾には「\n」が含まれていたので、文字列を評価したりリスナーに出力したりすると、新しく追加された文字列は新しい行に表示されます。

文字列内のこのコードでは、マテリアル エディタのスロット 1 にあるオブジェクトを現在の選択の .material プロパティに代入します。 これは、MAXScript が選択範囲で検出されたすべてのオブジェクトを内部的に反復し、それぞれにマテリアルを割り当てるという意味です。類似した事例については、「チュートリアル - すべてのマテリアルの削除」も参照してください。

Material_Editor_meditMaterials

一般的なノードのプロパティ

callbacks.addscript #selectionSetChanged txt id:#AssignMaterial persistent:false

次に、このスクリプトをシーンのコールバック スクリプトに追加します。スクリプトは選択セットが変更されたときに実行され、後で名前を指定することで削除できるよう固有の ID である #AssignMaterial が付けられています。また、持続性がないため MAX シーンと一緒に保存されることはありません。つまり、シーンを保存してそれを後でもう一度ロードしても、このスクリプトは実行されないということです。

一般イベント コールバック機能

)
else
callbacks.removescripts id:#AssignMaterial

変数 AutoMat_Enabledfalse を含んでいる場合は、コールバックを削除してスクリプトを無効にします。固有の ID を持っているので、ユーザ定義の名前である #AssignMaterial を指定することで、スクリプトをコールバックのリストから簡単に削除できます。

Callbacks.removeScripts

updateToolbarButtons ()

ボタンの状態がツールバー内で確実に更新されるように、ツールバー ボタンを強制的に更新します。

updateToolbarButtons

)--end Execute
)--end macroScript

スクリプトの使い方

スクリプトを評価してツールバーをカスタマイズした後にテストを実行することができます。マテリアル エディタの最初のスロットに、たとえばテキスチャ マップなどの何らかのマテリアルが必要です。[マテリアル エディタ](Material Editor)のビューポート アイコンにある[マップを表示](Show Map)をオンにして、マップを表示することもできます。

スクリプトのボタンを押さないでボックスなどのジオメトリを作成した場合、通常はマテリアルはありません。ボタンを押して同じオブジェクトを選択した後に、マテリアルがそのオブジェクトに自動的に割り当てられるようになります。

新しく作成されるオブジェクトも、作成中に現在の選択になると、マテリアルが割り当てられ、3ds Max 内で選択コールバック イベントをトリガします。

スクリプトを無効にするには、ボタンを再度押す必要があります。 ボタンまたはメニュー項目のチェックマークがオフになり、コールバックが削除されます。これで通常どおりオブジェクトを選択したり作成できるようになります。

戻る

「チュートリアル」のインデックス ページ