イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

AfterEffects
Tips
イトウ先生のTips note
エクスプレッション

共通

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

こんにちは、デジタルスケープの伊藤和博です。

今回のSecondbookは、AfterEffects CC 2019から「randomメソッドとseedRandomメソッド」をご紹介します。
ランダムはwiggle同様に不規則な動きを生成する際に非常に便利なメソッドです。いずれも「ランダム」に関するメソッドですので、乱数を発生するメソッドに変わりはありませんが、この2つのメソッドは、「何で制御されているランダムなのか?」という部分が異なります。

端的に申し上げますと、random()メソッドは、タイムラインのデュレーションに制御されており、seedRandom()は、こちらが指定する何かに制御させることができるランダム、ということになります。

ランダムに生成される「数」そのものを制御するのではなく(生成される数はあくまでもランダムです)、制御のコントロールを「時間以外にできる」というメソッドがseedRandom()になりますので、そのあたりの違いをご紹介します。

さっそくやってみよう!

まず、random()メソッドですが、AfterEffectsでは3つの書き方があります。

random() :()の内側を空にしておいた場合、0から1までの(小数点以下16桁の)乱数を発生します。

random(100):()の内側に数字や変数、メソッド等を入れると、0から()の内側に入れる数までの乱数を発生する、の意味になり、この場合は0から100までの(小数点以下16桁の)乱数を発生します。

random(-100,100):()の内側をカンマで区切り、それぞれに数字または変数、メソッド等を設定すると、発生する乱数の最小値と最大値を設定することができます。この場合は、-100から100までの(小数点以下16桁の)乱数を発生します。

例えば、以下のようにテキストレイヤーが3つあり、1つのテキストレイヤーの不透明度に以下のようにエクスプレッションを書きます。

posterizeTime(2);
  random(100);

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

1秒間に2回、不透明度が0から100までの数値にランダムに変化する、になります。「AfterEffects」のテキストレイヤーにエクスプレッションを適用し、書き出すと以下のようになります(約5秒。音はなりません)。

この時のrandom()は、再生ヘッドが動くことによってランダムに変化する、つまり、時間が経過するとランダムに変化する、という動きになります。これを、再生ヘッドの動きではなく、別の何かの変化によってランダムに変化する、というようにする場合、seedRandom()を使用します。

seedRandom()

seedRandom()メソッドは、それ自体では何もしませんが、その後に適用されるrandom()メソッドの結果を左右するための、元となる種(シード)を与える役割をするものです。書き方は以下のようになります。

seedRandom(seed値, timeless=false);

seed値は、元となる値(植物でいう種の意味)になり、このseed値で設定した数値や変数、メソッドで得られる値などが、次のrandom()メソッドの結果の元(種)になります。

timeless=false、の箇所には、trueかfalseを指定することができ、trueを指定するとtimeless=true、タイムレス=真実、つまり、時間に影響しない、となり、次にくるrandom()メソッドが時間の影響を受けなくなります。反対にfalseにすると、時間の影響を受ける、つまり、通常のrandom()メソッドと同じ意味になります。ただし、falseと書いても、seed値が適用できるため、seed値のコントロールのみ可能なメソッドとして活用することが可能になります。

ところで、このseed値はどのような役割をするか?というと、そもそもrandom()メソッドは乱数を発生するもので、レイヤーごとに、また本来は再生する度、デュレーションを変更する度、など、何らかの変更を加える度にその乱数は異なりますが、「いつも決まった値の乱数値を取得したい」という場合に使用するのがseed値になります。

乱数発生のアルゴリズムには、線形合同法やメルセンヌ・ツイスタ、Google Chromeのxorshift32などがあり、Math.random()などで生成される乱数は、毎度毎度異なる乱数で決まった値の乱数は取得できないわけですが、seed値を設定すると、生成される乱数に種を提供できるため、その種を元にした乱数=いつも決まった値の乱数を取得する、ということが可能になります。

例えば、

seedRandom(10, true);
  random(100);

と書くと、10を元にした100までの乱数を生成、という意味になり、種となる10という数があるため、毎回同じ乱数を取得することが可能になります。この時、seed値に設定した10は、数字であれば1でも100でも12345でも、どのような数字を指定してもかまいません。ただし、ここで生成される乱数は、レイヤーごとに異なりますので、同じエクスプレッションを書いた別々のレイヤーでは値は異なる(=レイヤー単位ではランダムになる)、ということになります。

上記のエクスプレッションをAfterEffectsとPremiere Proの2つのテキストレイヤーに設定すると以下のようになり、それぞれのレイヤーで不透明度の値は異なる値になりますが、この数字は0フレーム目ではレイヤーごとにいつも同じ値を取得することが可能になります。

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

ただし、これを書き出しても、種が10で固定数値のため、この値を元に取得した乱数はいつも同じであり、かつ、時間に影響しなくなるため、書き出しても不透明度の値は変化しなくなります(約5秒。音はなりません)。

