myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

Maya | mCombine 1.2

スクリプト更新

前回はオブジェクトの親にペアレントされていましたが、Mayaユーザーに突っ込まれました。
ポリゴンオブジェクトを他のポリゴンオブジェクトの子に普通しないですと。

そういえば、あまり見ないですね。俺のデータ以外w

今回修正しているデータにグループは結構使われているので、グループの子として再ペアレント化するようにしました。


更新内容:
------------------------------
コンバインされたオブジェクトはターゲット(最後に選択されたオブジェクト)のグループの子として再ペアレントかされます。

DOWNLOAD


追記 8月20日

動画

Maya | mCombine 1.2 from myara on Vimeo.

Topic:CG Design - Genre:Computer/Internet

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

Maya | mCombine

ちょっとだけですけど、久しぶりにMayaを使うことになりました。しばらくMayaでモデリングやUV展開などの作業になります。

SIの自作プラグイン「mCombine」に慣れていたから、デフォルトのCombineはとても不便に感じてしまいました。
(SIのデフォルトマージはもっと面倒くさいけど)

ということで、久しぶりにmelを書いてみました。

俺のmelスキルは結構初心者レベルだから、SIの「mCombine」と同じ機能にするのはちょっと無理です。ていうか mCombine も更新したかったなそういえば。またいつか。

ということで、地味だけど、ちょっと便利なスクリプトが出来ました。

mCombine 1.0 (Maya Mel)
DOWNLOAD

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




追記 ( 2012/08/03 )

mCombine の SI 版 みたいに子供オブジェクトは移動してくれません。そして、MayaはSIと違って、子供付きのオブジェクトをコンバインすると、その子もコンバインされてしまいます。
時間があったら、次の更新にこの部分を修正する予定です。


以上です。

Topic:CG Design - Genre:Computer/Internet

Maya | Pivot移動 mel

先週に仕事を早く終らせて、ちょっと暇だった時に背景担当の人に、「myaraさん、melが出来ますか?」と聞かれまして、「出来るとは言えないけど、一応簡単なmelは書いたことがあるから、単純な問題だったら分かるかも」と答えて一応相談に乗りました。

ピボットの位置を底辺に移動したいけど一々移動するのは面倒だからそれをmelでやりたい。でもログからコピペー程度のスクリプトしか書いたことがないからやり方が分からないと。

俺も分かんないけど、移動コマンドとバウンディングボックス情報の取得方法さえ分かればなんとか行けそうな気がする。Melの文法はJScriptと似ているし。

既にありそうなスクリプトだけど、mel練習的に作ってみることに、Challenge Accepted !
(分かる人には分かる。How I Met Your Motherっていうドラマを見てる人は多分居ないけど、まぁいいや)

ということで、マニュアルとグーグルで調べたら、バウンディングボックスの取得が分かりました:

float $bBox[] = `exactWorldBoundingBox $obj`;


これで $bBox というアレイが出来ます。

bBox[0],bBox[1]bBox[3]は XYZ の最小数値
そして、
bBox[4],bBox[5]bBox[6] は XYZ の最大数値

ピボット移動はログからヒントを貰って

move $x $y $z ($obj + ".scalePivot") ($obj +".rotatePivot") ;


で移動します。

$x $y $z はただの変数です。XYZの新しい位置をこっちで指定します。

$obj は選択されているオブジェクトの変数。
どうやらMayaでは scalePivot と rotatPivot があります。しかしMayaのGUIコマンドを使うと両方を同時に移動されるので、それでいきます。
melで別々でも移動が出来ますが、変なことになりそうだな。

よし、バウンディングボックスと移動方法が分かりました。
これさえあれば、あとはこっちのもんですね。

全オブジェクトを同時にも対応する為にfor in ループを入れて、

あとは AlignCVというmelのGUIをパクって、

完成!

DOWNLOAD

mAlignPivotMaya.gif


これはSIにも欲しいかもな。もうあるのかな?

それじゃ、また。



追記
2012/8/7
mAlign Pivot 1.1 更新
http://myara.blog.fc2.com/blog-entry-154.html

Maya : Locator -> Group

こないだ、Mayaで提出する仕事をやっていましたけど、Softimageの方が得意のでSoftimageからMayaにデータを持っていったり持ってきたりしながら作業していました。

面倒くさいけど、Mayaでモデリングするよりマシです。
まだ完璧じゃないけど、Crosswalkは結構良いツールになってきたから、大体データは持っていけます。
Rigはちょっと難しいけど。

ところで、MayaのグループをXSIに持っていくと、Nullになってしまいす。

MayaのグループはXSIのModelのようなものですね。
でもXSIのModelをMayaに持っていくと、 Locator (XSIのNullと同じ)になってしまいます。

XSIでは「Transform Group」という機能があって、単純にNullを親にする機能です。
これもMayaに持っていくと、もちろんNull(MayaでいうLocator)になります。

無論、NullになってしまったグループをMayaに戻してもLocatorになります。

XSIのGroupは全然違う物で、Mayaに持っていくとGroupが無視されて消えてしまいます。

今までは別に気にしていなかったけど、今回はクライアントにグループを使ってくださいと突っ込まれてしまった。
理由は分からんけど、そういう指示なので仕方ない。
これから毎回グループにして、名前を直すのはちょっと面倒なので、このLocatorをGroupにしてくれるmelを作ってみました:

使い方:子持ちのLocatorを選んで、実行。
注意:Locatorであることを確認なんかしません。

Mel

global proc mLocator2Group()
{
string $selected[] = `ls -sl`;
string $current = "";
string $object = "";

if ($selected[0] != "")
{
for ($current in $selected)
{
// Test current selection for transform objects
string $children[] = `listRelatives -c -pa -typ transform $current`;

if ($children[0] != "")
{
$parent = `listRelatives -p $current`;
if (`size$parent` > 0)
{
string $grp = `group -n ($current + "_temp") -p $parent $children`;
delete ($current);
rename $grp ($current);
}
else
{
rename $current ($current +"_temp");
group -n $current -world $children;
delete ($current + "_temp");
}
}
else
{
error "No objects under this selection";
}
}
}

else

{
error "Nothing selected.";

};
}
mLocator2Group;

メモ:

XSI と 違って、Mayaでは Scene Root がないから、Rootにあるオブジェクトの親を取得しようとすると、何も出ません。なので、sizeを使って、その親が空(0)でしたら world にします。worldというオプションはXSIのRootと似たような意味です。因みにsizeはjscriptのCountと似たようなものです。
Previous page Next page