Math.sin()を手に馴染ませる

前回紹介したMath.sin()関数は、10数年前からAfter Effectsに実装されているものの、少なくとも私は、たまに使っては忘れ‥‥を繰り返し、すぐにsinとcosの関係性を忘れます。毎日のように使っていれば覚えたまま忘れないんでしょうけど、中々に出番の少ない関数なので、必要になるたびに記憶から掘り出す始末です。

ちょっと余談ですが、円運動というのは、真正面から見て等速に動いていても、横から見るといわゆる「両端詰め」の動きに見えます。アニメではよく両端詰めの動きが出てきますが、そうした多くの動きは関節(や接合部)を基点とした円運動の変形でもあります。もちろん、すべての動きがそうであるわけではないですが、例えば、力を抜いた腕がフラフラ動くのは、変形した円運動の典型と言えます。円が変形すれば楕円や8の字になり、そこにエネルギーの加速減速が加味されれば、いわゆるリアクションをたっぷり含んだキャラの動きが出来上がります。‥‥アニメーターの方なら、思い当たるのではないでしょうか。

After Effectsでは、そうした円運動をプログラム文で表現することができます。エクスプレッションという「プチ・プログラム」をレイヤーの位置や回転や不透明度に適用することで、規則的(不規則な動きも表現できますが、とりあえず)な動きをキーフレーム無しで表現することが可能です。

例えば、レイヤーの位置に、

value+[time*100,0];

‥‥と書き込めば、1秒あたり100ピクセル、右に向かってレイヤーが移動する動きを作れます。

この機能を利用して、Math.sin()、Math.cos()、そして円周率のMath.PIを用いれば、様々な円運動を作り出せます。以下は、基本的なバリエーションです。


*1080p60で再生すると、滑らかな2K60pの動きを見れます。
*半径を「486px」にしているのは、画面内に収まりつつ、54px(1080/2/10=54)間隔のグリッドに綺麗に接するためです。

X軸とY軸のそれぞれの動きが組み合わさると円の軌道へと変化する様子は、ビジュアルで見れば、なるほど‥‥と感覚的に納得できるのではないでしょうか。円運動なんて、映像制作に全く関係ない人でも、日常で見慣れているありふれた要素ですが、その成り立ちを明確に認識しているのは、まさにプロの映像制作者の特質と言えます。

上図のMath.sin(),cos()の使い方を覚えておけば、After Effectsにおいて規則的な円運動で困ることは無くなります。‥‥と、自分の忘備録代わりに書いておこう。

ちなみに、頭脳パズル的な考えで、8の字の動きもエクスプレッションで表現してみました。8の字を描くためには、どのような軌跡を辿れば良いのか、プログラム文でパズルを解いてみます。



簡単なのは、左側の上下に軌道が偏った8の字のタイプです。意外に難しかったのは、右側の正円2つを組み合わせたタイプで、上下の往復を表現するのに手間取りました。

こうした円運動の動きは、ランプの点滅などにも応用できますし、自分流のwiggle(揺れ)を作る元ネタにもできます。

素材待ちの暇つぶしに、どうぞ。

ちなみにMath.PI

ちなみに、前回のテスト映像で左右に往復する球の動きは、sin関数を使っております。sin()なんてほとんど使わないから、すぐ忘れるんですけど、アニメ的に言えば、要は円運動に活用する関数です。

ただ、そのままですとタイミングが扱いにくいので、時間に円周率「Math.PI」をかけてやって、1周期1秒へと標準化して使うのが良いです。

以下のようなプログラム文をエクスプレッションに適用するだけで、レイヤーを左右に往復させる動きを作れます。

val=Math.sin(time*Math.PI)*(thisComp.width/2);
value+[val,0];


もし、球を画面中央からスタートさせず、右端か左端からスタートさせたい場合は、timeに0.5をオフセットしてやるだけです。例えば、timeを(time+0.5)のように。‥‥またはsin(サイン)をcos(コサイン)に変えても同じ結果が得られます。

「thisComp.width/2」は、画面全体を往復するために、画面の横幅を取得して2で割っているのです。ここを自分の好きな数字に置き換えれば、そのように動きが変更されます。

理屈は簡単。でも、プログラム自体を避け続けていると、妙に難しく感じてしまうものです。

