多重組み時のコンポ構成

はじめに

多重組み(複数組み?)時のベストなコンポ構成を考える。

本来存在してはいけないアイツ。出会う機会は減ってきているが、未だ出くわすこともある。

シート付けの段階でどうすればいいのかわからなくなってタイムリマップを使わず昔ながらの「階段状」に並べるということをしがち。100近いレイヤーになることも。

シート修正を考えても、事故を防ぐためできるだけ普段と同じ使い勝手(タイムリマップでシートが打てる)の状態に持っていきたい。

階段状にするのは時間もかかるし、修正もめんどくさくてメリットがない

目標

タイムシートを見たままタイムリマップを打ち込める状態にもっていく。

タイムリマップを使わず、フッテージで読み込んで階段状にするのは非効率でかつ事故の温床にしかならないからこれは避ける。

連番シーケンス代わりのコンポを作成

タイムリマップを使うということで、普段と同じ連番シーケンス状態に持っていきたい。ただ、多重組み時のファイル名は次のような感じになっていることが多い。

多重組み時のファイル名

この状態では連番シーケンスとして読み込んでくれない。ファイル名の変更は別の部署も絡んでくるし諦める。なので、フッテージとしてファイルを読み込んだ後、連番シーケンスと同じ状態のコンポを作成する方針に変える。

目標は「Bセルを通常の連番シーケンスで読み込んだ時と同じ挙動をするコンポ」の作成。といっても難しくない。今回は口パクでBはB0001-B0003まで3枚あるので「長さが3コマのコンポ」が作成できれば、あとはいつもどおりのタイムリマップで打てる。

問題はAセルとの組み合わせがあるということ。ファイル名をよく見てみる。B0001やB0003が複数あってややこしそうに見えるが、Aに注目してグループ分けして見てみる。

Aセル毎にグループ分けしてみる

先程までややこしく見えていたが、同じAセルごとにグループ化すると、同じグループ内に同じBセル番号は存在しないことがわかる。「何を言っているんだ、当たり前だろう」とお思いの方もいるだろうが、前の画像のようにエクスプローラでの並びを見ると案外気づきにくい。特に新人は。

このグループごとにプリコンポしてしまえば、タイムリマップはいつもどおりに打てそうなことに気づく。と同時にBセルだけで複数のコンポが必要になることにも気づく。

では、実際にコンポを作成する。

先程のグループごとにコンポを作成する。4つのグループがあったので、4コンポ作る。コンポのデュレーションはすべて3コマ。サイズはもちろん素材に合わせて。それぞれのB0001~B0003をそれぞれ1コマ目~3コマ目に配置する。対応する素材がない場合は、空セルにする。

それぞれのBセルコンポの内部はこんな感じ
4つのBコンポを配置した

Bセルのコンポ4つをAセルと同じ場所に配置し、タイムリマップを有効にした。この状態ですべてのBセルに対して、いつも通りタイムリマップが打てる。1を入れれば必ずB0001が表示されるし、2を入れれば必ずB0002が表示される。やった!!

ただし、まだAセルとの絡みを加味していない。しかし、ここまでくれば後は大したことない。

Aセルの値に連動して、それぞれのBセルが表示/非表示になればいいのである。例えば、レイヤー#4「B[0001-0003]_A07」はAセルが7以外の時、不透明度=0にしてしまえばいい。

「不透明度」に書くエクスプレッション

世の中では空セルを表現するのにブラインドで隠すやり方も主流であるが、個人的には不透明度でやるほうが好きなので、今回は不透明度にする。

「Aセルが〇〇のときだけ表示する」という風にしたいので、エクスプレッションの内容としては、

「Aセルのタイムリマップが〇〇の時は不透明度が100、それ以外のときは0」

となる。間違ってはいないが、しかしこれでは不透明度が 100 or 0 に固定されてしまい、任意の値を取ることはできない。なので、もすこし賢く書くと、

「Aセルのタイムリマップが〇〇の時は不透明度が『本来の値』、それ以外のときは0」

