AfterEffectsで設定したフレーム分スキップして出力する方法

最近AEを触り始めたんですが、

SIから連番画像をレンダリングして、それをAEに読み込ませて加工し、

そこからさらにレンダリングしたものを最終的に連番のテクスチャアトラス/スプライトシートとして

SI上でUVのスクロールで切り替えて使おうと思っていました。


テクスチャのサイズがでかすぎるとメモリを圧迫するし・・・ということで

AEに持って行ってレンダリングする時に何フレか飛ばしながら16枚とか32枚とかそういう感じにしたかったんですが

SIではレンダリングの設定のとこにあるフレームステップ(スキップ)を設定しようと

AE内を探したりググったりしてみましたがどうやら普通には設定できなさそう… MAZIKAYO!!

(下記で書いていますがなぜかスクリプトでは設定できます)


もしかして僕が調べ足りないだけで知ってる方いるかなぁとTwitterでつぶやいてみると

@naritasayjingさんがAE触り始めたての自分では思いもつかないような方法を教えて下さいました。






素晴らしいですね!

エクスプレッションのtimeにかけてる数値=スキップ数になるんです!

例えばtime*2だと、1フレ経つごとにそのプリコンポしてあるアニメの時間は2進んだことになるので半分になるんですね。

 

いやぁ~すごくおもしろいですね。

 

このnaritasayjingさんに教えてもらった方法で十分わかりやすいですし、解決してたんですが

調べてでてきたいたスクリプトでの設定も気になったので簡単にやってみました。

ちなみにこちらのサイトを参考にさせて頂きました。


AEは初心者なのでAEの使い方として正しいのかわからないですが、

一応下記のスクリプトできちんとレンダリング時に入力した数値ごとにスキップしてレンダリングしてくれました!

 

全体のフレーム数が少なければAEでのレンダリング時間は上記のやリ方もスクリプトもそんなに変わらないと思いますが

教えてもらった上記の方法だと前半に目的のものが出力されて後半に目的のもの以外(透明だったり真っ黒だったり)の画像が出力されるのに比べ、

スクリプトの方はほんとにその設定した数値分ずつスキップしてレンダリングしてくれるので時間も出力結果も余分なものはありませんでした。

 

でもスクリプトの欠点としては後から見たり、他の人が見た場合にスキップをなんぼに設定したかをそこだけじゃあ判断できないことです。

その点タイムリマップのエクスプレッションならずっと数値が残って見えるのでいいですね!

 

少しだけ話はそれますが、

下記のスクリプトをExtend Script Toolkitで書いていて、

レンダーキューのところに「コメント」というのを見つけたので

「お!そこにスキップで入力された数値をセットすればええやん!」と思いましたが

ググったり、Extend Script Toolkitのデータブラウザの中を探したりして

コンポやレイヤーのとこのコメントにはスクリプトで書き込めましたが

 

app.project.renderQueue.item(1).comment = "hoge";

 

とかやってもダメでした・・・。

あまり使わそうですが、ご存知の方いらっしゃいましたらご教授下さい。

 

ちなみに下記のスクリプトはAEのCCでしか試していませんので他のバージョンで動かなかったすみません。

試してみたい方がいらっしゃるかわかりませんが、一応DLのリンクを貼っておきます。

下のスクリプトをテキストエディタにコピーして適当な名前をつけてScriptフォルダに入れてもらっても大丈夫です。

 

 


//入力するためのダイアログ表示
var inputTxt = prompt("スキップさせたいフレーム数を入力して下さい(0 ~ 99)" , "1" , "スキップ設定");

//入力された文字列を数値に変換
var skipInt= Number(inputTxt);

//アクティブなアイテムをcompとする
var comp = app.project.activeItem;

//入力がキャンセルされた場合
if(inputTxt == null ){
    alert("キャンセルされました");
}else{
    //入力された文字列が数値以外だった場合
    if(typeof skipIndex == "NaN"){
        alert("数値を入力して下さい");
    }else{
        //compがnullではなく、且つコンポならば処理する
        if ( (comp != null) && (comp instanceof CompItem == true) ) {
            var RQ = app.project.renderQueue;
            var RQcount = RQ.numItems;
            //alert("レンダーキューの数 = " + RQcount);
            if(RQcount == 0){
                alert("レンダーキューが1つもないようです");
            }else{
                //一番下にあるレンダーキューを複製
                RQ.item(RQcount).duplicate();
                //複製してできたレンダーキューのスキップフレーム設定を入力された数値にする
                RQ.item(RQcount + 1).skipFrames = skipInt;
                //レンダリングを実行
                RQ.render();
            }
        }
        else{
            alert("コンポを1つ選択してから実行してください");
        }
    }
}

その後、naritasayjingとのやりとりにmokoさんも反応され、

下記のようなやりとりをされていました。

いやぁ~勉強になります。