このドキュメントでは、特定のオブジェクト タイプを変換するときに、MAXtoA、つまり 3ds Max シーンを Arnold シーンに変換するトランスレータで使用される方法について説明します。この方法を使用すると、サードパーティの開発者またはユーザは平凡な方法で、シェーダ以外の Arnold ノードを便利なカスタム UI でラップし、すばらしい 3ds Max「ラッパ」を作成することができます。Arnold シェーダの UI をカスタマイズするには、別の、はるかに高度な Qt ベースの機能を使用できます。
3ds Max では、すべてのユーザが「スクリプト プラグイン」を記述できます。 スクリプト プラグインには、すべての機能をスクリプトで完全に処理する本格的なプラグインを使用できますが、既存のプラグインをラップする非常に軽量な「ラッパ」を使用することもできます。これらのスクリプト プラグインは、基盤となるいくつかの既存機能のユーザ インタフェースを変更するだけです。
この機能を MAXtoA 内で利用します。専用の名前の付いた特定のパラメータを公開するプラグインを記述すると、MAXtoA トランスレータはこれらのパラメータに反応し、パラメータ、パラメータの名前、および値にのみ基づいて変換タスクを実行します。プラグインが空白のダミーである場合、またはいくつかの既存の 3ds Max クラスをプラグインで「ラップ」した場合、MAXtoA はプラグインの「内部」を完全に無視します。
3ds Max 自体(または他のレンダラー)は内部(ラップされた)クラスを認識し、このクラスをビューポートに表示したり、モディファイヤ スタック内で機能させたりします。一方、MAXtoA や拡張機能を使用する Arnold レンダラーは、特殊なパラメータにのみ反応し、一部の特定の Arnold ノードをインスタンス化して、そのパラメータを適切に設定します。
MAXtoA 内のすべての機能をこの方法で拡張できるわけではありません。現在、次の 3 つの機能が対象となっています。
これらの機能を使用すると、ほとんどすべてのことが可能になり、Arnold のすべてのシェイプ ノード、カメラ ノード、またはライト フィルタ ノードが 3ds Max で機能するようになります。これは、指定したノードが Arnold に組み込まれているのか、それともサードパーティ プラグインの DLL から取得されているのかには関係しません。
全体的に非常にシンプルになっていて、スクリプト プラグインは特定の命名規則を使用してパラメータを公開するだけです。MAXtoA はこの命名規則に従って動作し、変換を適宜に実行します。
「特殊な」パラメータ名は以下のとおりです。
パラメータは上から下に向かって「使用」され、使用前に宣言することが明らかに必要になります。
この例では、新しいカメラ「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 "Nothing to see here"
(
)
)
次のスクリプト プラグインは、「Arnold」カテゴリ「Sphere」内に新しいジオメトリ タイプを作成します。これにより、ビルトインの 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_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]
これらの行には、「このキーが見つかったら、ノード「sphere」を構築し、タイプが浮動小数点の「radius」パラメータおよびタイプがポイントの「center」パラメータにこれらの変数の値を特に割り当てる」ように記述されています。
宣言(Arnold 5.0 ではほとんど不要)
独自に宣言されたユーザ変数が必要な場合は(たとえば、Arnold 4.2 ボリューム ノードで必要)、コードは次のようになります。
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
このコードを使用すると、ノード「volume」が以前と同様にインスタンス化され、min、max、および dso パラメータが設定されます。ただし、残りのパラメータは(Arnold 4.2 ボリュームのプラグインの性質上)ユーザによって定義されるため、文字列パラメータ「filename」、浮動小数点パラメータ「bounds_slack」などを定義する必要があります。
arnold_decl_ 機能は MAXtoA に維持されていますが、Arnold 5.0 ではほとんど必要ありません。
次のスクリプトは、Arnold ゴボ フィルタ モディファイヤ プラグイン(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"
)
)
スクリプト プラグインのパラメータ ブロック内のパラメータのタイプは、Arnold ノードのタイプと一致する必要があります。1 つのタイプが、MaxScript UI の作業を簡易化するための専用タイプです。Arnold タイプが「enum」の場合、このタイプは、通常はゼロから始まる整数値で表されます。ただし、3ds Max の「ドロップダウン」コントロールに 1 をベースとするインデックスが設定されていて、「enum」タイプ のパラメータの UI を「ドロップダウン」タイプのコントロールに直接接続することが最も自然な場合、ENUM パラメータは実際は 1 をベースとする形式の整数として返されます。したがって、数値 1 (0 でない)が最初の enum 値、数値 2 が 2 番目の enum 値などを表します。
サンプル スニペット:
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 です。
技術的に言えば、このドキュメントに記載されている動作は、実際はスクリプト プラグインに制限されません。3ds Max プラグインの中で、最初のパラメータ ブロックにこの命名規則に従うパラメータが含まれているものはすべて、このタイプの変換をトリガーします。そのため、仮定上は、C++ プラグインであっても、このメカニズムを使用して値を Arnold ノードに送信することができます。
ただし、3ds Max のプラグインは次の用途に限定されています。
したがって、ここで示すように、シンプルな「空白の」スクリプト プラグインを単に作成するのが最も有用であると言えます。ただし、プラグインがスクリプトで処理されるかどうかをテストするのはパラメータの命名規則だけであるため、実際はテストされません。文字列タイプのパラメータ「arnold_node」がある場合は、この機能がトリガーされます。