myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

Maya | mCombine 1.1

前回書いたmCombineの更新です。

Mayaでは子持ちのオブジェクトを選択して、コンバインすると子オブジェクトもマージされてしまいます。

Mayaユーザーはこれに慣れているでしょうか。便利だと思っているのでしょうか。
分かりません。

慣れてない俺には、ちょっと嫌だったのでスクリプトでなんとかやってみました。


mCombine 1.1

DOWNLOAD

選択されたオブジェクトはヒストリ残さずにコンバインされます。子オブジェクトはコンバインされません。
統合されたオブジェクトは、最後に選択されたオブジェクトの名前、ピボットの位置と、親子関係を取得します。
最後に子オブジェクトはコンバインされたオブジェクトの子にします。

今度は分かりやすい動画を用意しました:

Maya mCombine 1.1 from myara on Vimeo.



今回のmelの解説です。
melに慣れていないので、もっとスマートな方法があるかもしれませんが、一応:


// 選択取得
string $sel[] = `ls -sl`;
// 選択の数
int $size = `size $sel`;
// 最後に選択されたオブジェクト(数は0から始まるので、最後のオブジェクトは数-1です)
string $lastobj = $sel[$size-1];
// 最後のオブジェクトの親を取得
string $parents[] = `listRelatives -p $lastobj`;
// 最後のオブジェクトのピボット位置の取得
float $pos[] = `xform -q -ws -rp $lastobj`;

// 選択の数は2以上じゃないと何もしない。
// 最低2個がないとコンバインが出来ないですね。
if ($size > 1){
// 選択をループして
for ( $obj in $sel ){
// Mayaは子も含めて全部コンバインしてしまうので、一時的に子の親を変えて、
// 全部新しいグループにまとめます
string $children[] = `listRelatives -c -path -type "transform" $obj`;
if (size($children) > 0) {
if (objExists("childrenTemp")==0){
group -w -n childrenTemp $children;
}
else{
parent -a $children "childrenTemp";
}
}
}
// 選択されたオブジェクトをコンバイン
polyUnite -constructionHistory 0 $sel;

// 最後のオブジェクトの名前にリネーム
rename $lastobj;

// mel はオブジェクト指向言語ではないため、「$lastobj」はただのストリングです。
// これから 「$lastobj」 は最後に選択されたオブジェクトではなく、
// コンバインされたオブジェクトになります。

// 子オブジェクトがあった場合、コンバインされたオブジェクトの下に入れます。
if (objExists("childrenTemp")==1){
string $groupChildren[] = `listRelatives -c -path -type "transform" "childrenTemp"`;
if (size($groupChildren) > 0){
parent -a $groupChildren $lastobj;
}
delete "childrenTemp";
}

// ピボットを移動する。
move $pos[0] $pos[1] $pos[2] ($lastobj + ".scalePivot") ($lastobj + ".rotatePivot");

// 最後のオブジェクトの親の下に移動。
if (`size$parents[0]` > 0){
parent $lastobj $parents[0];
}
}

Topic:CG Design - Genre:Computer/Internet