となる。『本来の値』というのは、エクスプレッション適用前の値ということ。エクスプレッションを設定すると、値はいじれないと思いがちだが、各プロパティはエクスプレッションの結果とは別に、自分自身の値(キーフレーム)は保持している。エクスプレッション内で「value」と書くことで、エクスプレッション適用前の値を取得できる。(「thisProperty」でも同様だが「value」と書くほうが文字数も少なくて簡単)

それを踏まえるとこうなる

(thisComp.layer("pre-A[0001-0010]").timeRemap == 8/24)? value : 0;

8の部分は8コマ目という意味ではない。1コマ目はAfterEffects内では「0秒」なので0/24。なので8/24と書いてあると実際には9コマ目。

でもこれだと正確にいかない時がある。thisComp.layer("pre-A[0001-0010]").timeRemap == 8/24の部分は「秒」で比較しているが、小数点以下での比較で誤差が出る時がある。なので、コマ数に直して整数で比較したほうが無難。

(Math.round(thisComp.layer("pre-A[0001-0010]").timeRemap*24) == 8)? value : 0;

とする。24を掛けて四捨五入(Math.round)することでコマ数(整数)に変換した。

先程書いたように、この「8」は「9コマ目」を意味する。これがややこしいと思うならこうすれば良い。

(Math.round(thisComp.layer("pre-A[0001-0010]").timeRemap*24+1) == 9)? value : 0;

== の両辺に+1した。これで「Aセルが9の時、本来の値を取って、それ以外のときは0」というエクスプレッションが書けた。

フレームレートを24以外にも対応させたいなら、コンポのフレームレートを参照すれば良い。注意したいのは、AfterEffectsのエクスプレッションではフレームレートを直に取得できないということ(スクリプトなら可)。ただし、1フレームあたりの秒数(frameDuration)は取得可。なのでこの関係式が成立する。

フレームレート= 1/frameDuration

これはアニメ関係なく、映像の常識。フレームレートというのは1秒に何枚の画像を見せるかということなので、24フレの場合、1枚あたりの長さは1/24であるのは明白。

frameDurationの逆数がフレームレートなので、

(Math.round(thisComp.layer("pre-A[0001-0010]").timeRemap/thisComp.frameDuration)+1 == 9)? value : 0;

掛け算(*)から割り算(/)に変わったのに注意したい。

これで、Bセルが参照するレイヤー(Aセル)のタイムリマップの値によって、見えたり消えたりするようになった。

シート修正を見越して一元管理する

後はBセルにタイムリマップをいつものよう打てばいいのだが、Bセルのレイヤーが4つあるので、シート修正するときに4つのレイヤーを忘れることなくきちんと修正しないといけない。同じ値を何ヶ所にも適用するというのは賢くない。いつか絶対にミスる。一元管理すべき。なので、実際タイムリマップを打ち込むのは1つのレイヤーだけにして、残りはそれを参照するようにする。単純にピックウィップ(ぐるぐる渦巻きアイコンのやつ)で引っ張ればいい。

これでどうだろう。レイヤーこそ増えたものの、タイムリマップを入力するのはいつも通りAセルとBセルの2ヶ所のみ。階段状にしていたときは「Aが〇〇でBが△△だから、えっと...このセルを置いて...次のフレームでBは変わらないけど、Aセルが変わったから...」と毎フレーム考えていたのがバカらしい。二度とやりたくない。

まとめ

流れをまとめると、

  1. シーケンスではなくフッテージとして読み込み

  2. 組みに絡むセル番号が同じもの同士で連番シーケンス風コンポを作成

  3. 不透明度にエクスプレッションを適用して、必要なときだけ見えるようにする

  4. いつもどおり、タイムシートで見たままタイムリマップを打ち込む(←これがやりたかった!!)

最初にも書いたが、多重組みに出会う機会は減ってきてはいるが、いざ現れたときに対処法を知らないと困る。

使う機会がないことを祈りつつ、ぜひ覚えておきたい。