2012/07/25

[mel] fspを調べたりしてみる

melな小ネタです。

fpsってフトした拍子に変わってたりしますが、
気づかずアニメーションとか付けてたりすると悲惨ですΣ( ゚∀)

というわけで、ヒューマンエラーをなくすべく機械にやっていただこう!となるわけです。
スクリプトの出番です。
しかしmayaさんはここでもヒトクセあって
30fpsとか数字で指定できたら楽なんですがゴニョゴニョ…!?
というのが本日の内容です↓



 まず、現在のfpsを問い合わせてみましょう。

currentUnit -q -t;

これで、fpsがユニットで返ってきます。
ユニットがなになのかは後述しますが、「30fps」とかのわかりやすい数字でないことは確かです。
つぎに↓こちら

currentTimeUnitToFPS;

これで、fpsを数字で答えてくれます
ちなみにwhatIsで訊いてみるとこうなります↓

whatIs currentTimeUnitToFPS;
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya20xx/scripts/startup/currentTimeUnitToFPS.mel // 


ここに出てきた.melファイルを見てるとmaya内の真実の一端を見ることができるのですが、
maya内でfpsと言えば、実際のfpsの数字と対をなす文字列が横行跋扈しており、
したがって「30fpsにしたいからどっかに30って入力する」といったお手軽さはないであろうことが察せられます。

currentTimeUnitToFPS.melの中を見ることでユニットの正体も分かります。
unitとは、辞書的には「単位」を示す単語ですが、 mayaでの「時間」の「単位」は
filmやntscといった「規格名」の形で用意されているようです。
filmが24フレ、ntscが30フレというのは納得感がありますが、
gameが15フレ…?ntscfが60フレ…?ってことはfはフィールドのf…?
などなんとなく馴染まないものもあります。

やはり出来れば、聴いたら数字で返してくれる+指定も数字で、
になると良いような気がします。

=====

続いて、fps指定する方法です。

currentUnit -t (unit);

この(unit)の部分に、fpsに対応する文字列を入れれば、fpsを指定できます。
どういったunitがどのフレームレートになっているのかは、さきほどのcurrentTimeUnitToFPS.melを調べれば分かります。

ユニット(文字列)での指定はできました。
次は数字で指定したいところですが、
どうやらmayaにはその方法が用意されていないようです。
「30と入力すれば30fpsになる」場所がないのです。

というわけで、つくりましょう。
さきほどのcurrentTimeUnitToFPS.melをベースにすれば、簡単に出来ます。
↓こんな感じになりました。

global proc string changeFPS(int $fps)
{
     string $unit;
     if( $fps == 15 ) {
          $unit = "game";
     } else if( $fps == 24 ) {
          $unit = "film";
     } else if( $fps == 25 ) {
          $unit = "pal";
     } else if( $fps == 30 ) {
          $unit = "ntsc";
     } else if( $fps == 48 ) {
          $unit = "show";
     } else if( $fps == 50 ) {
          $unit = "palf";
     } else if( $fps == 60 ) {
          $unit = "ntscf";
     } else if( $fps == 2 ) {
          $unit = "2fps";
     } else if( $fps == 3 ) {
          $unit = "3fps";
     } else if( $fps == 4 ) {
          $unit = "4fps";
     } else if( $fps == 5 ) {
          $unit = "5fps";
     } else if( $fps == 6 ) {
          $unit = "6fps";
     } else if( $fps == 8 ) {
          $unit = "8fps";
     } else if( $fps == 10 ) {
          $unit = "10fps";
     } else if( $fps == 12 ) {
          $unit = "12fps";
     } else if( $fps == 16 ) {
          $unit = "16fps";
     } else if( $fps == 20 ) {
          $unit = "20fps";
     } else if( $fps == 40 ) {
          $unit = "40fps";
     } else if( $fps == 75 ) {
          $unit = "75fps";
     } else if( $fps == 80 ) {
          $unit = "80fps";
     } else if( $fps == 100 ) {
          $unit = "100fps";
     } else if( $fps == 120 ) {
          $unit = "120fps";
     } else if( $fps == 125 ) {
          $unit = "125fps";
     } else if( $fps == 150 ) {
          $unit = "150fps";
     } else if( $fps == 200 ) {
          $unit = "200fps";
     } else if( $fps == 240 ) {
          $unit = "240fps";
     } else if( $fps == 250 ) {
          $unit = "250fps";
     } else if( $fps == 300 ) {
          $unit = "300fps";
     } else if( $fps == 375 ) {
          $unit = "375fps";
     } else if( $fps == 400 ) {
          $unit = "400fps";
     } else if( $fps == 500 ) {
          $unit = "500fps";
     } else if( $fps == 600 ) {
          $unit = "600fps";
     } else if( $fps == 750 ) {
          $unit = "750fps";
     } else if( $fps == 1200 ) {
          $unit = "1200fps";
     } else if( $fps == 1500 ) {
          $unit = "1500fps";
     } else if( $fps == 2000 ) {
          $unit = "2000fps";
     } else if( $fps == 3000 ) {
          $unit = "3000fps";
     } else if( $fps == 6000 ) {
          $unit = "6000fps";
     } else {
          $unit = "ntsc";
     }
     currentUnit -time $unit;
     optionVar -sv "workingUnitTimeDefault" $unit;
     print ("FrameRate : "+ $fps +"fps\n");
     return $unit;
}

fpsは、currentUnitで指定するだけでは今開いている(=カレントの)シーンだけでしか変わりません。
 このままうっかり次のシーンを作っていくと事故になるので、optionVar の方も変更して、新規シーンにも影響するようにしておきます。
実行するときは↓こんなかんじです

changeFPS(30);

このようにすると、30fpsになります。
 currentTimeUnitToFPS.melを参考にしているので、
数字からユニットへの変換の部分がけっこう肉弾戦になってます。
最後にいたっては、めんどうくさいので 「あてはまらない数字がきたら全部30fpsにしてやる!」という悪しき精神が垣間見えます。が、実用上はそんなに問題ないと思います。 …や、分かりません。もしかしたら堕落の始まりかもしれません。みなさまお気をつけ下さい。



■参考リンク

オンラインドキュメント currentUnitのページ

ちなみに↓こちらではcurrentTimeUnitToFPSのpython版についての記事が。
[Maya] FPSの取得 @たっきゅんのガ☆チンコ開発日記
http://takkun.nyamuuuu.net/blog2/archives/574


0 件のコメント:

コメントを投稿