Media & Entertainment Collection and Arnold キャンペーンMedia & Entertainment Collection and Arnold キャンペーン

チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第71回:Mayaでやってはいけないことをやってみよう!

2017.10.17

  • Maya
  • スクリプト・API
  • 中級者
9V電池の端子

ところで、9V電池の端子を舐めたことがありますか?
「Make:Electronics」という本に「9ボルト舌テスト」というのがあり、電気を体験するためにそういうテストが紹介されていました。
やってみると舌がピリピリして、9ボルトでこれなら100ボルトがいかにヤバイかと言うのが肌で分かります。

というわけで、Mayaでもやってはいけないことをあえてやってみることで「ほんとにだめなんだな」と体験してみましょう。

Mayaをクラッシュさせるコマンド

実は次のコマンドを実行すると、Mayaがクラッシュします。

global proc test(,int $test) {}
Mayaをクラッシュさせるコマンド

うっかり書かないようにしましょう;)
ログファイルがどこに出るかなど、テストするのに便利です。

エクスプレッションでMELを呼び出す

キューブを作ってアニメーションを付け、次のようなエクスプレッションを書きます。

float $tx = pCube1.translateX;
float $ty = pCube1.translateY;
float $tz = pCube1.translateZ;
string $temp[] = `polyCube`;
xform -ws -t $tx $ty $tz $temp[0];

シーンを再生すると、続々とキューブが作成されて大変なことになります・・・。

エクスプレッションでMELを呼び出す

Undoしてノードを削除出来ない、再生する度にまた増えるという恐ろしい状態になります。

エクスプレッションからコマンドを実行する場合は注意が必要です。値を照会するだけならパフォーマンスに影響がある程度で問題はそれほど無いですが、「階層を変える」「オブジェクトを作る」「アトリビュートを接続する」などシーンに影響を与えるコマンドを実行すると、シーンを壊してしまいます。

シーンを加工するコマンドは、エクスプレッションでは使わないようにして、スクリプトエディタなどから実行するようにするのが安全です。

アトリビュートのループ

アトリビュートの結果を他のノードに繋いで、その結果を元のアトリビュートにつなぐとループ状態になります。

この状態を作るには、オブジェクトを2つ作ります。
それぞれA、Bと呼ぶとして、A.translateXをB.translateXに接続します。
更にB.translateXをA.translateXにつなぎます。

アトリビュートのループ

片方が動くともう片方が動き、その結果が元のオブジェクトが動くというループ状態です。
普通は入力を受け付けられないで全く動かせなくなりますが、場合によってはどちらかが優先して動かせることもあります。

こういうループ状態が発生すると、Warningとして「アトリビュートがサイクルしてまっせ」と表示されます。
このメッセージを出したくないときは「cycleCheck –e off」と実行するのですが、単にメッセージを出さないようにするだけですので、サイクルしている問題は解決しません。手動で修正する必要があります。

Mayaはアトリビュートのサイクルを検出すると、適当なところで処理を中断するようになっていますので、無限ループで延々と計算し続けることはありません。
ただし、どのタイミングで止めるかは明言していませんので、シーンを開く度に結果が異なる可能性があります。

双方向のコネクションが必要なときは、Maya2016 Ext2以降ではaddAttrに–proxyというフラグが追加されていますので、そちらを使います。
例えば次のスクリプト(Pythonの例)を実行すると、switchというアトリビュートが追加され、双方向接続になります。
どちらのswitchを変えても、もう一つのswitchアトリビュートが変わります。

from maya import cmds
ctrl_a = cmds.createNode("transform", n="ctrlA")
ctrl_b = cmds.createNode("transform", n="ctrlB")

cmds.addAttr(ctrl_a, ln="switch")
cmds.addAttr(ctrl_b, ln="switch", proxy="%s.switch" % ctrl_a)
アトリビュートのループ

リグで複雑な制御をするときに便利です。ただしMaya2016 Ext2以前のMayaとの互換性がなくなります。

アトリビュート値にNaN(Not A Number)

例えば次のようなにキューブを作って、ちょっと横に移動してからmaファイルで保存します。

アトリビュート値にNaN(Not A Number)

maファイルを開いて、setAttrでtranslateを設定している所に、-1.#INFなどの文字を設定します。

アトリビュート値にNaN(Not A Number)

それからmaファイルを開くと、アトリビュート値が-infinityとなったり、ものすごく大きな数字になったりします。

アトリビュート値にNaN(Not A Number)

まれにこういう表示を見たことがある方もいると思います。
普通は出てこないのですが、シミュレーションの結果がおかしくなるとか、Softimageのファイルを読み込むとか、FBX経由でデータを持ってくるとかしたときに、この表示になることがあります。

要は異常な情報が入っており、数値として正常でないということです。

他にも「1.#INF」「-1.#INF」「1.#QNAN」「1.#IND」という表記の場合もあります。直すには新しい値を設定してあげます。
もしMayaのGUI上で設定しても上手く更新されないなら、maファイルとして保存し、テキストを直接0などの数値に書き変えます。

独自のメインウインドウを作る

次のスクリプトを実行します。

window -mainWindow;
showWindow;


すると次のようなwindow1というウインドウが立ち上がります。

独自のメインウインドウを作る

これ、Mayaと同じメインウインドウ扱いになります。
Mayaを選択すればウインドウがMayaの後ろに行きますし、window1を閉じようとするとMaya自体を閉じるときと同じように「シーンを保存しますか?」というダイアログが表示されます。

古いMayaでは、window1を閉じてMayaを終了すると、GUIのレイアウト情報がぐちゃぐちゃになるため、次回起動時にエライことになったのですが、Maya2018では大丈夫なようです。
いずれにせよ、windowコマンドではうっかり-mainWindowフラグを使わないようにしましょう。

既存のアトリビュートと同じ名前のアトリビュートを追加する

同一ノードで、同じ名前のアトリビュートは追加できませんが、addAttrには-niceNameというフラグがあり、表示用の名前を設定できます。
時々便利なのですが、これを使うとGUIでの見た目のアトリビュート名と本当のアトリビュート名が異なる状態になるため、混乱しやすくなります。

例えば、次の場合ではアトリビュートaとbが、ともに「watashigaHonmono」という表示名になっているため、どちらがホンモノかさっぱりわからない状態になっています…。

既存のアトリビュートと同じ名前のアトリビュートを追加する

よりたちが悪いパターンとして、既存のアトリビュート名と同じ名前を表示名にするという方法があります。
次の例では、悪意に満ちたTAがアトリビュートaの名前をTranslateXにしていますので、いくらTranslateXに値を入れても位置が変わりません…。

既存のアトリビュートと同じ名前のアトリビュートを追加する

実際のアトリビュート名を確認するのに簡単な方法は、値を入力してスクリプトエディタの履歴を見る方法です。スクリプトエディタには実際のアトリビュート名が出力されます。
不審なアトリビュートを見かけたら、すぐに最寄りのスクリプトエディタで確認しましょう!

まとめ

ということで、Mayaで危ないあれこれを実際に試した結果をご紹介しました。
Mayaはプロフェッショナル向けのツールですので、あれやらこれやら出来ないように制限するのではなく、ユーザの判断で自由に扱えるようになっています。
場合によっては危険なことも出来てしまいますので、色々いじくってみて動作を確認してもらうとおもしろいことが起きるかもしれません:)

著者

築島 智之

築島 智之

オートデスク株式会社
オートデスクコンサルティング
ソフトウェアエンジニア