私は手ぶれや画面ブレなどの生っぽい動きにはエクスプレッションの関数(randomやwiggleなど)は使わず、自分の動きの感性を反映させるためにあえてキーフレームを手打ちして、尺が長い場合はloopOut()などで延長しますが、コンピュータの得意な機械的な動き=算術が活きる動きの場合は、sin()などのJavaScript Mathを用います。

使い勝手は人それぞれだとは思いますが、私の場合は、周期的な円運動や振り子の往復の場合は、エクスプレッションで対応することが多いです。

After Effectsのキャッシュ問題

After Effectsでメモリを大量に消費するコンポジションをレンダリングすると、キャッシュが混乱してイメージキャッシュの相違が発生することがあります。

「After Effectsで作画する」ような重い処理を、さらに積み重ねて極度に重くした際に、発生しやすくなります。

障害例は「エフェクト(プラグイン)が外れて見える」「存在しない絵が存在する」など、まさにキャッシュの混乱による症状です。

例えば、レイヤーを全て非表示にしても、絵が画面に残る‥‥などの奇怪な(理屈で説明できるから「怪」ではないんですが)現象が発生します。もちろん、シャイレイヤーが隠れていた‥‥なんてオチではないですヨ。

障害を除去するのは、「全てのキャッシュをクリアする」コマンドを実行すればOKです。200GBとかヤバい量のキャッシュを、After Effectsは平然と溜め込みますからね‥‥。

この障害が怖いのは、「いつからキャッシュのゴーストが悪さをしているのか」、作業をしている最中では気づきにくい点です。After Effectsの動作上の不具合ですが、まあ、いつ解消されるかもわからん障害ですから、今の所は、定期的にキャッシュをクリアして、混乱しているであろうバッファを手動でリフレッシュするのが簡単な対処法です。

4Kの「デジタルアニメーション」のような、今のマシンにとって負担の大きいレンダリングを実行する直前に、キャッシュをクリアしておくのが確実です。

ちなみに、After Effectsの隠し環境設定の「シークレット環境設定」を使えば、レイヤーキャッシュを無効にできるんですが、不具合が出るのは内容が重い時だけなので、一緒くたに無効にすることはないですから、特にONにはしておりません。

Expメモ:loopのきかないプロパティをvalueAtTime()で

アマチュア・学生向けの教材を作る最中、loop関数の適用できないプロパティをループしたい場合、どのようにすれば良いか、ふとマジメに考えてみました。エクスプレッションで効率化を図れると言いながら、トーンカーブやメッシュワープで簡単に頓挫するのもブザマなので‥‥。

loop関数に頼らなくとも、現在時間をリピート区間で「%(割り算の余り)」すれば簡単にできそうだ‥‥ということで作ってみました。まあ、古典的な方法スね。

valueAtTime(time%key(numKeys).time);

これならば、メッシュワープのディストーションメッシュにも適用できます。実際、これでとりあえず、うまくできました。

loopOut("cycle"); ‥‥とほぼ似た動作になりますが、1つだけ問題があります。

上記エクスプレッションだと、レイヤー開始時間のオフセットがきかない‥‥のです。

まあ、考えてみれば、timeを何の加工なしに使うやり方なんて、コンポジション先頭からループの開始時点が始まってなければ、簡単に破綻する書き方です。使い勝手がよくありません。

レイヤーのstartTimeを使って、レイヤーをタイムライン上で右左に位置をずらしても通用する書き方だと‥‥

valueAtTime((time-startTime)%(key(numKeys).time-key(1).time)+startTime);

‥‥となります。できれば「loopOut("cycle"); 」くらいに、暗記できる短い命令文にしたかったのですが、私の知恵では無理です。1行で収めるのがやっとです。

これですと、まさにloopOut("cycle")と同じ使い方が可能です。ただ、モーションブラーではtimeが先頭に戻る瞬間に変な絵が出ちゃうかも知れません。とりあえず、私の試した範囲では大丈夫でしたが‥‥。
*注)0,10,20,30,40,50→0‥‥みたいなサイクルですと、50から0に戻る際に、モーレツなモーションブラーがかかる場合があります。これはキーフレームのコピペでも同じことではありますが。

ちなみに、key(numKeys)、つまりラストのキーフレームの値は、開始点のキーフレームと同じ値でないと、うまくいきません‥‥のは、loopOut()も同じすネ。また、キーフレームの繰り返しを実現するエクスプレッションなので当然ではありますが、適用したいプロパティにキーフレームが最低2個以上存在しないとエラーになります。

