myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

Maya | Toggle Smooth Level

今日もMayaで作業していました。

Mayaではよく分からんプレビュースムーズ機能があります。
[1][2][3]のキーでスムーズをかけることが出来ます。
[1]= ノースムーズのみ
[2]= スムーズレベル2+ノースムーズワイヤーフレーム同時に表示
[3]= スムーズレベル2のみ

XSIの[+] [-] と違って、サブディビジョンをかけていく感じではなく、スムーズをON OFFにする機能です。

このレベル「2」はデフォルトのレベルで、ShapeのSubdivision Levelsに上げたり下げたり、カスタマイズすることが出来ます。

不思議なことに、このプレビューサブディビジョンはMaya Software と Hardware Render には効きません。Mental Ray でないとスムーズ表示されないので、Maya Softwareとかでレンダーするなら、このサウディビジョンはプレビューでしかなりません。※ VRayなどで試したことがない。

因みに、普通のサブディビジョンよりこのプレビューサブディビジョンの方が重たいかもしれない。
よく分からないけど、プレビューサブディビジョンでレンダリングが止まっていて困っていた時に、普通のサブディビジョンでレンダリングしてみたら普通にいけました。

この[1][2][3]キーは場所的に凄く使いやすい位置にあるので、こんな機能には勿体無い。

なんでここに置くんだよ!しかもキーを3つも使ってるよ!
単純にサブディビジョンON・OFFしかしないんだから1ボタンにまとめれば良いのにね・・・。

オブジェクトを一個ずつを選んで「1」「3」を押したり、
たまに1個を選択し忘れたままにレンダリングしたりしてやり直すことになって ああ~もう面倒くさい!!

一発で全オブジェクトにサブディビジョンかければ良いのに・・・
いや、一個ずつやりたい時もあるし・・・多分ね。

じゃあ、両方?両方を切り替えることが出来るのかな~

Mayaにはカスタムパラメーターなんて便利なものないんだからスクリプトしかない。

MelやPyMelなどできないけど、調べながら何とかもうちょっと使いやすいのを作れるかと思い、このMelを書いてみました。

因みに、PyMelという言語までユーザーたちが作ってるんだな。なんでこんなユーザー任せ3Dソフトがそんなに人気あるのか良く分からないね。まぁ、Maya愚痴はまた今度にしましょう。

で、作ったMelの機能は:

オブジェクトが選択されている場合:
選択されたオブジェクト(transform.meshだけ)にスムーズをON・OFF (通常の「1」と「3」の切り替え)

何も選択されていない場合:
シーンの全オブジェクト(transform.meshだけ)を統一してスムーズをON・OFF

という単純なスクリプトでございます。

これを1キーにアサインすれば、ホットキー節約が出来、1,2,3をもっと役に立つ機能をアサインすることが出来ます。
melスクリプトなので、そのままボタンも作れます。でも、その方が面倒くさそうね・・・。まぁ、コードは以下に書いてあるので良かったら好きに使ってください。melのダウンロードリンクも付けておきました。

Mel download

global proc ToggleSmooth()
{
string $selection[] = `ls -sl`;
int $sizes = `size$selection`;
if ($sizes >= 1)
{
int $myvar;
string $MySel[] = `filterExpand -sm 12 $selection`;
if (`getAttr ($MySel[0] + ".displaySmoothMesh")` == 2)
{ $myvar = 1;}
else
{ $myvar = 0;}

for ($myNode in $MySel)
{
$smoothState = `getAttr ($myNode + ".displaySmoothMesh")`;
if ( $myvar== 1 )
{ $smoothState = 0;}
else
{ $smoothState = 2;}
setAttr ( $myNode + ".displaySmoothMesh") $smoothState;
SMPcheckDisplaySubdComps $myNode;
};
}
if ($sizes < 1)
{
string $mySel[] = `ls -type "mesh"`;
int $myvar;
if (`getAttr ($mySel[0] + ".displaySmoothMesh")` == 2)
{ $myvar = 1;}
else
{ $myvar = 0;}

for ($myNode in $mySel)
{
$smoothState = `getAttr ($myNode + ".displaySmoothMesh")`;
if ( $myvar== 1 )
{ $smoothState = 0;}
else
{ $smoothState = 2;}
setAttr ( $myNode + ".displaySmoothMesh") $smoothState;
SMPcheckDisplaySubdComps $myNode;
};
}
}
ToggleSmooth;