ヒストリの使い方 → ヒストリはノードである → 基本オブジェクトのノード構成 → ノードの編集。ヒストリの回から数えれば実に6回にわたりノードに関して見てきました。普段はそれほど意識してみることのない内部構造を通して、Mayaってこういう風に動いているんだ、と感じてもらえましたでしょうか。
まあ、さすがにこれだけ長くかしこまった内容が続くと眠たくなってくると思いますので、これまで見てきた中でフォローできてない、ノードに関する断片的な情報を紹介して締めたいと思います。
よくわからない場合は「そういうものか~」という感じで眺めておいてもらえると幸いです。
コンポーネントリストとは?
例えばフェースを選択してEdit Mesh > Extrudeするのと、オブジェクトを丸ごと選択してExtrudeするのとでは、結果の見た目は変わりません。
基本的にどちらで実行しても同じノードが出来ます。polyExtrudeFaceノードがヒストリとして作られます。
Extrudeを実行した時の選択情報はpolyExtrudeFaceノードのinputComponentsというアトリビュートに記録されます。フェースが選択されていればフェースが、オブジェクトが選択してあればオブジェクト全体を選択情報としてセットします。
このinputComponentsはcomponentListというタイプのアトリビュートです。通常隠してあるので普通には見ることも後から編集することもできません。しかしスクリプトでアクセスして編集することができます。
選択情報はコンポーネントの番号で指定されます。なので後からコンポーネント数が変わる変更を加えると、ヒストリがうまく機能しなくなる可能性があります。
まあ逆に言えば、ヒストリを操作すると形状が壊れることがあると思いますが、これが原因です。
さてさて、それでは実際にコンポーネントリストをいじって見ましょう。
1)Create > Polygon Primitives > Cubeでキューブを作ります。
2)キューブの上面フェースを選択し、Edit Mesh > Extrudeで押し出します。
3)次のMELスクリプトをスクリプトエディタで実行して、登録されている選択情報を確認してみましょう。
getAttr polyExtrudeFace1.inputComponents;
“polyExtrudeFace1”はpolyExtrudeFaceノード名です。もし名前が違うようなら書き換えてください。
実行すると“f[1]”という結果が返ってくると思います。
つまりフェースの1番を押し出してます、ということです。俗にID1のフェースと呼んだりします。
(コンポーネントの番号は0始まりなので0, 1, 2, 3...となります。なのでID1なら2番目のフェースです。)
MELでコンポーネントリストを変更してみましょう。
以下を実行してみてください。
setAttr polyExtrudeFace1.inputComponents -type componentList 1 "f[0:2]";
するとこうなります。
押し出される場所が変わりました。
それではMELの意味を確認していきましょう。
setAttr はアトリビュートをセットする時に使うMELです。この後に続く文字はすべてこのコマンドのオプションになります。
polyExtrudeFace1.inputComponents はセットするアトリビュートを「ノード名.アトリビュート名」で指定しています。
-type componentList はアトリビュートのタイプを指定しています。ここではcomponentListタイプを指定します。
1 “f[0:2]” の1はセットするコンポーネントリストの数で、数字の分この後にコンポーネントリストを指定できます。
“f[0:2]”はフェースの0~2番という意味になります。コンポーネントIDは書き方にルールがあり、”
~”の代わりにコロン”:”を使います。例えばエッジの10番から15番ならe[10:15]となります。
では続けてほかの設定でも試してみましょう。以下を実行してみてください。
setAttr polyExtrudeFace1.inputComponents -type componentList 2 "f[0]" "f[2]";
するとこうなります。
フェースの0番と2番が押し出されるようになりました。
最後に以下を実行してみましょう。
setAttr polyExtrudeFace1.inputComponents -type componentList 1 "f[*]";
結果はこうなります。
*は全てという意味になります。すべてのフェースが押し出されます。
こうしてあればpolyExtrudeFaceより前のヒストリでポリゴン数が増減しても、すべてのフェースが押し出されるようになります。そう、これが重要なのです。
例えば次の例を見てください。
キューブを作ってMesh > Smoothを実行する際、すべてのフェースを選択して実行するとコンポーネントリストはf[0:5]になります。
後からpolyCubeのヒストリを変更すると、フェース数が増えてしまいます。しかしコンポーネントリストは5番目のフェースまでしか処理しないように設定されているので、スムースがオブジェクト全体に効かずに、下図の様に結果が変になります。
ここではSubdivisions Heightを1から2へ増やしたため、縦方向にポリゴンが増え、結果として側面の一部がスムースされなくなります。
代わりにオブジェクトを選択してスムースすればコンポーネントリストはf[*]となります。
なので、あとからキューブの分割数を変更してもオブジェクト全体がスムースされます。
場合によってはオブジェクトを選択して実行するのと、フェースをすべて選択して実行するのとでは結果が異なることに注意してください。なるべくオブジェクトを選択して実行した方がヒストリが壊れにくくてよいと思います。