【AfterEffects】デフォルトレンズフレアwwwを3D対応させてみた【aep配布】はCS4以上でしたが、
CS3以下の人にも準備するレイヤーやエフェクト、コピペするエクスプレッションなど貼っていきたいと思います。
1.準備レイヤー
適当な大きさ(私は1280 x 720)のコンポジションを作ります。
次に上の画像のように
カメラを1つ、ヌルレイヤーを4つ、ライトレイヤー(ポイント)を1つ、平面レイヤーを2つ用意します。
次に並び替えて名前を付けます。
上から
1.カメラ 1
(名前はそのままです)
2.ヌル_いじるな2
(3Dレイヤー)
3.ヌル_いじるな1
(3Dレイヤー)
4.レンズフレア制御
5.Light_1
6.null_Lensflare_1
(3Dレイヤー)
7.LensFlare_2
8.LensFlare_1
とします。
あとは「ヌル_いじるな1」「ヌル_いじるな2」「レンズフレア制御」を非表示にし、
「LensFlare_1」「LensFlare_2」を加算にします。
2.エフェクトの追加とエクスプレッションのコピペ
■ヌル_いじるな1
まずは「ヌル_いじるな1」のトランスフォームにエクスプレッションを書いていきます。
・アンカーポイント
try{ CA = thisComp.activeCamera.transform.pointOfInterest; CP = thisComp.activeCamera.transform.position; z = length(CA, CP); [0, 0, z] } catch(err) { value; }
・位置
try{ thisComp.activeCamera.transform.position } catch(err) { value }
・方向
try{ CA = thisComp.activeCamera.transform.pointOfInterest; CP = thisComp.activeCamera.transform.position; r = lookAt(CA, CP); } catch(err) { value; }
・X回転
try { -thisComp.activeCamera.transform.xRotation } catch(err) { value }
・Y回転
try { thisComp.activeCamera.transform.yRotation } catch(err) { value }
・Z回転
try { thisComp.activeCamera.transform.zRotation } catch(err) { value }
ふだん見慣れないエクスプレッションの解説です。
・activeCamera
これはアクティブなカメラを参照するエクスプレッションです。
カメラを何個も置いても一番上のカメラレイヤーの結果を持ってきたり、
表示しているカメラレイヤーの結果を持ってきています。
ただし、カメラが一つも無かったり、全部非表示だと
カメラねぇ~ぞ!(#゚Д゚)ゴルァ!!
ってAEが怒ります。
そこで次のエクスプレッションを使っています。
・try {} catch(err) {}
これは try{} の中に記述した結果にエラーがなければ try{} の中の結果を反映させます。
もし、try{} の中の記述にエラーがあれば catch(err){} の中に記述した結果を反映させます。
ですので、ここのトランスフォームに記述したエクスプレッションは、
カメラが有るときはカメラの値を反映させて、
カメラが無かったら、value(キーフレームの値)を反映させるエクスプレッションになっています。
これはAdobeのヘルプにも書いてありますので、
もっと詳しく知りたい方は下のリンクからどうぞ。
エクスプレッションの例:カメラからの距離に応じて 3D レイヤーの不透明度をフェードする
・length(point1, point2)
これはアンカーポイントで使いました。
length(point1, point2)はpoint1とpoint2の距離を出してくれます。
ここではカメラの目標点とカメラの位置がどれくらい離れているかを出しています。
そしてその距離をz座標に入れています。
何をしたかと言うのを、
次のエクスプレッションの解説と合わせてそのときに説明します。
・lookAt(point1, point2)
これは方向に書きましたね。
簡単にいえば2つの座標から角度を求めています。
今はカメラの目標点とカメラの位置の角度を出しています。
これによって3.length(point1, point2)で書いたエクスプレッションが生きてきます。
方向で常にカメラがカメラの目標点を見てくれるので、
カメラの目標点や位置の数値を変えても常にアンカーポイントがカメラの目標点に追従してくれます。
ここで方向にエクスプレッションを使っているから何度も言っていますが、
カメラの方向は今回対応していません(`;ω;´)
って言ってます。
lookAtの解説は「animeの道具箱」さんのところで動画付きで凄くわかりやすく解説されています。
下のリンクから行けます。
目標点に向ける
■ヌル_いじるな2
ここをやる前に、カメラのトランスフォームをいじった人はトランスフォームをリセットしてください。
ここでやることは「ヌル_いじるな2」を「ヌル_いじるな1」の子にするだけです。
無駄に一枚レイヤーを使って何をしているかというと、
後ほど「LensFlare_1」のトランスフォームの不透明度でカメラの目標点の座標を知るためにこんなことをしています。
親子関係はとっても便利な機能ですが、
子の座標をそのままでは求めることはできません。
そこで使うのがtoWorld()というものです。
これは3D空間上にある子レイヤーのアンカーポイントなどの座標を求めることができます。
■レンズフレア制御
次は「レンズフレア制御」レイヤーにエフェクトの「スライダ制御」をかけます。
「スライダ制御」の名前を「レンズフレアアウト位置」に変えます。
値を「5000」としておきましょう。
これは後ほどレンズフレアの明るさに関わってくるものです。
カメラとライトの距離がどれほど離れたら明るさを最小にするかというエクスプレッションに用います。
全部の入力が終わったら最後にいじってみてください。
■Light_1
次は「Light_1」のレイヤーの位置に下記のエクスプレッションをコピペします。
・位置
ns = name.slice(6, 20); thisComp.layer("null_Lensflare_" + ns).transform.position
name.slice()は以前【AfterEffects】name.sliceとvalueAtTime【エクスプレッション】でやりましたので、割愛します。
thisComp~以降が普段と違う書き方になっています。
普段であれば、
thisComp.layer("null_Lensflare_1").transform.position
と言う感じで、直接レイヤー名を指定していますが、
今回のデフォルトレンズフレアwwwはレイヤーを複製してレンズフレアを増やしていくので直接指定だと毎回エクスプレッションに書いたレイヤー名を変えなければ使えません。
そこでname.slice()でレイヤー名の文字列(数字)を持ってきて、
『文字列(null_Lensflare_) + 文字列(1)』で、
レイヤー名『null_Lensflare_1』を作っています。
■null_Lensflare_1
ここにはエフェクトの「スライダ制御」を2つ入れて名前を「レンズフレア明るさ」「明るさ自動調節」変え、
「明るさ自動調節」にエクスプレッションをコピペします。
・レンズフレア明るさ
スライダ:100
・明るさ自動調節
スライダ
startFade = 0; endFade = thisComp.layer("レンズフレア制御").effect("レンズフレアアウト位置")("スライダ"); try{ C = thisComp.activeCamera.toWorld([0,0,0]); A = 0; P = toWorld(anchorPoint); d = length(C,P); }catch(err) { A = 1; } if(A == 0){linear(d, startFade, endFade, 150, 5)} else {100}
これもアクティブなカメラの位置と「null_Lensflare_1」の位置の距離によって明るさを変えているエクスプレッションです。
「C」でアクティブなカメラの位置を取得し、
「P」で「null_Lensflare_1」の位置を取得し、
「d」でlength()を使って距離を求めいています。
・if(){}else{}
そしてここではif文を使って条件を追加しています。
if文では比較演算子を使って条件を書きます。
AがB未満
A < B
AがB以下
A <= B
AがBを超える
A > B
AがB以上
A >= B
AとBが同じ
A == B
もし(if)AがB以上であれば、0を出力します。それ以外(else)であれば1を出力します。
って言うのをエクスプレッションで書くと、
if(A >= B){0} else {1}
という感じになります。
ですので今はアクティブなカメラがあると
A = 0
なので
{linear(d, startFade, endFade, 150, 5)}
の方を使います。(linear(t,a,b,A,B)は次にやります)
アクティブなカメラがない場合は
A = 1
なので
{100}
になります。
・linear(t,a,b,A,B)
linear(t,a,b,A,B)は例えばtに100と入力、aに0と入力、bに500、Aに0と入力、Bに1000と入力します。
linear(100, 0, 500, 0, 1000)
出力される数字は「200」が出力されます。
上記の条件でtを500とすると
linear(500, 0, 500, 0, 1000)
出力される数字は「1000」となります。
簡単にいえばa、bでtから入力される最小と最大値を決めて、
aの最小値に対してAの最小値が適応され、
bの最大値に対してBの最大値が適応される感じです。
言葉で説明するのが凄く難しいですすみません(´・ω・`)
でも大丈夫!
これも「animeの道具箱」さんでわかりやすく解説されています(`・ω・´)
補間
■LensFlare_1
「LensFlare_1」のレイヤーに次のエフェクトをかけていきます。
1.モーションタイル
2.レンズフレア
3.レベル
4.円
5.CC Radial Blur
6.色相/彩度
7.グロー
■1.モーションタイル
モーションタイルは「出力幅」「出力高さ」を「150」にしてください。
後にかける「CC Radial Blur」が画面端まで来ると、
ブラーが内側に入って黒くなってしまうのを防ぐためです。
ちなみにこれがモーションタイル無しバージョンです。
■2.レンズフレア
おまたせ(`・ω・´)
主役登場ですわ(o´∀`o)
ああ^~レンズフレアいいっすね^~(世界一のスマイル
以下のエクスプレッションをコピペしてください。
・光源の位置
ns1 = name.slice(10, 20); ns = Math.ceil(ns1 / 2); thisComp.layer("null_Lensflare_" + ns).toComp(thisComp.layer("null_Lensflare_" + ns).anchorPoint);
・フレアの明るさ
ns1 = name.slice(10, 20); ns = Math.ceil(ns1 / 2); thisComp.layer("null_Lensflare_" + ns).effect("明るさ自動調節")("スライダ") * (thisComp.layer("null_Lensflare_" + ns).effect("レンズフレア明るさ")("スライダ") / 100)
・Math.ceil(ns1 / 2)
ここでは普段見ないname.slice()の使い方をしています。
一手間加えている訳は、
今回レンズフレアをかけたレイヤーを2つ使って少しテイストの違うレンズフレアを組み合わせて作っています。
「LensFlare_1」「LensFlare_2」「null_Lensflare_1」を複製すると当然
「LensFlare_3」「LensFlare_4」「null_Lensflare_2」になります。
今「LensFlare_3」の光源の位置は「null_Lensflare_2」の位置を参照したいのですが、
普段通り
ns = name.slice(10, 20); thisComp.layer("null_Lensflare_" + ns).toComp(thisComp.layer("null_Lensflare_" + ns).anchorPoint);
書いていると「null_Lensflare_3」を参照しようとしてAEたんに
そんなレイヤーねぇぞ(#゚Д゚)ゴルァ!!
って怒られてしまいます。
そこで
ns = Math.ceil(ns1 / 2);
と書くことで
ns = Math.ceil(3 / 2) = Math.ceil(1.5) = 2
※Math.ceilは繰り上げの関数です。
【AfterEffects】seedRandomとMath.ceil、Math.floor、Math.round【エクスプレッション】でやりました。
他にもMath.floor(切り下げ)Math.round(四捨五入)などあります。
ns = 2; thisComp.layer("null_Lensflare_" + 2).toComp(thisComp.layer("null_Lensflare_" + 2).anchorPoint);
となってくれます。
・toComp()
toComp()は3D空間にあるアンカーポイントなどの座標を2D空間に変換してくれます。
今「null_Lensflare_1」は3DレイヤーのスイッチがONなので3D空間に対応しています。
でもレンズフレアの光源の位置は2Dです。
「null_Lensflare_1」の位置Zに「2000」などと入力し奥に持って行って、
位置Yを「-100」としても「null_Lensflare_1」はコンポジションの枠内に収まっています。
でも、2Dのレンズフレアの光源の位置Yに「-100」と入力するとコンポジションの枠外に行ってしまいます。
困ったぞ(´・ω・`)
3Dのときは奥に行って上に上がったから見えてたけど、
2Dだと奥がないからその分を何かで計算しなきゃいけない(´・ω・`)
そんなときtoComp()を使います。
toComp()のときは基本的にアンカーポイントの座標の位置を取得するのがノーマルみたいで、
thisComp.layer("null_Lensflare_" + ns).toComp(thisComp.layer("null_Lensflare_" + ns).anchorPoint);
最後はanchorPointとすると良いみたいです。
私はよくpositionを指定してしまって、
メッチャズレるんだけど(; ・`ω・´)
って今でもあります。
親子関係の子レイヤーの座標も取得できるので、
結構使う機会があります。
あとは「レンズの種類」を3種類と少ないですがこの中から好きなのを選ぶだけです。
■3.レベル
レンズフレアを2枚使って加算をかけるので、「白出力レベル」を下げるだけでいいです。
ぶっちゃけここは適当です:(;゙゚’ω゚’):
それっぽくできたらいいかなぁ~っていう私のダメなところですw
■4.円
下記のエクスプレッションと数値の入力をお願いします。
・中心
ns1 = name.slice(10, 20); ns = Math.ceil(ns1 / 2); thisComp.layer("null_Lensflare_" + ns).toComp(thisComp.layer("null_Lensflare_" + ns).anchorPoint);
・半径:3
・ぼかし
エッジの外側のぼかし:4
・不透明度
a1 = effect("レンズフレア")("フレアの明るさ"); if(a1 &amp;amp;gt; 10){linear(a1 ,10 , 20, 100, 0)} else {linear(a1 ,0 , 5, 0, 100)};
・描画モード:加算
この円がかなりいい仕事をしています。
ライトがカメラから離れれば離れるほど明るさがぼけてきます。
そこで、そんな場合は円に助けてもらおう!
ってことで円を使っています。
レンズフレアの明るさが「10超過」のときは「20」までは円の不透明度を「0」、
「10」になると不透明度が「100」になるようにif文で書きます。
それ以外(10以下)のときは、レンズフレアの明るさが「5」のときは円の不透明度を「100」、
「0」になると不透明度が「0」となるようにしています。
■5.CC Radial Blur
こちらも下記のようにエクスプレッションのコピペと入力をお願いします。
・Type:Straight Zoom
・Amount
a1 = effect("レンズフレア")("フレアの明るさ"); b1 = linear(a1 ,10 , 100, 10, 30);
・Center
x1 = effect("レンズフレア")("光源の位置")[0]; y1 = effect("レンズフレア")("光源の位置")[1]; w = thisComp.width / 2; h = thisComp.height / 2; x = linear(x1, w - 50, w + 50, -50, 50) + x1; y = linear(y1, h - 50, h + 50, -50, 50) + y1 value + [x, y]
「Center」が少し難しそうですが、
光源の位置が右寄りならCenterが光源の中心よりMax50右寄りになるっていうエクスプレッションを書いています。
「CC Radial Blur」の「Center」を光源の位置に対して少しずらしてあげるとかっこよく見えます。
■6.色相/彩度
ここは「マスターの色相」を適当に回して色を変えてるだけです(小学生並みの説明
■7.グロー
下記のエクスプレッションをコピペしてください。
・グローしきい値
a1 = effect("レンズフレア")("フレアの明るさ"); b1 = linear(a1 ,10 , 100, 70, 100);
・グロー半径
a1 = effect("レンズフレア")("フレアの明るさ"); b1 = linear(a1 ,10 , 100, 30, 10);
・グロー強度
a1 = effect("レンズフレア")("フレアの明るさ"); b1 = linear(a1 ,10 , 100, 1, 0);
ここもカメラとライトの距離が離れるとボケボケにならないように、
グローを強くしたり弱くしたりで調節しています。
■8.トランスフォームの不透明度
最後はトランスフォームの不透明度に下記のエクスプレッションをコピペしてください。
・不透明度
try{ ca = thisComp.layer("ヌル_いじるな2").toWorld(thisComp.layer("ヌル_いじるな2").transform.anchorPoint); cp = thisComp.activeCamera.transform.position; ns1 = name.slice(10, 20); ns = Math.ceil(ns1 / 2); na = thisComp.layer("null_Lensflare_" + ns).transform.position; t = length(ca, na); a = length(ca, cp); b = length(cp, na); s1 = Math.atan((a*a+b*b-t*t)/2*a*b); if(s1 &amp;amp;lt; 0){0} else {100} } catch(err) { 100; }
ここで何をしているのかというと、
図で見るとこんな事をしています。
最初に「ヌル_いじるな2」でカメラの目標点の座標(方向には対応していない(´・ω・`))を求めることができました。
目標点 = a
カメラ = c
ライト = l
としたとき
∠acl の角度が90°以下ならレンズフレアが見えているので、
不透明度は「100」です。
90°以上なら不透明度を「0」にしています。
正直このエクスプレッションを書いた自分が、
なんでうまく行ったのかよくわかっていません(´・ω・`)
できたからいっか(*´∀`*)
くらいにしか思っていません。。。いいんだろうか
気持ちを切り替えてやっと次で最後のレイヤーです。
もう少しです!
頑張りましょう(`・ω・´)
■LensFlare_2
基本的に「LensFlare_1」から「円」を無くしたエフェクトを全部使いますので、
「LensFlare_1」のエフェクトを全部コピペして「円」だけを消します。
トランスフォームの「不透明度」もエクスプレッションをコピペするのを忘れないで下さい。
ここからは「LensFlare_1」とエクスプレッションが違っていたり、
エフェクトの入力値が違うところだけを紹介します。
・レンズフレア
レンズの種類:105mm
・レベル
白出力レベル:213
・CC Radial Blur
Amound
a1 = effect("レンズフレア")("フレアの明るさ"); b1 = linear(a1 ,10 , 100, 30, 68);
・グロー
しきい値
a1 = effect("レンズフレア")("フレアの明るさ"); b1 = linear(a1 ,10 , 100, 40, 100);
グロー半径
a1 = effect("レンズフレア")("フレアの明るさ"); b1 = linear(a1 ,10 , 100, 60, 10);
こんな感じです。
あとは「Light_1」「null_Lensflare_1」「LensFlare_2」「LensFlare_1」を選択して、
Ctrl + Dで複製してください。
複製後は下の画像のようにラベルの色を変えてあげるとわかりやすいかもしれません。
カメラを新規で追加しても、
activeCameraのおかげで新規のカメラに対応してくれます。
ただし「ヌル_いじるな」をいじったら保証はできません(´・ω・`)
CS3以下用のはこれで終わりです。
日本語はおかしいのは昔からです。
最近は日本人との意思疎通も難しいくらいおかしくなって、
よく同僚に「日本語が変だね」って言われるくらいです。
そこは目をつぶって欲しいのですが、
私の方でミスってることもありますので、
この通りやってもできない(#゚Д゚)ゴルァ!!って方はコメントいただけると助かります。
以上です。
それでは良いAELifeを(`・ω・´)ゞ