見出し画像

[After Effects]画像の大きさを揃えるエクスプレッション◆スクリプト配布◆

こんにちは合同会社Cinergia(シネジア)のシマダです。
普段僕が仕事で使用しているエクスプレッションをどんどん公開していきます。
「エクスプレッションってそもそも何?」という方はまずはこちらの記事をお読みください。『After Effectsのエクスプレッションって、そもそも何ができる?[エクスプレッション超初級①]』

ということで第1弾のエクスプレッションはこちらになります。

バラバラのサイズの画像の高さもしくは幅を揃えるエクスプレッションになります。
複数の商品を紹介したり、フェスの演者を紹介したりする際に使用できるんじゃないでしょうか?

エクスプレッション使用のサンプル画像

「Photoshopであらかじめ大きさを揃えておく」「手作業でスケールを合わせる」でもできますが、修正や微調整をする際にまた同じ作業をしなくてはなりません。
エクスプレッションで制御する事で修正や微調整が楽になります。


ベースになるエクスプレッションを書いてみよう

まず高さを揃えるエクスプレッションを書いていきます。

高さがバラバラ
エクスプレッションを入れて高さを揃える

下記エクスプレッションをスケールに打ち込みます。

タイムラインパネルの画面
mySize = thisLayer.sourceRectAtTime().height;
targetLayer = thisComp.layer("monkey");
targetScale = targetLayer.transform.scale;
targetSize = targetLayer.sourceRectAtTime().height;
resultW = targetSize * targetScale[0]/100 / mySize * value[0];
resultH = targetSize * targetScale[1]/100 / mySize * value[1];
[resultW,resultH]

※  targetLayer = thisComp.layer("monkey"); の「monkey」は高さをそろえたいレイヤーの名前を入力します。

では解説していきます。

【 sourceRectAtTime().height 】

テキストやシェイプレイヤーのバウンディングボックスの高さのサイズを取得するために使用されます。


【 thisComp.layer("monkey") 】

現在のコンポジションの「monkey」というレイヤーを取得します。


【 transform.scale 】

スケールの値を取得します。


【 resultW = targetSize * (targetScale[0]/100)/ mySize * value[0]; 】

わかりやすくすると↓このような意味になります。
「ターゲットレイヤーの高さ」×(「ターゲットレイヤーのスケール」÷100)÷「現在レイヤーの高さ」×「現在パラメーターの元の値(スケール)」

ひとづつ順番に解説していきます。
「ターゲットレイヤーの高さ」「現在レイヤーの高さ」で割る事で比率が計算できます。
「ターゲットレイヤーの高さ」÷「現在レイヤーの高さ」

比率なので「現在のレイヤー」に掛けると「ターゲットレイヤー」と同じサイズになります。
ですが「ターゲットレイヤーの高さ」÷「現在レイヤーの高さ」はオリジナルの大きさの比率になるため、「ターゲットレイヤー」がスケールによって大きさを変更された場合は計算がかわってしまいます。
正確に言うとこのような意味になりますね
「ターゲットレイヤーの高さ(オリジナルの高さ)」÷「現在レイヤーの高さ(オリジナルの高さ)」

そのため「ターゲットレイヤーのスケール」を式に反映します。
スケールの値は「%」なので、計算できる値に変換しなくてはいけません。
そのため「ターゲットレイヤーのスケール」から 100を割って比率として計算できるようにします。
「ターゲットレイヤーのスケール」÷100
「現在のレイヤー」のスケールも反映したいので「現在パラメーターの元の値(スケール)」も同様に計算します。
「ターゲットレイヤーの高さ(オリジナルの高さ)」×(「ターゲットレイヤーのスケール」÷100) ÷ 「現在レイヤーの高さ(オリジナルの高さ)」× (「現在パラメーターの元の値(スケール)」÷100)

