Mayaのスクリプトに作業単位で変更しない値がある

クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチームの好きな武将は豊臣秀吉、戦国大好き人間の中林です。

作業単位で起きた問題

弊社では多くのクライアントからデータの発注を受けるため、同じMayaでも様々な環境設定の差があります。
今回はそんな中で作業単位(Working Units)のリニア(Linear)の違いで発生した問題を紹介します。

そもそもの事の起こりは僕がアーティストから選択メッシュモデルのミラーモデルを自動で作成ツールを頼まれて作ったところからです。
原点から少し離れた場所にあるメッシュモデルをミラー反転させたミラーモデルが自分のMayaでは想定した場所に作られるのだけど、アーティストのMayaでは遥か遠くにミラーモデルが作られてました。

原因と問題部分

結論からいうと、原因はクライアント仕様の関係でアーティストのリニアはメートル、僕のリニアは初期状態のセンチメートルでした。
なぜ問題が起きたというと、メッシュモデルのミラー反転に関しては「移動マニピュレータ」の座標を基準に反転をしてたので、

manipMoveContext -q -p Move

このコマンドで座標を入手してましたが、リニアの設定に関係なく常にセンチメートルの値が返ってきます!!
仮にリニアをメートルに設定した場合に3mの位置にあるメッシュモデルを4mの位置にある「移動マニピュレータ」を基準に反転すると、内部的に400と戻ってくるので400m先を基準に反転して結果的に797mの位置にミラーモデルが作成されます。

距離をコンバートして解決

原因さえ分かれば、リニアの数値自体は以下の命令で変更できます。(使う機会もありませんが)計算が面倒なヤードへの変更もしてくれます。

string $cu = `currentUnit -q -l`;
float $変換float値 = convertUnit -fromUnit "cm" -toUnit $cu "string cmの距離" 

ただ、convertUnitの距離がstringではないとエラーになるので、floatからstringに変更する必要があります。

作業単位で問題は滅多に起きない

オブジェクトの座標などをgetAttrで取得する分かりますがこちらはリニアを変更すれば値の桁数が合わせて変更されます。基本的な値は自動的に変更されているので滅多に起きません。
ただ、矛盾してるかもしれませんが、滅多に起きないことがTA作業ではよく起きます。
作業単位を変えて処理がズレる場合は取得する値が変化しているか確認をした方が良いかもしれません。

Author: 中林 伸和