そんなこんなで、CC2015のエクスプレッション言語メニューを久々に眺めて回りましたが、‥‥あれれ、昔より要素が増えて、使いやすくなってます‥‥かね? 単に昔の私が幼稚だっただけかな‥‥。まあ、プログラムって、構造を理解するまでは迷宮みたいなものですもんネ。

注記:漠然とkeyやstartTimeなどと書いた場合、暗黙のうちに「me」「this」が対象となります。thisLayer, thisCompなんて書かなくても良いわけです。使い回しが効いて、短い文のエクスプレッションを書くには、暗黙の対象をイメージするのが良いスね。

トーンカーブの中割り

After Effectsのトーンカーブでキーフレームを複数打って、キーフレーム間を中割りさせようとすると、期待通りの結果にならない事があります。つい最近、実写作品の締め切り当日に発見しました。

もの凄く微妙なトーンカーブ変化を、長い尺をかけて中割りさせると、トーンの段階変化がジャンプする事があります。

期待する結果としては、無段階に推移してほしいわけですが、実際の結果は、1秒に1回変化するような大雑把な段階変化となり、その大雑把さが目視できてしまいます。

完成後のムービーを確認した当初、ガス素材のレイヤーでも外れたか?‥‥と思ったのですが、色々と検査したところ、トーンカーブが犯人だった事がわかりました。

30〜40秒のカットをニジリ〜っとトーンを締めていく内容で、そのトーンの締めをトーンカーブのカーブ変化で操作していたのですが、それがNG。カーブ変化は微妙過ぎると、中割りが雑になるようです。

各色16bitの色深度において、そのような大雑把なトーン変化が起こるとは考えにくいので、方針を変えて「あらかじめトーンを絞った調整レイヤーの不透明度を操作する」方法に切り替えたら、期待通りの「滑らかなトーン変化」が得られました。

こういう障害事例って、締め切り間際に発覚しがちなのはナゼだろう。

だから、例えレンダリングが1時間で終わる見込みであっても、「あと1時間で終わります」なんて告知してはダメなんですよネ。そのレンダリングが成功する「完全な保証」は無いわけで、一方の受け取る側は「1時間後に必ず受け取れる」と期待するわけです。

私は今までの作業経験の中で何回か、「まさか、このタイミングでそのトラブル!?」という事を経験してきたので、今回の実写も2シーケンスを最短で2時間で出せる見込みではあったものの、一晩挟んで、翌朝の編集さん渡しにしてもらいました。‥‥で、幸い(?)にも、その読みが当たり、普段だったら目にしないような珍しいエラーに対処して、次の行程へと受け渡す事ができました。

危ない橋が待ち構えている時ほど(プロジェクト全体のバッファが少ないから危ない橋ができるわけですが)、せめて内部的なバッファを用意しておかないと‥‥ですネ。

Boldの自動尺表示の誤差

今日、電話で「実際の尺と、ボールド(スレート)の尺表示が1コマズレる」的な話を知人から尋ねられたのですが、「尺が6秒前後でも発生する」と聞いて、エクスプレッションのアレだな‥‥とピンときました。23.976のアレではなく。

エクスプレッションのtimeToFrames()だかの引数のうち、「duration=true」にしておかないと、尺が1コマ少なく表示される事があります。私も数年前、他社から渡されたひな形プロジェクトで同じトラブルに遭遇して、エクスプレッションのコードを書き換えた事があるので、覚えとるのです。

しかしなんだ。今でもそういうミスを含んだエクスプレッションが出回っとるのね。10年近く前から見ているような気もする。

尺を丸ごとtimeToFramesにブっこむのも楽なんですが、整数で割った余りを計算するやり方だったら、duration=falseでも1コマズレなかった記憶があるのです‥‥が、随分昔の話なので覚えていません。

* * *

timeToFrames()とは違う話題ですが、24fpsや30fpsって、迂闊に小数点で計算すると、0.333333333334とかの誤差で期待する結果にならない事があって、昔は外部のプログラムとAfter Effectsの「小数点のやりとり」で色々と工夫していました。今でもAfter Effectsの仕様が昔と同じならば‥‥ですが、After Effectsは基本「floor」、つまり0.00000001でも足りないと切り捨てる仕様のようです。11.9999999フレームは、11フレームになるので、12.00000001にしといた方がトラブルを回避できるんですよネ。

