AfterEffects – レイヤーのPropertyObjectのリスト

ずっーと以前に中途半端に書いた記事の続き(7年越し!!)です。

作った経緯を忘れましたが、とあるプロパティのMatchNameが知りたかっただけで再帰処理の無いスクリプトでした。以下がレイヤーに適用したエフェクトのプロパティも含め全てリストするスクリプトです。ESTKへコピーしAfterEffects側でレイヤーを一つ選択してから実行します。

(function(){
    var activeComp = app.project.activeItem;
    var selected = activeComp.selectedLayers[0];
    $.writeln("Layer Name:" + selected.name);

    function listProperties(obj,depth){
        for(var i=1; i<=obj.numProperties; i++){
            var indent = ""
            for(var j = 1; j <= depth;j++) indent += "\t";
            $.write(indent + i +":"+obj.property(i).name+":"+obj.property(i).matchName+"\n") ;
            listProperties (obj.property(i),depth+1);
        }
    }    

    listProperties (selected,0);
}());

結果は、ESTKのコンソールへ出力されます。

昨日投稿したスクリプトの改良をしていて気付きましたが、レイヤーの親子関係で親を知る事はレイヤーオブジェクトのparentアトリビュートから出来ますが、子のレイヤーへの参照は無いんです。

もしかしてプロパティオブジェクトに入ってるかなと思って上のスクリプトを書きましたが見つからず、、、

いやビックリ。全てのレイヤーのparentアトリビュートを調査して逆からたどるとかするの?
シーングラフ的なもの無いのか、、、


AfterEffects – グリッド状にレイヤーを複製

スクリプトを作成中。

オフセットの数値を入力するのではなく、矩形の始点(左上)と終点(右下)を選択して実行すると、始点として選択したレイヤーが複製される感じ。

ひとまず動くのは出来ましたが、位置アニメーションしているレイヤーへの対応が出来ていない。あと子をもつレイヤーの扱いとか。アニメーション対応は結構大変そう。仕事に必要な部分だけ実装してひとまず満足状態なので、機能を追加しておいおい公開する事にします。探せば似たような機能を持つものはどこかにあるでしょうけどね。

久しぶりにAEのスクリプトを書きましたが、数年前からまったく新しい機能が追加されていない?アイテムの選択変化でコールバックとかいまだに実装されないのは何で?

にしてもJavascriptはなんかとっつきにくい。動的型付けだったり、プロトタイプベースとか、thisのスコープが、とか。TypeScriptのAfterEffects用型定義ファイルが存在するようなので、TypeScriptで開発する方がいいかな。


MAX2AE

一段落したと思ったらすぐに次のお仕事。大忙しっ!

さて、欲しいな〜と思ったけど$250もするんですね、MAX2AE。高すぎってことで、自分で作る準備です。探せばどなたかが公開されてるんでしょうけどね。

まずは基本的なところから位置の取得、例えば15フレーム目のpoint01の位置を知りたければ、

at time 15 in coordsys world $point01.pos

これをスタートからエンドまでループさせれば、ノードのワールド座標は簡単に取得できますね。

for i=animationRange.start to (animationRange.end - animationRange.start) do (
	print ("frame " + (i as string)+ ":" + (at time i in coordsys world $point01.pos) as string)
)

カメラの書き出しですが、AfterEffectsのカメラはターゲット付きなので、maxのフリーカメラを書き出したい場合、カメラのZ方向と「ターゲットまでの距離」を使って適当なターゲット位置を計算します。

if superClassOf selection[1] == camera do
(
	case classOf selection[1] of
	(
		Freecamera:
			(
				td = selection[1].baseObject.targetDistance
				tartgetPos = [selection[1].dir.x * -1 * td + selection[1].pos.x , selection[1].dir.y* -1 * td + selection[1].pos.y, selection[1].dir.z * -1 * td + selection[1].pos.z ]
			)

		Targetcamera:
			(
				tartgetPos = selection[1].target.pos
			)
	)
)

あとはカメラのFOVやロール角を書き出せばOKかな。

ちなみに、レンズフレアエフェクト等の位置参照用に、スクリーン座標を知りたい場合は、

p = selection[1].pos * viewport.getTM()
screen_topLeft = mapScreenToView [0,0] (p.z) [RenderWidth,RenderHeight]
screen_bottomRight = mapScreenToView [RenderWidth,RenderHeight] (p.z) [RenderWidth,RenderHeight]
world_size = screen_topLeft - screen_bottomRight
x_aspect = RenderWidth/(abs world_size.x)
y_aspect = RenderHeight/(abs world_size.y)
screenPos = point2 (x_aspect*(p.x - screen_topLeft.x)) (-(y_aspect*(p.y - screen_topLeft.y)))

です。アクティブビューポートとレンダリングサイズを元にピクセルで結果(screenPos)を取得できます。


Offset Layer Start Time

粗編されてる方に電話したら作業中、、、明日朝もらって月曜朝までにフィニッシュ出来るかな?

さて、レイヤーのスタート時間をずらしたい、1″6’22fの2秒半後は何時?テンパって作業してると単純な計算さえままならないので、簡単なスクリプトを突貫で作りました。レイヤーをドラッグ中「情報」パレットに「Δ」として表示されるんですけどね。

hTAEUtilityPalette

レイヤーを選択(複数も可)してオフセット時間を入力してボタンを押すだけ。in点では無くってスタート時間がオフセットされます、キーフレームも一緒についてくるって事です。上では時間を正しくコロンで記述していますが、「2.15」としてもかまいません。

ホントは選択したキーだけオフセットもやりたいんですが、またおいおいね。スクリプトがエラそうな名前なのは以後ゴテゴテと機能追加してくためです。初めてUIを持ったスクリプトを作りましたけど、これでええんかなぁ。

ちなみに、「Shift+Alt+j」で時間指定の代わりに「+」をつければ現在時刻をその分だけ移動できます。

これやってからShift押しながらレイヤーをドラッグしてスナップかけても良いんですが、おかしなところにスナップしたりしますもんね。


気ぃつけなはれやっ

まいった。

AfterEffectsの作業中、ワークエリアを変更しながら「作業」→「プレビュー」を繰り返しているとどうもさっき直したはずの曲とのタイミングが合わない、で修正してまた別のところを作業してプレビューするとまたズレテル、、、疲れと睡魔のせいにしてましたが、よく見るとワークエリアのin点から遠ざかるにつれ映像がカクカクしてくる。

で、全尺をワークエリアにしてプレビューすると曲が終わってまだ映像が7秒ほど残ってる、、、

RAMプレビューが30fps出てなかったと言うことが発覚!なぜ?情報パネルには30fps,リアルタイムってでてるやん!

再起動してAfterEffectsのみ起動して作業する分には問題ない、どうやら同時に起ち上げてたPhotoshopやIllustratorがメモリを圧迫してたみたい。おとといあたりからそんな現象があったと思うんだけど。それにしても物理メモリが足らないのにプレビューを作るなよ。

PC201601

よく考えたら、裏でとんでもなく大きな画像とか、アートブラシ付きのベクトルデータ開いてましたからね、具合悪くなって当然です。

深夜買いもんに行こうと思ったら財布の中空っぽだし、やっぱり今週は最低です。