hibitekitou
AEスクリプトメモ
cg |2012-08-13
ちょっと仕事で必要になるかもしれないんで、トラッキング情報をSIに持って行ってみるでやったアエとXSIを実行する前の下準備作業を自動化するスクリプトを書いていたんです。んでまぁ何となく今回の仕事で使う分には問題無いだろうという物がかけたので、そいつに使っている部品をメモ。javascriptもAEのスクリプトも経験不足でよく分からんのです。
スクリプトの考え方としては、書き出したいチャンネルに各フレームごとにキーフレームを設定し、その値を適切な値に書き換える、という作業の繰り返しです。記録は、ヌルオブジェクトに対して行うので、ヌルを作成するところから始まります。
とりあえず、処理を行うコンポジションの取得です。
activeComp = app.project.activeItem;
続いてヌルオブジェクトの作成です。
newNull = activeComp.layers.addNull();
ちなみにこいつに任意のレイヤー名を付けたい時には、
newNull.source.name = "nice_name"
とか書いてやるんだそうです。nice_name って名前のヌルになります。
でもって、3Dレイヤーにします。
newNull.threeDLayer = true;
このコンポジション(activeComp)でアクティブなカメラの取得は
camera = activeComp.activeCamera;
となります。
camera の値を newNull に記録していきます。とりあえず、camera の 位置(position)の値を newNull の位置(position)の値に記録します。
記録するために、まずはキーフレームを打ちます。
index = newNull.position.addKey( time );
time はキーフレームを打つタイムライン上の位置(秒単位)。index って変数にaddKey()の返り値を入れていますが、キーフレームのインデックスが帰ってきています。このキーフレームの値を、カメラの位置の値に書き換えます。
newNull.position.setValueAtKey( index, camera.position.valueAtTime(time));
カメラのtime秒の位置の値を、ヌルの位置チャンネルのindex番目のキーフレームに入れてやる、という意味になります。
なお、回転は newNull.xRotation, newNull.yRotation, newNull,zRotation というように各チャンネル別々に入れたり取得したりする必要があります。方向は camera.orientation で [ x,y,z ] の値が入った状態で取得できるので、newNull の回転のxに camera の方向の x の値を入れるには
newNull.xRotation.setValue(camera.orientation.value[0])
とか書く必要があります。
カメラのズーム値は例えば
camera.property("zoom").value
で取得できます。この時とれる値はピクセル単位のものなので、適時水平画角の値に変える必要があるかもです。
このキーフレームを作ってその値を書き換えるという作業を、フレームの数の分だけ for 文で回してやることになります。
ループ処理の為にはタイムライン上の時間をフレーム単位で得る必要があります (全フレームにキーフレームを打とうとしていました)。しかし、上の time に入れる値は秒単位。ってことで、以下のことを知っておく必要があります。
コンポジションの長さ(秒単位): activeComp.duration
コンポジションのフレームレート: activeComp.frameRate
これでフレーム番号を i とするなら、i / activeComp.frameRate で i フレームの値を秒単位に変換出来るし、コンポジションの長さは activeComp.duration * activeComp.frameRate と書いてフレーム単位で得ることが出来ます。
まぁしかし、たったこれだけの内容を組み合わせたスクリプトを作るのに、知らないものだからずいぶんと時間が掛かりましたよ。
スクリプトの考え方としては、書き出したいチャンネルに各フレームごとにキーフレームを設定し、その値を適切な値に書き換える、という作業の繰り返しです。記録は、ヌルオブジェクトに対して行うので、ヌルを作成するところから始まります。
とりあえず、処理を行うコンポジションの取得です。
activeComp = app.project.activeItem;
続いてヌルオブジェクトの作成です。
newNull = activeComp.layers.addNull();
ちなみにこいつに任意のレイヤー名を付けたい時には、
newNull.source.name = "nice_name"
とか書いてやるんだそうです。nice_name って名前のヌルになります。
でもって、3Dレイヤーにします。
newNull.threeDLayer = true;
このコンポジション(activeComp)でアクティブなカメラの取得は
camera = activeComp.activeCamera;
となります。
camera の値を newNull に記録していきます。とりあえず、camera の 位置(position)の値を newNull の位置(position)の値に記録します。
記録するために、まずはキーフレームを打ちます。
index = newNull.position.addKey( time );
time はキーフレームを打つタイムライン上の位置(秒単位)。index って変数にaddKey()の返り値を入れていますが、キーフレームのインデックスが帰ってきています。このキーフレームの値を、カメラの位置の値に書き換えます。
newNull.position.setValueAtKey( index, camera.position.valueAtTime(time));
カメラのtime秒の位置の値を、ヌルの位置チャンネルのindex番目のキーフレームに入れてやる、という意味になります。
なお、回転は newNull.xRotation, newNull.yRotation, newNull,zRotation というように各チャンネル別々に入れたり取得したりする必要があります。方向は camera.orientation で [ x,y,z ] の値が入った状態で取得できるので、newNull の回転のxに camera の方向の x の値を入れるには
newNull.xRotation.setValue(camera.orientation.value[0])
とか書く必要があります。
カメラのズーム値は例えば
camera.property("zoom").value
で取得できます。この時とれる値はピクセル単位のものなので、適時水平画角の値に変える必要があるかもです。
このキーフレームを作ってその値を書き換えるという作業を、フレームの数の分だけ for 文で回してやることになります。
ループ処理の為にはタイムライン上の時間をフレーム単位で得る必要があります (全フレームにキーフレームを打とうとしていました)。しかし、上の time に入れる値は秒単位。ってことで、以下のことを知っておく必要があります。
コンポジションの長さ(秒単位): activeComp.duration
コンポジションのフレームレート: activeComp.frameRate
これでフレーム番号を i とするなら、i / activeComp.frameRate で i フレームの値を秒単位に変換出来るし、コンポジションの長さは activeComp.duration * activeComp.frameRate と書いてフレーム単位で得ることが出来ます。
まぁしかし、たったこれだけの内容を組み合わせたスクリプトを作るのに、知らないものだからずいぶんと時間が掛かりましたよ。
コメント ( 0 )|Trackback ( )
AE のカメラの画角
cg |2012-08-13
メモ:たぶん、こーいうこと。水平画角みたいだから、トップビューからみてみたら何となく分かった感じ?
Wはコンポジションの幅(ピクセル値)、Lはズームの値(ピクセル値)。
![](https://blogimg.goo.ne.jp/user_image/41/b5/5a4afa4f6f5540f3ee7f8710c7aa4717.jpg?random=b498844401d0ba689188417e5333f618)
あくまでも内部単位はピクセルなんだなぁ、と。
Wはコンポジションの幅(ピクセル値)、Lはズームの値(ピクセル値)。
![](https://blogimg.goo.ne.jp/user_image/41/b5/5a4afa4f6f5540f3ee7f8710c7aa4717.jpg?random=b498844401d0ba689188417e5333f618)
あくまでも内部単位はピクセルなんだなぁ、と。
コメント ( 0 )|Trackback ( )
・