ここまでの計算は全て比率の計算をしていますがスケールの値は「%」に戻す必要があるので最後に100を掛けましょう
「ターゲットレイヤーの高さ(オリジナルの高さ)」×(「ターゲットレイヤーのスケール」÷100) ÷ 「現在レイヤーの高さ(オリジナルの高さ)」× (「現在パラメーターの元の値(スケール)」÷ 100) × 100

少しややこしくなってきましたね、変数で計算式を書き直してみましょうtargetSize × (targetScale[0]÷100)  ÷  mySize × (value[0]÷100) × 100
※わかりやすいように(targetScale[0]÷100) (value[0]÷100)など( )を使用していますが本来は計算上必要ありません。

これで計算は間違えないのですが、100で割ったのちに100を掛けているで余分な計算が含まれていますね。
Valueの方の「÷100」と最後の「×100」で相殺します。
targetSize × (targetScale[0]÷100)  ÷  mySize × value[0]

これをエクスプレッションのコードに置き換えてみます。
targetSize * targetScale[0]/100 /mySize * value[0]

これで比率を出して%に置き換える計算になりますね。


【 resultH = targetSize * targetScale[1]/100 / mySize * value[1] 】

「value」「targetScale」が[0]から[1]に変更しただけで同じ意味合いの計算式になっています。


【 [resultW,resultH] 】

計算結果を2次元の値で出力しています。


これで指定したレイヤーと同じ高さに揃えるエクスプレッションができました。

幅を揃えるエクスプレッション

高さではなく幅を揃えたい場合は
「mySize = thisLayer.sourceRectAtTime().height;」と
「targetSize = targetLayer.sourceRectAtTime().height;」の
「height」「width」に置き換えます。
「mySize = thisLayer.sourceRectAtTime().width;」
「targetSize = targetLayer.sourceRectAtTime().width;」になります。

置き換えたコードはこうなります。

mySize = thisLayer.sourceRectAtTime().width;
targetLayer = thisComp.layer("monkey");
targetScale = targetLayer.transform.scale;
targetSize = targetLayer.sourceRectAtTime().width;
resultW = targetSize * targetScale[0]/100 / mySize * value[0];
resultH = targetSize * targetScale[1]/100 / mySize * value[1];
[resultW,resultH]

高さと幅をドロップダウンメニューで変更

コードをいちいち打ち替えて高さと幅を変更するのは面倒です。
そのためにドロップダウンメニューで簡単に変更できるようにしていきましょう。

ドロップダウンメニュー制御を適用

まずエフェクト&プリセットパネルのエクスプレッション制御の中にある「ドロップダウンメニュー制御」を適用します。

「エフェクト&プリセットパネル」のエクスプレッション制御の画面
「ドロップダウンメニュー制御」を適用したエフェクトパネル

「ドロップダウンメニュー制御」の項目の名前を変更していきます。
外面上の青い文字で「編集」と書かれている部分をクリックすると、編集画面が出てくるので、そこで項目名を「高さ」「幅」に打ち替えましょう。
※「+」を押すと項目が増え「-」を押すと項目が削除されます

「ドロップダウンメニュー制御」の項目編集画面

「ドロップダウンメニュー制御」のエフェクトの名前を「リサイズタイプ」に変更します。

「リサイズタイプ」に名前を打ち替えた画面

ドロップダウンメニューで「高さ」「幅」をのどちらを選んだかで分岐されるエクスプレッションを作ります。

「if」で条件分岐

分岐をするエクスプレッションは「if」を使用します。
このように条件が真か偽を判断して分岐します。(ifについては今後また別の記事で書いていきます。)

if (条件1) {
 条件1が真の場合に実行されるコード
} else if (条件2){
 条件2が真の場合に実行されるコード
}else{
 条件が偽の場合に実行されるコード
}

ifを使用して書いたエクスプレッションがこちらになります。

