日々適当

hibitekitou

トランスフォーム関係のエクスプレッション

cg |2012-08-23
少しおぼえたのでメモ。



上図、「位置」に設定してあるエクスプレッションは、他のレイヤーの位置に一致させるという内容です。
他のレイヤーの位置を参照するとき、position ではなく、anchorPoint を取得するのがみそみたいですね。AEのレイヤーは、アンカーポイントを起点としてトランスフォームを行うってことを全く意識しておりませんでした。
toWorld() は、グローバルな座標系の値に変換しているもので、参照しているレイヤーが、別のレイヤーの子供になっているときなんかに必要になってきます。

「スケール」に設定してあるエクスプレッションは、カメラからの距離に関係なく、大きさが一定になるという内容です。
下図において、Wはコンポジションの幅。pはそのコンポジション上で目標をどんな大きさにするかという値。θは水平画角で、zはカメラからコンポジション平面までの距離。これはAE上ではズーム値として表現されます。そしてdはカメラから処理を行うレイヤーまでの距離となります。

で、上図のエクスプレションにおいて、

変数 targetSize で指定した大きさになるようにスケールを調整します。下図におけるpです。
変数 angle は、カメラの水平画角をラジアンで出しています。下図におけるθを求めてます。
変数 distance はカメラからこのレイヤーまでの距離。下図におけるdです。

その上で、下図におけるsの値を求めて、これをスケール値に入れちゃっている、ってことをやってます。

計算結果をスケール値にしちゃってますけど、ここは厳密には違うんだろうなぁと思いつつ、大きさを一定にはクリアしているはずです。



この、大きさを一定にってのは、今やっている仕事にてSIのICE Treeの方で重宝した考え方でございます。
その場合、Wはレンダリング時の画像の幅になり、pについては、画像内で何ピクセルの大きさで表現するかの指定となります。

<追記>
今回のように、位置を一致させて大きさも固定にするという場合、固定される方を2Dレイヤーのまま扱えれば良さそうだよなぁと思っていたら、そんなエクスプレッションもありました。
上図のテキストレイヤー text_meso は3Dレイヤーですが、これを2Dレイヤーにして、位置に対して以下のエクスプレッションを書いてやれば良いようです。

thisComp.layer("Meso").toComp([0,0,0])

これでこのレイヤーにレイヤー Meso が投影され、このレイヤー上の2Dの位置が帰ってくるみたいです。
もしオフセットをつけたいなら

pos = thisComp.layer("Meso").toComp([0,0,0]);
[pos[0] + 10, pos[1] + 10];

とでもしてやれば良いでしょう(10ピクセルずつ動かすという意味になってます)。
</追記>
コメント ( 0 )|Trackback ( )
 
コメント
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。