アニメのタイムシートに馴れちゃうと、コマで勘定する事が多くなりますが、After Effectsを使う時は頭の片隅に実数(real)の感覚を常駐させておいた方が良いです。24コマのタイムシートの1コマは、1秒を「1」とする空間の中では、どう扱われているのか‥‥という事スね。

クラシック3D

新しい作業環境や、After Effectsのバージョンアップで、ついつい見落としてしまうのが、「3Dレイヤーのレンダラー」の設定です。急いでいると特にネ。

After Effectsのコンポジション設定は、デフォルトで「レイトレース3D」になっていますが、環境やコンポジション内容によってはこの設定項目が重荷になって、べらぼうにレンダリング時間が長くなります。極端な例を言えば、1時間で済むレンダリングが、24時間とか。

レイトレース3Dの機能が不要の場合は、「クラシック3D」へとコンポジション設定を変更しておくのが、面倒無くて良いです。普通に2Dベースのアニメ制作をおこなう場合は、レイトレース3Dの出番はほぼありませんので、新しいマシンやバージョンアップしたAfter Effectsを初めて使う際には、忘れずに「クラシック3D」へ設定変更しておくと良いです。Adobeのデフォルトとは逆の状態、つまり、クラシック3Dをデフォルトにして、必要な時だけレイトレース3Dへと切り替えるほうが、少なくとも2Dのアニメーションには向いています。

‥‥と言ってる私が、よく設定変更を忘れるんですけどネ‥‥。

ありえないレンダリング予測時間がレンダーキューで表示されたら、一旦止めて、コンポジション設定の「高度>レンダラー」の設定を確認してみても良いかも‥‥です。

しかし何だ、重箱の隅突きですが、After Effects上の「クラシック3D」と「レイトレース 3D」という文字表示、なぜに「レイトレース 3D」のほうには「3D」の前に半角スペースが入ってるんだろう。

After Effectsに文字情報を埋め込む

‥‥というタイトルを見て、あまり深く考えずに「‥‥それって、テキストレイヤーの事でしょ」と言う人は、ご名答です。

After Effectsには、テキストレイヤーがあるので、文字情報ならいくらでも書き込めるのです。

現アニメ業界の制作技法に限らず、様々な「作業の取り決め」は大体が文字情報で表現できます。という事は、作業の取り決めを文字情報として策定すれば、After Effectsでも積極的な活用ができる‥‥というわけです。‥‥実はそれが、私が10年近く前から取り組んでいる「atDB」〜アニメーション技術情報データベース〜なんですけどネ。

事前の規約をしっかりフィックスしておき、After Effectsの「item」の番地を読み出すfunctionも併せて用意しておけば、情報に確実にアクセスできる仕組みがAfter Effectsのプロジェクト内部に構築できます。

itemの「parentFolder」をフォルダ階層の上方に向かって繰り返し文で読み出し、「root」に達したらストップするようなサブルーチン〜functionを作ります。さらにcompItem(コンポジション)かどうかもチェックします。そうすると、
 
/db/cutinfo@anime_01_001

‥‥のように、まるでフォルダの階層を指定するかのごとく、itemの特定が可能になります。さらに、そのitem〜コンポジション「cutinfo@anime_01_001」の中の特定のレイヤー「layer('transition_info')」のソーステキストを読み書きすれば、トランジションの情報をAfter Effectsに埋め込む事も可能となります。

もちろん、トランジション情報だけでなく、自分らのワークグループで埋め込みたい情報を「文字ベース」で規定すれば、いくらでも必要な情報をAfter Effectsのプロジェクトファイルごとに持たせる事が可能です。

After Effectsのプロジェクトファイルに必要な文字情報を埋め込んでしまえば、後はエクスプレッションで如何様にでも捌けます。
 
comp('cutinfo@anime_01_001').layer('transition_info').text.sourceText;

用語の正引き・逆引き辞書も、
 
OLi=カット頭OL
OLo=カット尻OL
FI=フェードイン
FO=フェードアウト

‥‥などの書式でやはりテキストレイヤーに書き込んでしまい、エクスプレッションで「連想配列」に変換、カット固有の情報と組み合わせて、
 
「カット頭OL(1+0)」

‥‥なんていう文字列をカットボールドに自動表記させる事も可能です。

