《波のような動作!》レイヤーの動きを放射状に伝達する方法

AfterEffectsのエクスプレッションで、レイヤーを均等配置する方法を以下の記事でまとめました。

関連記事

AfterEffectsのシェイプレイヤーを均等に並べる場合、数が少なければ手動で出来ますが、数が増えると非常に大変です。 それを解決する為に、レイヤーをコピペするだけで簡単にレイヤーを並べられるエクスプレッション処理を作成したので[…]

この均等配置したレイヤーに対して、角のレイヤーの動きを放射状に伝達する処理を作成したのでご紹介します。

実現イメージ

以下のように、任意の角から動きを放射状に伝達できるようになります。

処理イメージ

処理イメージ

今回は、左上のレイヤーのスケールを、放射状に伝達する動きを作っていきます。具体的には、左上レイヤーのスケールを全レイヤーが参照し、valueAtTimeを使って隣接レイヤーからの参照時間を-0.1秒ずつずらしていきます。

これによって、全レイヤーに動作が伝わっていくアニメーションを作っていきます。

事前準備

事前準備

① 新規コンポジションを作成(サイズ:1920×1080)

② シェイプレイヤーを作成し、「楕円形」「塗り」を追加し、「サイズ」を[30, 30]にした後、レイヤー名を「layer0001」にします。

③ レイヤーを均等配置するために、以下の記事のソースコードを「layer0001」の位置に貼り付けます。

関連記事

AfterEffectsのシェイプレイヤーを均等に並べる場合、数が少なければ手動で出来ますが、数が増えると非常に大変です。 それを解決する為に、レイヤーをコピペするだけで簡単にレイヤーを並べられるエクスプレッション処理を作成したので[…]

16×9なので、最後の1行を以下のように変更します。

getArrangeEvenlyPosition(1, nTargetIndex, 16, 9);

④ [レイヤー] – [新規] – [ヌルオブジェクト]でヌルオブジェクトを作成し、名前を「control」に変更

⑤ ④のヌルオブジェクトに、[エフェクト] – [エクスプレッション制御] – [ポイント制御] を適用し、ポイント制御の名前を「spreadScale」に変更

⑥ 「spreadScale」のポイントのキーフレームに以下を打ち込みます。

  • 0s・・・[100, 100]
  • 1s・・・[300, 100]
  • 2s・・・[100, 300]
  • 3s・・・[100, 100]

⑦ 「spreadScale」のポイントのエクスプレッションに、以下をコピペします。

loopOut();

これで準備OKです。これで、コンポジションに、2つのレイヤー「spreadScale」「layer0001」がある状態になったと思います。

処理内容

遅延量を計算する関数を作成しました。

※ 関数については以下の記事で説明していますのでご覧ください。
関連記事

AfterEffectsのエクスプレッション内で、時間計算など、同じ処理を何度もする場合もあると思います。 そんな時は、関数を使うと記述量を大幅に減らせる可能性があります。 この関数の使い方についてご紹介します。 関数と[…]

自作関数を使って処理を再利用する方法

以下のコードを、「layer0001」の [トランスフォーム] – [スケール] のエクスプレッションにコピペします。

//© 2021 COLORCODE-AE
//遅延量を計算する
function getArrangeLayerDelayTime(nDelayBaseTime, nTargetIndex, nColumn, nRow, nDirection){
    var nIndex = nTargetIndex - 1;
    var nXIndex = nIndex % nColumn;
    var nMaxXIndex = nColumn - 1;
    var nMaxYIndex = nRow - 1;
    var nYIndex = Math.floor(nIndex / nColumn);
    var nDelayTime = 0;
    switch(nDirection){
        case 0:
            nDelayTime = (nXIndex + nYIndex) * nDelayBaseTime;
            break;
        case 1:
            nDelayTime = ( (nMaxXIndex - nXIndex) + nYIndex) * nDelayBaseTime;
            break;
        case 2:
            nDelayTime = (nXIndex + (nMaxYIndex - nYIndex) ) * nDelayBaseTime;
            break;
        case 3:
            nDelayTime = ( (nMaxXIndex - nXIndex) + (nMaxYIndex - nYIndex) ) * nDelayBaseTime;
            break;
        default:
            break;
    }
    return nDelayTime;
}
function getNumericFromLayerName(nDigit){
    var sLayerName = thisLayer.name;
    var sNumeric = sLayerName.slice(-nDigit) ;
    return parseInt(sNumeric, 10);
}
//速度
var nSpreadSpeed = 0.1;
//対象インデックス(レイヤー名から自動取得)
var nTargetIndex = getNumericFromLayerName(4);
//開始位置指定・・・左上:0、右上:1、左下:2、右下:3
var nSpreadDirection = 0;
//遅延時間取得
var nDelayTime = getArrangeLayerDelayTime(nSpreadSpeed, nTargetIndex, 16, 9, nSpreadDirection);
//スケール取得
thisComp.layer("control").effect("spreadScale")(1).valueAtTime(time-nDelayTime);

これで準備完了です。「layer0001」を144個になるようにコピペして、再生すると左上の動作が放射状に伝達されていると思います。

処理説明

関数 getArrangeLayerDelayTime で遅延量を計算し、「control」レイヤーの[spreadScale ] – [ポイント] の値を、valueAtTimeで経由で取得しています。

関数の使い方

getArrangeLayerDelayTime は、レイヤーの遅延量を計算する関数です。引数は5個あります。

  1. nDelayBaseTime・・・遅延量=伝達速度(秒)
  2. nTargetIndex・・・対象インデックス
  3. nColumn・・・列
  4. nRow・・・行
  5. nDirection・・・向き

①は隣接レイヤーに伝達する時間です。②はレイヤー名から自動取得します。③は配置した列、④は配置した行です。⑤は向きで、左上:0、右上:1、左下:2、右下:3を指定します。

試しに、⑤を1に変更してみてください。右上から伝達するようになります。

関数の説明

getArrangeLayerDelayTime は、簡単に書くと以下のような処理をしています。

  • 現在の行・列を計算
  • 現在の行・列に応じた遅延量を計算

まとめ

今回はスケールを伝達させる例で説明しましたが、wiggleを適用した位置を伝達させると、波のような動きを簡単に作れます。

今回の処理は、動く背景を自分で作る場合などに活躍すると思いますので、色々とお試しください。

レイヤーの動きを放射状に伝達する方法
最新情報をチェックしよう!
>Aeをもっと便利に。「COLOR CODE - AE」

Aeをもっと便利に。「COLOR CODE - AE」

AfterEffectsをもっと便利に使う為のコンテンツを制作・発信しているブログです。YouTube「COLOR CODE - AE チャンネル」では、エフェクト、エクスプレッション、プリセット、プラグインのリファレンス動画を公開しています。チャンネル登録もお待ちしています!

CTR IMG