サムネイル画像

【コピペして使える】Adobe After Effectsのエクスプレッションでお困りの方へ!作業が短縮化できるかもしれないコード集

こんにちは、昼休みプレインのよっCーです。
昼休みプレインとして活動を始めてからもう1年が経ちます。早いですねぇ…

昼休みプレインは、普段は自作曲を中心に楽曲制作をしている2人組のグループです。
私よっCーとYasuで活動しています。

◆昼休みプレイン3rdシングル『Star Memory』現在公開中!

note記事

リリックビデオ

Apple Music

Spotify

普段音楽活動をしている昼休みプレインですが、私よっCーはプログラマーとしても活動しています。

実は、上で紹介した『Star Memory』のリリックビデオにはプログラムが使われています。

雪の結晶の動き、歌詞のテキストやアニメーションは全てプログラムで制御されています。

『Star Memory』のリリックビデオはAdobe After Effectsで制作しました。

ご存じの方もおられるとは思いますが、Adobe After Effectsでは「エクスプレッション」という動画の動きをプログラムで制御する機能があります。

使用する言語は、JavaScriptの拡張版でAdobe社が開発したActionScriptという言語です。
JavaScriptと互換性があるため、JavaScriptの知識があればコードを記述することができます。

大変お待たせしました。
今回はAdobe After Effectsのエクスプレッションの記述を効率化するコードをご紹介したいと思います。
今回ご紹介するコードは『Star Memory』のリリックビデオでも使用されています。
解説等細かいところで間違っていることもあるかもしれませんが、ご了承ください…

◆現在のフレーム数を取得する関数

const getFrameCount = function()
{
    return parseInt(Math.round(time / thisComp.frameDuration));
}

◆1秒あたりのフレーム数を取得する関数

const getFrame1Sec = function()
{
    return parseInt(1 / thisComp.frameDuration);
}

◆最大フレーム数を取得する関数

const getMaxDuration = function()
{
    return thisComp.duration * getFrame1Sec();
}

◆中心座標・距離・角度を指定して座標を求める関数など

class Position
{
   constructor(numX, numY)
   {
       this.X = numX;
       this.Y = numY;
   }
}
const numRad1 = Math.PI / 180.0;
const calcRadian = (rotation) => rotation * numRad1;

const getCirclePosition = function(position, distance, rotation)
{
    return new Position(position.X + Math.cos(calcRadian(rotation)) * distance, position.Y + Math.sin(calcRadian(rotation)) * distance);
}

◆まとめ(コピペ用)

class Position
{
   constructor(numX, numY)
   {
       this.X = numX;
       this.Y = numY;
   }
}
const numRad1 = Math.PI / 180.0;
const calcRadian = (rotation) => rotation * numRad1;

const getCirclePosition = function(position, distance, rotation)
{
    return new Position(position.X + Math.cos(calcRadian(rotation)) * distance, position.Y + Math.sin(calcRadian(rotation)) * distance);
}

const getFrameCount = function()
{
    return parseInt(Math.round(time / thisComp.frameDuration));
}

const getFrame1Sec = function()
{
    return parseInt(1 / thisComp.frameDuration);
}

const getMaxDuration = function()
{
    return thisComp.duration * getFrame1Sec();
}

◆解説

現在のフレーム数を求める関数

const getFrameCount = function()
{
    return parseInt(Math.round(time / thisComp.frameDuration));
}

timeはを表します。1秒の場合は1、1分の場合は60です。500ミリ秒の場合は0.5になります。

thisComp.frameDurationは1フレーム当たりの秒を表します。
この数値はコンポジションの設定で変わります。
1秒を30フレームで設定されていれば30分の1、60フレームで設定されていれば60分の1になります。

フレームレート設定

つまり、秒数÷1フレーム当たりの秒で何フレームか求めていることになります。

『Star Memory』のリリックビデオでは、歌詞のテキストやアニメーションのタイミング調整で使用しています。

1秒あたりのフレーム数を取得する関数

const getFrame1Sec = function()
{
    return parseInt(1 / thisComp.frameDuration);
}

先述のとおり、thisComp.frameDurationは1フレーム当たりの秒を表します。
この数値はコンポジションの設定で変わります。
1秒を30フレームで設定されていれば30分の1、60フレームで設定されていれば60分の1になります。

フレームレート設定

つまり、1秒÷1フレーム当たりの秒で1秒当たりのフレーム数を求めていることになります。

『Star Memory』のリリックビデオでは、こちらも歌詞のテキストやアニメーションのタイミング調整で使用しています。

最大フレーム数を取得する関数

const getMaxDuration = function()
{
    return thisComp.duration * getFrame1Sec();
}

thisComp.durationは秒数を表します。
1分間の動画なら60、1時間の動画なら3600になります。

getFrame1Sec関数は1秒あたりのフレーム数を取得するオリジナルの関数です。
詳しくは1つ上の解説をご覧ください。

つまり、1秒あたりのフレーム数×秒数で最大フレーム数を求めていることになります。

『Star Memory』のリリックビデオでは、こちらも歌詞のテキストやアニメーションのタイミング調整で使用しています。

中心座標・距離・角度を指定して座標を求める関数など

class Position
{
   constructor(numX, numY)
   {
       this.X = numX;
       this.Y = numY;
   }
}
const numRad1 = Math.PI / 180.0;
const calcRadian = (rotation) => rotation * numRad1;

const getCirclePosition = function(position, distance, rotation)
{
    return new Position(position.X + Math.cos(calcRadian(rotation)) * distance, position.Y + Math.sin(calcRadian(rotation)) * distance);
}

クラスや定数などがいくつかありますが、getCirclePosition関数を呼びます。

const getCirclePosition = function(position, distance, rotation)
{
    return new Position(position.X + Math.cos(calcRadian(rotation)) * distance, position.Y + Math.sin(calcRadian(rotation)) * distance);
}

下の図の中心座標(position)、距離(distance)、角度(rotation)を指定します。

数学の図

getCirclePosition関数の呼び方は次のようになります。

pos = getCirclePosition(new Position(中心X座標, 中心Y座標), 距離, 角度)

positionはコード上部にあるオリジナルのクラスのPositionクラスを使用します。そのため、getCirclePosition関数の第1引数はnewを使用しています。

class Position
{
   constructor(numX, numY)
   {
       this.X = numX;
       this.Y = numY;
   }
}

『Star Memory』のリリックビデオでは、雪の結晶を動かすために使用しています。

雪の結晶をよく見てみると、いろいろな角度に動いていることがわかります。
ちなみに、角度や最初の座標はランダムになっています。

ランダムにうまく動かすためには、最初に次の関数を呼びます。

seedRandom(0, true);

その後ランダムな数値を取得するには、次の関数を呼びます。

random(最小値, 最大値);

◆年末に東京旅行に行きました!

◆昼休みプレイン1stアルバム『夜明けプレイン』現在公開中!

note記事

Apple Music

Spotify

◆昼休みプレインとは?

2015年、動画投稿サイトにて有名アーティストの楽曲をカバーしていたYasu(やす)とよっCー(よっしー)。
半年で一度解散をするが、4年の月日を経て再度「昼休みプレイン」として新プロジェクトを始動。
昼休みプレインは、よっCーがメロディーのラフを考え、それにYasuが伴奏を付け加えるといった今までにないプロジェクトだ。
データのやり取りや打ち合わせなどをインターネット上で行ったりなど、最新の技術を取り入れてプロジェクトを進行している。

この記事が気に入ったらサポートをしてみませんか?