AffterEffects用のスクリプト作成の際の断片集。たま~に少~しぐらいは役に立つことも書きますよ。
AfterEffects8(CS3)と付属のExtendScript Toolkit 2でのお話です。
まずはESTK側で操作対象をAfterEffectsに設定。
操作対象の取得
一番よく使うのが選択したレイヤに対しての操作なので。
targetLayers = app.project.activeItem.selectedLayers;
これで、配列「targetLayers」にレイヤオブジェクトを取得できます。選択したレイヤを一つだけ取得したいなら、
targetLayer = app.project.activeItem.selectedLayers[0];
前後しますが、現在作業中のコンポジションを得るには以下。
activeComp = app.project.activeItem;
時間
スプリプト内では時間指定は浮動小数点値での指定が必要になります。つまりコンポジションが30fpsで61フレーム目を指定したい場合「2.03333333333333」とします。フレームからこの時間を得るには、
floatTime = currentFormatToTime(61,30)
とします。また、文字列を使用して、
floatTime = currentFormatToTime("00:00:02:01",30)
とすることも出来ます。第2引数を30としているのは30fpsで計算していると言うことですがコンポジションのフレームレートを知るには、
activeComp = app.project.activeItem; fps = 1/activeComp.frameDuration; floatTime = currentFormatToTime("00:00:02:01",fps)
とします。回りくどいやり方ですが直接フレームレートを取得することは出来ません、1フレームの継続時間の逆数を取ることによってフレームレートを得ます。
レイヤの操作
簡単なところでレイヤ位置の操作です。
targetComp = app.project.activeItem; targetLayer = app.project.activeItem.selectedLayers[0]; targetLayer.transform.position.setValue([50,100]);
レイヤをひとつ選んで実行します。位置をx=50,y=100へ設定しました。但しsetValue()メソッドはキーを持たない場合に限り使えます。キーを持っている場合はsetValueAtTime()を使用して新たにキーを打ち値を設定します。
targetComp = app.project.activeItem; targetLayer = app.project.activeItem.selectedLayers[0]; targetLayer.transform.position.setValueAtTime(targetComp.time,[50,100]);
上の例は現在の時間にキーを打っています。合わせ技で、「キーを持たなければキーを打たずに位置を設定」、「キーが他にあればキーを打つ」ようにするなら、
targetComp = app.project.activeItem; targetLayer = app.project.activeItem.selectedLayers[0]; if(targetLayer.transform.position.numKeys == 0){ targetLayer.transform.position.setValue([50,100]); }else{ targetLayer.transform.position.setValueAtTime(targetComp.time,[50,100]); }
テキストファイルの読込み
テキストファイルを読込みたい時は。
fp = new File("C:¥¥text.txt"); fp.open("r");
です、ディレクトリを表す「¥(円マーク、環境によってはバックスラッシュ)」はエスケープ文字なので2つ重ねておきます。ちなみに”r”はリードオンリーで開いています。スクリプトの処理が終わるor中断するときには必ず以下を実行しファイルを閉じます。
fp.close();
もう少し使える例として、「ファイルを開く」ダイアログを表示してテキストを開き、1行ずつ読み込んでゴニョゴニョするには、
fp= File.openDialog(); if(fp != null){ fp.open("r"); while(!fp.eof){ aLine = fp.readln(); //ゴニョゴニョ } fp.close(); }
ダイアログを出してもキャンセルした場合、fpはnullになりopen()メソッド実行時にエラーになるのでnullの場合は処理をしないようにしています。readln()を実行すると変数「aLine」へ一行分の文字列を入れ、読み出す行を次へ進めます。これを繰り返し「File.eof」つまりEnd Of Fileになるとループを抜けます。
開くテキストファイルがCSVならゴニョゴニョする前に
dataArray = aLine.split(",");
を入れて一度配列にすればいいです。また読み込んだデータは数字であっても文字列なので、数値として使用した場合は、
floatVal = parseFloat(dataArray[0])
として数値に型変換してから使用します。
ちなみに、この「ファイルを読み込むスクリプト」はAffterEffectsに限らずPhotoShopやIllustratorでも使用できます。
標準出力
ESTKにデバッガが付いてはいますが、実行中もっと手軽に変数の値などを知りたい場合は、ESTKの「JavaScriptコンソール」へ出力します。
$.write("My Value : " + floatVal);
です。改行が必要なら
$.writeln("My Value : " + floatVal);
とします。
これだけ書いとけば、忘れないかな。
“Affter Effect & ESTK Code Snippets” への1件のフィードバック