MAXtoA スクリプト プラグイン

3ds Max 2018 以降で使用可能: MAXScript には、Arnold ノードのカスタム UI を使用して「ラッパー」プラグインを簡単に作成する機能があります。この方法はシェーダ以外のプラグイン用です。シェーダ プラグインには、別の方法が使用されます。

MAXtoA プラグインには、MAXtoA トランスレータが認識できる特殊な名前のパラメータが使用されます。MAXtoA では、プラグインにロジックが含まれているのか、それとも別の既存の 3ds Max クラスをラップするのかに関係なく、プラグインの他のパラメータや内部機能は無視されます。3ds Max はラップされたクラスおよびプラグインのロジックを認識して、UI (プラグイン タイプに応じてビューポート、モディファイヤ スタックなど)に表示します。(MAXtoA を使用する) Arnold は特殊なパラメータにのみ反応し、これらを使用して一部の特定の Arnold ノードをインスタンス化し、パラメータを適切に設定します。

拡張できるプラグイン タイプは、次のとおりです。

パラメータのレイアウトおよび命名

MAXtoA は特定の命名規則に従う公開されたパラメータを検索し、これらのパラメータに適切に対応します。MAXtoA が認識するパラメータ名は、次のとおりです。

パラメータはスクリプトに表示されている順番で、上から順に処理されます。使用前に宣言する必要があります。

enum パラメータ

enum タイプの Arnold パラメータは通常、ゼロで始まる整数値で表されます。ただし、MAXScript ドロップダウン コントロールは 1 をベースとします。したがって、MAXtoA はプラグイン UI のドロップダウンをサポートするために、enum タイプのパラメータを 1 をベースとする配列に変換します。次の図に、列挙の定義方法と UI コントロールとの接続方法を示します。

列挙に関するスニペット

parameters main rollout:params
(
   . . .
   arnold_node_mode type:#integer default:2 ui:mode
   . . .
)

rollout params " Parameters"
(
   . . .
   dropdownlist mode "Mode" items:#("Blend", "Mix", "Replace", "Add", "Sub")
   . . .
)

スクリプト ノードのパラメータ(パラメータ arnold_node_mode)には、ドロップダウンの選択内容に基づいて値 1、2、3、4、または 5 が格納されますが、Arnold に実際に送信される値は 0、1、2、3、または 4 です。

例: 球面カメラ プラグイン

この例では、FreeCamera から取得された新しいカメラ タイプ「Spherical Cam」を Arnold カテゴリ内に作成します(このカメラ タイプは、Arnold spherical_camera ノードをオンにするだけです)。このスクリプトは他のパラメータを設定しません。

plugin Camera arnold_spherical_camera
extends:FreeCamera
name:"Spherical Cam"
classID:#(135251,542126)
category:"Arnold"
replaceUI:true
(
parameters main rollout:params
    (
        arnold_node type:#string default:"spherical_camera"
    )

    rollout params "Example Parameters"
    (

    )
)

例: 球ジオメトリ プラグイン

この例では、「Sphere」という新しいジオメトリ タイプを Arnold カテゴリ内に作成します。これにより、組み込みの 3ds Max 球が拡張されて、ビューポートに表示されます。ただし実際には、レンダリングの際に Arnold には数学的に正確な「球」シェイプ ノードが提供されます。

この例に示されているコードの大部分では、マウスを使用してジオメトリを作成し、Arnold オブジェクトを定義するパラメータとの同期を維持することができます。ラップされたオブジェクトをすべて無視してよかったのなら、今よりずっと簡素なコードになっていたはずであり、ロールアウトの UI を直接 Arnold 方式のパラメータを扱うように設定することも可能でした。そうしておけば、updateArnold() 関数も必要なく、わずか数行に収めることができたかもしれません。

plugin Geometry Arnold_Sphere
name:"Sphere"
classID:#(0xf00df103, 0xc55744a1)
category:"Arnold"
extends:Sphere
replaceUI:true
(
    local lastSize, meshObj
    parameters pblock rollout:params
    (
        arnold_node type:#string default:"sphere"
        arnold_node_radius type:#float default:1.0
        arnold_node_center type:#point3 default:[0.0,0.0,0.0]

        radius type:#float animatable:true ui:radius default:1.0
    )

    fn fmax val1 val2 = if val1 > val2 then val1 else val2

    fn updateArnold =
    (
          -- Modify the Arnold Sphere
          arnold_node_radius = delegate.radius
    )

    tool create
    (
        on mousePoint click do
        case click of
        (
            1: nodeTM.translation = gridPoint
            2: #stop
        )
        on mouseMove click do
        (
            if click == 2 then (            
                radius = delegate.radius = fmax (abs gridDist.x) (abs gridDist.y)
                updateArnold()
            )
        )
    )  

    rollout params "Sphere Parameters"
    (
        Spinner radius "Radius:" range:[0, 1e9, 1]

        on radius changed val do (
            delegate.radius = val
            updateArnold()
        )
    )
)

このコードで重要なのは、Arnold 固有のパラメータ宣言です。

arnold_node type:#string default:"sphere"
arnold_node_radius type:#float default:1.0
arnold_node_center type:#point3 default:[0.0,0.0,0.0]

これらのパラメータは Arnold に対して、ノード「sphere」を構築し、浮動小数点タイプの「radius」パラメータおよびポイント タイプの「center」パラメータに、これらの変数の値を割り当てるように指示します。

独自に宣言されたユーザ変数が必要な場合(ボリューム ノードなどで必要)、コードは次のようになります。

arnold_node type:#string default:"volume"
arnold_node_min type:#point3 default:[-0.5,-0.5,0]
arnold_node_max type:#point3 default:[0.5,0.5,1]
arnold_node_dso type:#string default:"volume_openvdb"

arnold_decl_filename type:#string default:"constant STRING"
arnold_node_filename type:#filename default:"smoke.vdb"

arnold_decl_bounds_slack type:#string default:"constant FLOAT"
arnold_node_bounds_slack type:#float default:0.0

このコードを使用すると、ノードから呼び出されたボリュームが以前と同様にインスタンス化され、min、max、および dso パラメータが設定されます。ただし、残りのパラメータは(ボリュームのプラグインの性質上)ユーザによって定義されるため、文字列パラメータ「filename」、浮動小数点パラメータ「bounds_slack」などを定義する必要があります。

例: Gobo フィルタのプラグイン

この例は、Arnold Gobo フィルタ モディファイヤ プラグイン(<3dsmax>\Plugins\maxscript\arnoldlight_gobofilter.ms 内)の必要最低限のバージョンです。この例では、UI コントロールを追加して、カラー ピッカーとテクスチャマップ検索を両方ともサポートする方法を示します。ここに示した Arnold ターゲット パラメータは gobo.slidemap です。

plugin modifier Arnold_Light_Gobo
name:~ARNOLD_LIGHT_FILTER_GOBO_NAME~
category:"Arnold"

classID:#(0xf00df10d,0x4001a10d)

extends:ArnoldLightFilterModifier replaceUI:true version:1
(
  parameters main rollout:params
  (
    arnold_node type:#string default:"gobo"  
arnold_node_slidemap type:#color ui:slidemapcolor default:[255,255,255]
    arnold_link_slidemap type:#texturemap ui:slidemap
  )
  rollout params ~ARNOLD_LIGHT_FILTER_GOBO_ROLLOUT_NAME~
  (
      colorpicker slidemapcolor "Color" color:[255,255,255] modal:false
      mapButton slidemap "Map"
  )
)