エクスプレッション

AfterEffectsのエクスプレッションでカメラのピントをレイヤーに合わせる方法

カメラのフォーカスをエクスプレッションで合わせる方法

カメラもしくはレイヤーをアニメーションした場合にフォーカスを合わせる方法がいくつかあります。今回はひとつの方法としてエクスプレッションを使用した例をご紹介します。こちらはレイヤーの位置がカメラの正面にない場合にズレを修正する方法として有効な手段となっています。

実際の適用方法を見てみましょう。

 

カメラのピントをレイヤーに合わせる手順

手順はいたってシンプルですが、エクスプレッションを適用する方法を知っていないといけません。また、カメラを使用するので新規作成しておきましょう。3D空間でのカメラの仕様なので、ピントを合わせたいレイヤーを3D化するのもお忘れなく。

簡単2ステップ

01.ピントを合わせたいレイヤーの名前を「target」にする

02.カメラの「フォーカス距離」に以下のエクスプレッションを記入

target = thisComp.layer(“target”);

V1 = target.toWorld(target.anchorPoint) – toWorld([0,0,0]);

V2 = toWorldVec([0,0,1]); dot(V1,V2);

引用元:VILVO DESIGN BLOG

 

空間の指定

このエクスプレッションを理解するためにはグローバル座標ローカル座標について知っておく必要があります。なたで日記をご覧ください。
 
ややこしいのですがAEのリファレンスでは座標系について「空間」という言葉を使用しています。レイヤー空間・コンポジション空間・ワールド空間という言い方をするようです。
 
 
 
レイヤー空間・コンポジション空間・ワールド空間

空間は左上が原点[0,0]になります。エフェクトはレイヤー空間を使用して範囲の指定を行っています。空間の値を別の空間の値に変換させることもできます。その一つにtoWorldがあり、ワールド空間へ変更しています。

 

toWorld(point, t=time)

返されるタイプ:配列 「2 または 3」。引数のタイプ:point は配列 「2 または 3」で、t は Number です。レイヤー空間からビューに依存しないワールド空間へポイントをトランスフォームします。

 

toWorldVec(vec, t=time)

返されるタイプ:配列 「2 または 3」。 引数のタイプ:vec は配列 「2 または 3」 で、t は Number です。レイヤー空間からワールド空間へベクトルをトランスフォームします。

 

dot(vec1, vec2)

返されるタイプ:Number。 引数のタイプ:vec1 および vec2 は配列です。ベクトル引数のドット積(内積)を返します。

引用元:エクスプレッション言語リファレンス

配列[2または3]というのが「toWorld([0,0,0])」の[0,0]や[0,0,0]のことをさしています。ベクトルを使用することで大きさを測り、位置を取得しています。内積についておさらいしたい人はこちらの動画がおすすめです!

 

 

まとめ

①レイヤーのアンカーポイントの位置を取得してズレている分だけ引いて修正

②基準となるz軸のベクトルを取得

➂これらをもとにフォーカス距離を再取得

 

いかがでしたでしょうか。数学が苦手で取っつきづらいと感じた人もいたかもしれません。そのような人には数秒でできる簡単な方法があるので、紹介しようと考えています。