[maya] animationExportコマンドの罠 [pymel]

久々にMayaPymelネタ。

Mayaのコマンド Mel MayaCmds Pymel それぞれにAnimationExportコマンドは存在するのですが、こいつにはとんでもない罠があります。
Pymelコマンドの場合 exportSelectedAnim() というコマンド名です。
この関数名からしたら、どう考えても

『選択しているノードのキーフレームアニメーションを、ExportSelectionする』

もんだと。
ExportしたものをImportすればアニメーションが再読み込みできると思うでしょう。
私もそう思いましたよ。
しかし、それは大きな勘違い。
これは、アニメーションをExportするのではなく、
アニメーションノードをExportするコマンドなんです。
え、何が違うんよ?と思うでしょうが、違うんです!!

 

Mayaというソフトは、すべて ノードとコネクション によって構成されています。

 

アニメーションのKeyを作成すると(コンポーネントエディタのAttributeが赤くなっている状態)、
AnimCurveノードが作成され、Keyを打ったアトリビュートに接続されます。

 

AnimCurveノードには、
いわゆるアニメーションカーブの情報(KeyValue、Tangent)が保存されています。

つまり、アニメーションカーブとは、
AnimCurveノードが、Attributeに接続されてはじめて効果があります。
普通に使っていると、あまり意識しないことなのですが、
SetKeyするということは、

AnimCurveノードを作成し、
アトリビュートとノードを接続し(まだKeyが打たれていないときのみ)
AnimCurveノードに値をsetAttr

しているわけです。

で、ここからが本番。

Pymelの exportSelectedAnim() コマンドは、
最初にも述べたとおり『アニメーションノード(AnimCurve)』をExportします。
connectAttrもされます。

なのに、AnimCurveノードとAttributeのconnectAttrがされません

追記・修正
当初、connectAttr が記述されず、CreateNodeだけする かと勘違いしてました。
connectAttrは書いてあるけど、実行されないんでした(´Д`)
挙動からして、バグっぽいです。

これじゃあ、あんまりすぎるので、ConnectAttrまでやるようにコマンドを拡張してみました。

一応GistにもUPしてみた。 ここ

選択しているノードから、
AnimCurveノードを取得して、
listConnectionで取得してきた ノード.アトリビュート から、
connectAttrコマンドを作成した後、
保存したmaファイルの一番後ろに追加しています。

引数で、ネームスペースをReplaceString出来るようにしてあります。

Mayaには、別途 importAnim exportAnim が存在していますが、
こちらはcopyKey pasteKeyの階層対応版のため、ノード名が違っていても
階層が同じであれば、アニメーションを出し入れできます。

しかし、このコマンドの場合 ノード名は固定なので、
でネームスペースが変わってしまったりするとImportErrorになるので注意が必要です。

┓(;´_`)┏ < やれやれ

おまけ。

AnimCurveには種類が大きく分けると2つあります。
1つが、 animCurveTL TA TU TT のように T○ という名前のもの。
これは、AnimCurveの入力が時間軸のノードになります。
普通にKeyを打っている場合は、T○ノードになります。(TはTimeのT)
もう1つが、 animCurveUL UA UU UT のように、U○になっているもの。
これは、DrivenKeyのように入力が数字(Double)のノードになります。
後ろの○の部分は、OutputTypeを意味していて、
 Distance  Angle  Time U Double
を表しています。
同じAnimCurveでも、それぞれ微妙に異なるので Animに対してなにかスクリプトで処理する場合は
注意が必要です。

追記

Blogを最初公開したときは、connectAttr されないのは仕様で、AnimCurveノードを出力するだけのコマンドだと勘違いしてました。
あとでテストしたときにできた出力maをみて ちゃんとconnectAttrが書かれていて
ちょwwwちゃんとconnectされるのかwww記事公開しておいて恥ずかしいwwwうぇwwwとか
ちょっと冷や汗かきました。あぁ恥ずかしい。

仕事してるときにこの問題に当たったときに connectAttrまで書いてあるからできんじゃん☆ミありがとうPymel!!

connectきいてNEEEEE

仕方ないから、自前で拡張
したのを思い出しました。

maファイル内での connectAttr 時は、何故かは知りませんが Connectされる側のノード名の頭に : がないと正しく動作しない模様です。
例) connectAttr “anim.output” “:charNode.translateX”;

コメントを残す

メールアドレスが公開されることはありません。


*