MayaScripts_RotateOrderSwitcher
例によってPymelスクリプトの記事でございます。
アニメーション制作中に必ず1回は遭遇するジンバルロック問題を解決するスクリプトの紹介です。
RotateOrderSwitcher
XYZの回転マニピュレーターの内の2軸が重なってしまう現象。ジンバルロック。
こうなるともうめんどくさい。キーフレーム間の補間アニメーションが乱れるし、カーブも崩れて編集しにくい・・・。
世の中にはアニメーションカーブ編集をせず、ジンバルロックも気にしないという恐ろしいアニメーターが居るという伝説も聞きますが、
やっぱり普通はカーブ編集もがっつりしたいもの。
そこで、私は以下のようなスクリプトを使ってジンバルロックの解決とします。
ダウンロード
このスクリプトは簡単に言うと、アニメーションを破壊せずに対象ノードのRotateOrderを変更するものです。
※ 処理後のノードのアニメーションはベイクされます。
使い方
ダウンロードしたファイルからRotateOrderSwitherフォルダを下記の場所に配置してください。
C:\Users\"ユーザー名"\Documents\maya\scripts
以下のコードで実行出来ます。
import RotateOrderSwitcher
RotateOrderSwitcher.main()
スクリプトを実行すると、以下のようなウィンドウが表示されます。
- Order
- 任意のRotateOrderを選択してください。
- 基本的には、この項目を任意の値に変更して、下記Switchボタンを押すだけでOKです。
- Switch
- ノードのアトリビュートを選択されたOrderに変更します。
- Close
- ウィンドウを閉じます。
以降はオプション機能になります。
- Auto Reverse
- With Extract で生成したコントローラに対してSwitchを実行した場合、アニメーションを元のノードにベイクして、コントローラを削除します。
- With Extract
- 外部コントローラ(ロケーター)を生成し、元のノードのRotateOrderとアニメーションは編集しません。
- Follow Position
- 元のノードに追従する形で、生成される外部コントローラにPointConstraintを接続します。
- With Extract にチェックを入れていないと、このオプションは利用できません。
適当なOrderの項目を選択して、Switchボタンを押してください。
アトリビュートの編集が許可されていれば、ノードのRotateOrderが変更されて上手く行けばジンバルロックが解消されます。
ベイク処理を行うので、尺の長いアニメーションに対して実行する際は覚悟しておいてください。
使用例として、冒頭の画像の状況にて、RotateOrderを「XYZからXZY」に変更した場合、下記のようになります。
更新履歴
- ver1.1
- Maya2022以降でも実行できるように改修。
- Auto Reverse、Follow Position 機能を追加。
- ver1.0
- 配布開始。
余談
アニメーションのベイク処理を挟むようなスクリプトを制作する際は、極力ベイク処理の回数が少なくなるように設計すべきだと思うのです。
対象のノードの数だけ何度もベイクするのではなく、ベイクしたいアトリビュートは一旦リストにまとめて、キリのいいところで一気にベイクする。
これを意識しないと信じられないくらいの時間、処理の完了を待つことになるのも・・・しばしばあります。
皆さんも制作の際は気を付けてください。
では、また。