こんな感じで子に複数のメッシュを持つグループを1つのメッシュに結合するシーンについて考えてみます。
ちなみにpCube3はベベルをかけ、ヒストリが残っている状態です。
スクリプトで実行
コマンドは別に全然大したことなく、これだけです。
res = cmds.polyUnite(*cmds.ls(sl=True), ch=0, op=True, muv=1) print(res) # Result: [u'polySurface1']
(このコードではpolyUniteの第一引数は選択ノードにしてるので、使用する際はよしなに書き換えてください)
各引数の意味は以下を参照。
polyUnite command
chという引数はリファレンスに書いてないんですが、ヒストリを残すかどうかです。
Rootを選択して実行してみると、今回はchを無効化してるのでヒストリは失われ、さらに結合前に存在した結合対象のグループは消えてシーンの状態はこのようになります。
有効化した場合はMayaのメニューから実行した場合と同じで、このようにグループだけが残ります。
期待した挙動をしないケース
さて、これが通常の挙動になりますが、chを無効化してもグループが残ってしまうケースがあります。
ためしにベベルがかかっているpCube3をDuplicateして、Rootを選択して同じコードを実行してみましょう。
ファッ。
pCube4のtransformが取り残され、それに引きずられて上の階層も残ってしまっています。
問題なく消えてるpCube3とは何が違うのか、NodeEditorを確認してみます。
まずはpCube3。うむ。
次にpCube4。どこにも接続されていないpolySurfaceShape1がいる…。
ヒストリが残った状態でDuplicateすると孤立したMeshが発生してしまうケースがあるようですね。
というわけでこいつを消してやると先程と同じ結果が得られました。
問題があるケースを事前に検出してから結合する
孤立したMeshが存在する場合は結合を中断して、対象のMesh削除やシーンの最適化などの対処をしてから再度実行するようにしたいところです。
なのでこのようにしてやります。
5行目で選択ノードからメッシュを取得、listConnectionsを用いて取得したものに接続がなければ不正なものとして抽出しています。
不正なものがなければめでたく処理が進行して先に説明したpolyUniteを実行している感じです。
これで結合後に不要なグループが残っちゃってるみたいなケースを回避できます。やったぜ。