同じオブジェクト内にモディファイヤおよびコントロールのインスタンスを作成する方法はありますか。

MAXScript に関する質問と回答 > シーン ノードの操作 > 同じオブジェクト内にモディファイヤおよびコントロールのインスタンスを作成する方法はありますか。

質問:

モディファイヤをコピーしてから、そのインスタンスを同じオブジェクトに貼り付ける関数はありますか。モディファイヤのコピーと貼り付けは行えますが、インスタンスの場合は行えません。

回答:

MAXScript を介して既存のモディファイヤを読み込み、同じモディファイヤに適用すると、自動的にインスタンスが作成されます。

例:

b = Box heightsegs:10 height:100--creates a high box
addModifier b (Bend())--adds a bend modifier to it
addModifier b (b.bend)--instances the same modifier on top

このように、MAXScript にすべての値を読み込みました。 これをもう一度使用すれば、このインスタンスが作成されます。

次のように使用した場合、

for i in selection do addModifier i (Bend())

コンストラクタ式 (Bend()) が n 回評価されるため、一意のモディファイヤをすべてのオブジェクトに追加しています。 ここで、n は選択したオブジェクトの数になります。

一方、次のように使用した場合、

theBend = Bend()
for i in selection do addModifier i theBend

この場合、単一のモディファイヤを作成し、それを変数に格納してから、選択内の各オブジェクトにモディファイヤのインスタンスを適用しています。

さらに、マップされた演算もインスタンス作成に適しています。次のように少ないコードで、上記と同じ結果を求めることができます。

addModifier selection (Bend())

このコンストラクタ式 (Bend()) は一度だけ評価され、続いて内部ループにおいて、コレクション内のすべてのオブジェクトにインスタンスとして適用されているため、選択したオブジェクトすべてに、同じベンド モディファイヤをインスタンスとして追加しています。

もちろん、オブジェクト間にもインスタンスを作成できます。

また、コントローラにも同じ方法を使用できます。たとえば、X_Position のコントローラのインスタンスを作成し、このインスタンスをベンド角に割り当てる場合、次のように記述します。

theBox = Box heightsegs:10 height:100
theBox.bend.angle.controller = theBox.position.x_position.controller

これで、X 軸に沿ってオブジェクトを移動させると、ベンド角がそれに合わせて変化します。

関連事項