Excelで入力された座標データを利用する

Excelや、アニメ制作ソフトなど他のソフトで得られたデータをAfterEffectsで利用したい場合があります。そこで、今回はExcelで入力されたデータをAfterEffects 6.5で利用してみます。
まず、最初にExcelに入力された「文字」「X座標」「Y座標」を読み込むスクリプトです。Excelで入力されたデータは以下のようになっています。

あ 10 10
い 100 50
う 34 30
え 55 100
お 200 88

ファイルは「タブ区切りテキスト」形式で保存してください。次にAfterEffectsから以下のスクリプトを実行すると自動的にテキストレイヤーが作成され、文字と座標が設定されます。

TAB = String.fromCharCode(9);
filename = File.openDialog("ファイルを選択してください","");
fileObj = new File(filename);
if (fileObj.open("r"))
{
while(!fileObj.eof)
{
txt = fileObj.readln();
txt = txt.split(TAB);
layObj = app.project.activeItem.layers.addText(txt[0]);
layObj("position").setValue([txt[1],txt[2],0]);
}
}

位置の設定はpositionプロパティにsetValue()を使って行います。[〜]の中は左から順番にX座標、Y座標、Z座標になっています。ExcelでZ座標も指定してあるならば以下のように変更します。

layObj("position").setValue([txt[1],txt[2],0]);
   ↓
layObj("position").setValue([txt[1],txt[2],txt[3]]);

文字は不要だから座標値だけ利用したい人もいるでしょう。例えば以下のようにExcelでX,Y座標値が入力されているとしましょう。さきほどと同様にタブ区切りテキスト形式で保存しておきます。

10 50
30 90
4 100
5 200
100 70
70 40
80 15
50 140
30 110
22 170

以下のスクリプトを実行するとタイムライン上で選択したレイヤーの座標値をExcelで入力したものに設定してくれます。

aTime = 0;
fps = 10/30;
TAB = String.fromCharCode(9);
layObj = app.project.activeItem.selectedLayers[0];
filename = File.openDialog("ファイルを選択してください","");
fileObj = new File(filename);
if (fileObj.open("r"))
{
while(!fileObj.eof)
{
txt = fileObj.readln();
txt = txt.split(TAB);
layObj("position").setValueAtTime(aTime,[txt[0],txt[1],0]);
aTime = aTime + fps;
}
}

ここでは10/30フレームにしてありますが、1/30フレームにしたい場合は以下のように変更します。

fps = 10/30;
  ↓
fps = 1/30;

このスクリプトでは設定した座標値の間をスムーズにレイヤーが移動します。通常のベジエ補間でキーフレームが設定されています。しかし、場合によっては、その座標だけで一定時間停止して欲しい場合があります。もちろん、設定された後にタイムライン上のキーを選択して、キーフレーム補間により「停止」を選択しても構いません。が、やはりせっかくスクリプトを使っているので、そこも自動的にやってしまいましょう。以下のスクリプトはキーフレーム補間を停止に設定してくれます。

aTime = 0;
fps = 10/30;
TAB = String.fromCharCode(9);
layObj = app.project.activeItem.selectedLayers[0];
filename = File.openDialog("ファイルを選択してください","");
fileObj = new File(filename);
if (fileObj.open("r"))
{
while(!fileObj.eof)
{
txt = fileObj.readln();
txt = txt.split(TAB);
layObj("position").setValueAtTime(aTime,[txt[0],txt[1],0]);
layObj("position").setInterpolationTypeAtKey(1,KeyframeInterpolationType.HOLD);
aTime = aTime + fps;
}
}

キーフレーム補間の指定は以下のものがあります。

KeyframeInterpolationType.HOLD 停止
KeyframeInterpolationType.LINER リニア
KeyframeInterpolationType.BEZIER ベジエ

AfterEffectsでは難しい演算や時間のかかる処理なども、このような方法やexecute()を使えば外部のアプリケーションを呼び出して処理させ、そのファイルを読み込んでデータを利用することが可能になります。AfterEffect 6.5は思っている以上に、いろいろなことができるアプリケーションです。時間がある時にでも、それ以外の機能についても研究してみると面白いと思います。




[サンプルをダウンロード]