そこで、このseedRandom()に設定したシード値の10という数値を何かで動かしたいわけですが、この数値を動かすために使用するのが、エクスプレッション制御になります。

エクスプレッション制御

一番上のレイヤーにヌルオブジェクトを作成し、そのヌルオブジェクトに、エフェクトメニュー > エクスプレッション制御 > スライダー制御、を適用します。

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

seedRandom(10, true)の、「10」だけをドラッグして選択し、エクスプレッションピックウィップで、ヌルオブジェクトのスライダーにドラッグします。すると、以下のようになります。

seedRandom(thisComp.layer("ヌル 1").effect("スライダー制御")("スライダー"), true);
  random(100);

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

スライダー制御は、何らかの数値を与えるためだけに使用するもので、デフォルトでは0から100までの範囲で数値の設定が可能です。エフェクトコントロールパネル上にはスライダーそのものがあるため、左右のスクラブで数値の設定が可能です。なおこのスライダーも100までの範囲になっていますが、数値で入力すれば100以上の任意の数値を設定しても設定は可能です。値の範囲を変更する場合は、スライダーの上で右クリックし、値を編集、から好きな数値を設定することが可能です。

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

ただ、このスライダー範囲に単にリニアキーでキーフレームを設定してしまうと、結局はrandom()メソッドで設定したのと同じようになってしまいます。例えば、0フレーム目にスライダーの値を0でキーを設定し、5秒目に100でキーを設定すると、途中の数値の変化に対して都度乱数が生成されるため、レンダリングすると以下のようになってしまいます(約5秒。音はなりません。激しく映像がフラッシュしますので閲覧にはご注意ください)。

そこで、キーフレーム間は同じスライダー値をキープし、次のキーに切り替わったタイミングで数値を変更するように、途中途中に追加でキーを設定し、最初と最後のキーも含め、全てのキーを停止キーに変更しておきます。停止キーに変更した後、各キーの上でダブルクリックすると、スライダー値の数値を個別に設定できるため、個々の停止キーに任意の数値を設定すると、キーフレームのタイミングでのみ、スライダー値が変更となり、結果、不透明度もそのキーのタイミングでのみランダムに変化するようになります。

1秒ごとに停止キーを設定し、数値をランダムに設定してレンダリングしたものが以下のものになります(約5秒。音はなりません)。

Premiere ProとMedia Encorderのテキストレイヤーを一度削除し、AfterEffectのレイヤーを複製して、テキストだけ再入力し直し、レンダリングしたものが以下のものになります。個々のレイヤーの不透明度はそれぞれに異なるのがわかると思います。

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

このrandom()メソッドとseedRandom()メソッドの組み合わせをポジションやスケールなど他のトランスフォームにも適用すると様々な動きが再現できるため、ぜひ試してみてください。なお、位置、スケールなどの2Dレイヤーで2次元のトランスフォームの場合は、取得した乱数を一度変数で受け取り、それぞれの次元で別に使用するため、以下のように書き加えます。

var a = 500;
  seedRandom(thisComp.layer("ヌル 1").effect("スライダー制御")("スライダー"), true);
  var x = random(a);
  var y = random(a);
  [x, y]

または・・

var a = 500;
  var b = thisComp.layer("ヌル 1").effect("スライダー制御")("スライダー");
  seedRandom(b, true);
  var x = random(a);
  var y = random(a);
  [x,y]

イトウ先生のTips note 【AfterEffects CC 2019】randomメソッドとseedRandomメソッド

3Dレイヤーの場合は3次元目を追加し・・

var a = 500;
  seedRandom(thisComp.layer("ヌル 1").effect("スライダー制御")("スライダー"), true);
  var x = random(a);
  var y = random(a);
  var z = random(a);
  [x,y,z]

または・・

var a = 500;
  var b = thisComp.layer("ヌル 1").effect("スライダー制御")("スライダー");
  seedRandom(b, true);
  var x = random(a);
  var y = random(a);
  var z = random(a);
  [x,y,z]

となります。上記の「500」という数値は、位置やスケールなどで設定したい数値の上限になります。工夫次第でさまざまな動きを作ることができますのでぜひ試してみてください。

関連講座

◆AfterEffects CC 2018の使い方・基本トレーニング

◆AfterEffects CC 2014の使い方・実践トレーニング

◆JavaScriptの基礎知識

伊藤 和博
株式会社デジタルスケープ
トレーニングディレクター
伊藤 和博

講師歴25年。講座開発数200以上。 総合商社のスクールでMac/Winを使ったDTP/Webトレーニングスクールの業務全般を担当。大手PCメーカー、プリンターメーカー、化粧品メーカー、大手印刷会社、大手広告代理店、新聞社、大手玩具メーカー、大学、官公庁、団体などに向けたトレーニングなど幅広い企業の人材育成に携わる。 現在は、デジタルスケープにてAdobeCCを中心としたトレーニングの企画、講師を務める。 Adobe認定エキスパート、アップルコンピュータ認定技術者、CIW JavaScript Specialist、CIW Web Design Specialist。