普通のアニメ撮影の「スタンドアロン」状態のエクスプレッションでは、コンポジションのデュレーションを読み出して尺の自動表記は可能でも、カット毎に異なるトランジション情報は、テキスト手打ち込みで表記するしかありません。しかし、データベースから情報が供給されれば、様々な自動表記が可能になり、加えて、表記をミスる事も防げますし、事前に尺間違いに気づいて修正する事もできます。

「データベースサーバを使う」事を覚悟し、実際に運用すれば、After Effectsは別次元の「グループウェア」的な側面を見せ始めます。

データベースの運用になれて、使い方が洗練されはじめると、「そもそも、After Effectsに情報を書き込むんじゃなくて、サーバと随時アクセスすれば良いんじゃないか」という考えも浮かびます。しかし、私は未来の状況(全国各地に点在するスタッフとのやりとり)も考えて、「サーバへのアクセスが少なくても、情報を一回読み込めば、スタンドアロンで作業が進む」方法も残しておきたいと考えています。ゆえに、After Effectsに情報を書き込んでしまう方法も模索しています。

未来への課題は沢山あります。些末に見える、こうしたテキストレイヤーごときの運用術も、「ちりつも」で、やがて大きな成果へと結びついていくのです、

AEの12.2.1.5

最近、After Effectsのクラッシュに悩まされていたのですが、今回のアップデート(12.2.1.5)で安定した‥‥かな? それとも、ぬか喜びか?

サーバにファイル(ファイルフッテージ)をおいたままで、After Effectsでレンダリングすると、気まぐれな頻度でレインボーカーソルが出っぱなしになって事実上のクラッシュ状態となり、さらにはFinderまで道連れにしてマシンの再起動もままならない状態に陥る事が、いくつものマシン環境で発生していました。

何か1つの環境だけで障害がでるならまだしも、新MacProやiMacなど複数の異なった環境で、After Effects CCを使うとクラッシュしていたので、手を焼いていました。

メディアエンコーダの重要なアップデートとは書いてあったけど、たしかに今まではレンダリング時にクラッシュしていたので、多少でもマシになってくれると助かります。昨日、After Effectsのアップデートを実行した後、200ファイル以上のレンダリングをクラッシュなしで成し遂げたので(つーか、それが正常なんですけどネ)、ちょっと期待しております。‥‥が、なにぶん、気まぐれなタイミングでクラッシュする障害なので、まだまだ安心するのは早いのです。

今回のアップデートで安定すると良いな‥‥。

ガイドレイヤー

After Effectsには様々な便利機能があるのですが、「ガイドレイヤー」というレンダリング時に表示が自動オフになるレイヤー機能があります。アニメ撮影ではおなじみの機能で、カメラフレームをまさに「ガイド」として表示する際に用います。カメラのファインダーみたいなもんですネ。

このガイドレイヤー機能は「グリッド表示」「撮影フレーム」として使うだけでなく、「実際のレンダリングにはオフにしたい何か」にも用いる事ができます。ガイドレイヤーを使えば、「LUT有無」の2種類のレンダリングを1つのコンポから書き出す事が可能です。(LUTとはLookUpTableの略で、すごく簡単に言えば色変換の段取りの一種です。)

作業の時とラボに映像を渡す時とで、色空間を変えなければならない時に、調整レイヤーでLUTを適用して「補正オンオフ」を切り替えるのですが、その際、LUT適用レイヤーをガイドレイヤーにしておけば、レンダリング設定上だけでレイヤーのオンオフを遠隔操作できます。

レンダリング設定のガイドレイヤー欄を「すべてオフ」から「現在の設定」に変更すれば、表示中のガイドレイヤーはそのまま生きてレンダリングされるわけです。あくまで「現在の設定」ですから非表示のガイドレイヤーまでオンにはしませんし、プリコンを遡ってレンダリングする事も(コラップストランスフォームがオンになってなければ)ありません。

これは自動処理で制御する際に、コンポジションの中身を掘ってレイヤーを探し出して「visibleをfalse(またはtrue)」にしなくても、レンダリング設定を名指しするだけ(applyPresets)で特定レイヤーの表示状態を操作できるので、ツールの開発期間が短縮できます。

LUTだけでなく、シネスコマスクやタイムコード、字幕、注釈なども、レンダリング設定だけで手軽に表示&非表示を遠隔操作できるので、工夫次第で様々な活用アイデアがありそうです。

 


calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< January 2019 >>

selected entries

categories

archives

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM