« 選択中のキーフレームを現在フレームにポン。 | トップページ | 嘔吐 Actions。 »

2012年5月 1日 (火)

なんで 1+18 とか好きなんですか。

今日、カットの尺に関わる色んなことをやってて、
ふと思いついてババっと書いてみました。
書きたてほやほや。



なかなか便利だと思うんですがどうですか。
アニメな仕事をしてると特に。


アニメの世界って、 1 + 18 とか、そういう書き方するじゃないですか。
アニメじゃなくてもそうだっけ?



で、 1 + 18 って、いったい何フレームになるんだ? とか、一瞬で出てこないこともあるじゃないですか。


あるいは、「42枚」 っていうトータルフレーム数が先に分かってて、何らかの都合で 秒 + フレーム のフォーマットでテキストを書かなければいけないとか、そういう時。 一瞬で 42枚が 1 + 18 に脳内変換できればいいんですが、まあ 1 + 18 は仮になんとかなったとしてもですよ、例えば 「181枚」 とか言われたら俺はお手上げです。




そういう時に使うスクリプトです。

 小数点付き総秒数

 総フレーム数

 秒 + フレーム数

の3つの書き方の変換を自動でやってくれるという、そういうスクリプトです。




JScript
------------------------------------------------------------------

//    なんで 1+18 とか好きなんですか。

var oP = XSIFactory.CreateObject( "CustomProperty" );
oP.name = "なんで 1+18 とか好きなんですか。";
oP.AddParameter2( "dFrameRate", siDouble, 24 );
oP.AddParameter2( "iIntSeconds", siInt4, 1 );
oP.AddParameter2( "iDecFrames", siInt4, 12 );
oP.AddParameter2( "dTotalSeconds", siDouble, 1.500 );
oP.AddParameter2( "iTotalFrames", siInt4, 36 );

var oItem, oL;
oL = oP.PPGLayout;

oL.AddRow();
    oL.AddGroup( "", false, 50);
        oL.AddSpacer( 0, 50 );
        oL.AddStaticText( "                (・∀・)?" );
    oL.EndGroup();

    oL.AddGroup( "", true, 50);
        oItem = oL.AddItem( "dFrameRate", "Frame Rate" );
        UIUI( oItem, 40 );

        oL.AddGroup( "Duration Total" );
            oItem = oL.AddItem( "dTotalSeconds", "in Seconds" );
            UIUI( oItem, 60 );
            oItem.SetAttribute( siUIDecimals, 4 );
            oItem = oL.AddItem( "iTotalFrames", "in Frames" );
            UIUI( oItem, 60 );
            oItem.SetAttribute( siUIDecimals, 4 );
        oL.EndGroup();
        oL.AddGroup( "", false, 25);
        oL.EndGroup();

        oL.AddGroup( "Seconds + Frames" );
            oL.AddRow();
                oItem = oL.AddItem( "iIntSeconds", "Seconds + Frames" );
                UIUI( oItem, 35 );
                oItem.SetAttribute( siUINoLabel, true );

                oL.AddStaticText( "+" );

                oItem = oL.AddItem( "iDecFrames", "bb" );
                UIUI( oItem, 35 );
                oItem.SetAttribute( siUINoLabel, true );
            oL.EndRow();
        oL.EndGroup();
    oL.EndGroup();
oL.EndRow();

//    ####################################################
InspectObj( oP, null, null, siLock );

//    ####################################################
function UIUI( oItem, X )
{
    oItem.SetAttribute( siUINoSlider, true );
    oItem.SetAttribute( siUICX, X );
}

//    ####################################################

oL.Language = "JScript";
oL.Logic =    OnInit.toString()+
            dFrameRate_OnChanged.toString()+
            DurationTotalToSecFrame.toString()+
            SecFrameToDurationTotal.toString()+
            iIntSeconds_OnChanged.toString()+
            iDecFrames_OnChanged.toString()+
            iTotalFrames_OnChanged.toString()+
            dTotalSeconds_OnChanged.toString();

function OnInit()
{
    dFrameRate_OnChanged();
}
function dFrameRate_OnChanged()
{
    SecFrameToDurationTotal();
}
function dTotalSeconds_OnChanged()
{
    fps = PPG.dFrameRate.value;
    Seconds = PPG.dTotalSeconds.value;
    Frames = Seconds * PPG.dFrameRate.value;   
    PPG.iTotalFrames.value = Frames;
    DurationTotalToSecFrame( Frames, fps );
}
function iTotalFrames_OnChanged()
{
    fps = PPG.dFrameRate.value;
    Seconds = PPG.iTotalFrames / PPG.dFrameRate.value;
    Frames = Seconds * PPG.dFrameRate.value;   
    PPG.dTotalSeconds.value = Seconds;
    DurationTotalToSecFrame( Frames, fps );
}
function iIntSeconds_OnChanged()
{
    SecFrameToDurationTotal();
}
function iDecFrames_OnChanged()
{
    SecFrameToDurationTotal();
}

function DurationTotalToSecFrame( Frames, fps )
{
    Seconds = Frames / fps;
    IntSeconds    = Math.floor( Seconds );
    DecSeconds    = Seconds - IntSeconds;
    DecFrames     = Math.round( DecSeconds * fps );
    PPG.iIntSeconds.value = IntSeconds;
    PPG.iDecFrames.value = DecFrames;
}
function SecFrameToDurationTotal(  )
{
    fps = PPG.dFrameRate.value;
    IntFrames = PPG.iIntSeconds.value * fps;
    TotalFrame = IntFrames + PPG.iDecFrames.value;
    PPG.iTotalFrames.value = TotalFrame;
    PPG.dTotalSeconds.value = TotalFrame / fps;
}


------------------------------------------------------------------


Nande


どっかの値を書き換えると連動してそれ以外の値もアップデートされます。 そんだけです。


ちなみにフレームレートを変更したときは、PPG の右下 「 秒 + フレーム 」の情報を基準に、それ以外の値をアップデートします。





今まで、こういうツール、ありましたかね?
俺は見つけたことなくて。
アニメ屋さんにありそうですよね。




書きたて過ぎて、いかにも不具合ありそうです。 特に、29.97fps とか、小数点付きフレームレートにした時にどうなるかあんまり考えてません。

スクリプティング的に特筆すべきことは、すいません、何もないかな。。。。












ところでアニメのコンテを見ているとよく思うんですが、1 + 18 とか 2 + 18 とか、18枚が好きな演出家さんが多い気がしませんか? 18 コマってのはよく見る数字だと思うんですよね。 同様に 1 + 06 とかも多いかな。 

12 なら1秒の半分だからキリが良くてまだわかるのですが、なぜ 6 なのでしょう? さらにその半分、つまり4分の1だから? 18 はその3倍、つまり4分の3だから?

いまひとつスッとわかりません。なんでだろう。




ちなみに上の 6 とか 12 の話は、24fps を基準に言ってますよもちろん。
俺のカラダは完全に 24fps に蝕まれています。
30fps の PAN とか見ると気絶しそうになります。
表現は難しいですが、あえて例えると、
よく冷やした絹ごし豆腐を背中に密着させてつつつーーとスライドさせたような、
そんな気分になります。
卒倒します。

誰だ俺のカラダをこんなにしたのは。
元に戻せ。
俺のカラダにして返せ。



.

|

« 選択中のキーフレームを現在フレームにポン。 | トップページ | 嘔吐 Actions。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217974/54607456

この記事へのトラックバック一覧です: なんで 1+18 とか好きなんですか。:

« 選択中のキーフレームを現在フレームにポン。 | トップページ | 嘔吐 Actions。 »