mySizeW = thisLayer.sourceRectAtTime().width;
mySizeH = thisLayer.sourceRectAtTime().height;
targetLayer = thisComp.layer("monkey");
targetScale = targetLayer.transform.scale;
targetSizeW = targetLayer.sourceRectAtTime().width;
targetSizeH = targetLayer.sourceRectAtTime().height;
if(effect("リサイズタイプ")("メニュー") == 1){
 resultW = targetSizeH * targetScale[0]/100 / mySizeH * value[0];
 resultH = targetSizeH * targetScale[1]/100 / mySizeH * value[1];
}else if(effect("リサイズタイプ")("メニュー") == 2){
 resultW = targetSizeW * targetScale[0]/100 / mySizeW * value[0];
 resultH = targetSizeW * targetScale[1]/100 / mySizeW * value[1];
};
[resultW,resultH]

【 if(effect("リサイズタイプ")("メニュー") == 1) 】

effect("リサイズタイプ")("メニュー")は先ほど設定した「ドロップダウンメニュー」のエフェクトの値を取得しています。
項目の1つ目は「1」2つ目は「2」のように項目の順番の値になります。
今回は「高さ」は「1」、「幅」は「2」 を返すようになっていますね。
「==」は右と左が同じだった場合という条件を示しています。
今回の場合は「ドロップダウンメニューの項目番号」と「1(高さ)」が同じなら実行されます。


【 else if(effect("リサイズタイプ")("メニュー") == 2) 】

上記と同様に2つ目の条件の分岐になります。
今回の場合は「ドロップダウンメニューの項目番号」と「2(幅)」が同じなら実行されます。


これで高さと幅で分岐ができるようになりました。

「レイヤー制御」で指定するレイヤーを選択する

大きさを参照するレイヤーを簡単に変更できるようにしていきましょう。

レイヤー制御を適用

エフェクト&プリセットパネルのエクスプレッション制御の中にある「レイヤー制御」を適用します。

「エフェクト&プリセットパネル」のエクスプレッション制御の画面

「レイヤー制御」のエフェクトの名前を「ターゲットレイヤー」に変更します。

「ドロップダウンメニュー制御」を適用したエフェクトパネル

選択したターゲットレイヤーの大きさを参照できるようにコードを打ち替えます。

mySizeW = thisLayer.sourceRectAtTime().width;
mySizeH = thisLayer.sourceRectAtTime().height;
targetLayer = effect("ターゲットレイヤー")("レイヤー");
targetScale = targetLayer.transform.scale;
targetSizeW = targetLayer.sourceRectAtTime().width;
targetSizeH = targetLayer.sourceRectAtTime().height;
if(effect("リサイズタイプ")("メニュー") == 1){
 resultW = targetSizeH * targetScale[0]/100 / mySizeH * value[0];
 resultH = targetSizeH * targetScale[1]/100 / mySizeH * value[1];
}else if(effect("リサイズタイプ")("メニュー") == 2){
 resultW = targetSizeW * targetScale[0]/100 / mySizeW * value[0];
 resultH = targetSizeW * targetScale[1]/100 / mySizeW * value[1];
};
[resultW,resultH]

「targetLayer = thisComp.layer("monkey");」を
「targetLayer = effect("ターゲットレイヤー")("レイヤー");」に変更しました。
これで参照する先をレイヤー制御で選択することができるようになりました。

今回のふりかえり

sourceRectAtTime().heightはバウンディングボックスの高さを取得
sourceRectAtTime().width
はバウンディングボックスの幅を取得
ifは条件を分岐するために使う
ドロップダウンメニュー制御は作成したドロップダウンメニューの選択に基づいて、エクスプレッションを使ってレイヤーのプロパティを制御できる。
レイヤー制御は選択したレイヤーに基づいて、エクスプレッションを使ってレイヤーのプロパティを制御できる。

スクリプトのダウンロードと使い方

こちらが今回紹介したエクスプレッションをワンクリックで適用するためのスクリプトになります。
わざわざ打ち込まなくても簡単にエフェクトとエクスプレッションが適用されるので、どんどん使ってくださいね。下記にてダウンロードが可能です。

ここから先は

199字 / 2画像 / 1ファイル

¥ 300

この記事が気に入ったらチップで応援してみませんか?