dA-tools.com

HOME > AfterFx > expression > 実践 > エクスプレッションの時間

エクスプレッションの時間

1.現在の時刻の値

  • エクスプレッションでは time現在のタイムマーカーの値を返します。

time_marker.jpg

  • timeの単位はです。上図では time は18ではなくて 0.75 です。(24fps)
  • アニメでは基本的にコマを単位に使うので、この点は注意が必要です。1コマは0.041666666.........秒になりますが、これだと使いにくいので分数で[1/24]と記述するのがいいでしょう。

2.特定の時刻の値

valueAtTime(t)

  • このメソッドは秒単位で指定した時刻 (t)におけるプロパティの値を返します。
  • 例:3秒6コマ(24fps)は valueAtTime(3.25)
  • エクスプレッションにおいて時間のデフォルト設定は「現在の時刻」つまりタイムマーカーのあるフレームの値で、これは記述を省略出来ます。ですから以下の式はどちらも同じ値を返します。

thisLayer(1).position
thisLayer(1).position.valueAtTime(time)

3.絶対時間 vs 相対時間

絶対時間

  • コンポジットの特定の時刻を指定するには( )に任意の数字を秒単位で入れます。例えば

valueAtTime(3.5) 

  • これは3秒12コマ目の値を返します。(24fr/sec)

相対時間

  • 現在の時刻の2秒前の値を得るには以下の記述をします。

valueAtTime(time-2)

例:追随するレイヤー

  • この例では四角のレイヤーがそれぞれ3コマづつ遅れて付いていくようにセットしてあります。
  • 白い四角が"Top"レイヤーで次の四角の「位置」プロパティに以下のエクスプレッションを入力してあります。

thisComp.layer("Top").position.valueAtTime(time-3/24)

  • それ以降のレイヤーでは相対時間で(time-6/24),(time-9/24)を入れています。

4.タイムコード変換

(Ver.6.5以降)

[ time ]の基準単位は秒ですが、これを様々なタイム表示に変換するメソッドがあります。

  1. timeToCurrentFormat(t,fps,isDuration)
    • プロジェクト設定の表示形式で時間を表示します。
  2. timeToFrames(t,fps,isDuration)
    • 時間をフレーム数で表示します。
  3. frameToTime(frames,fps)
    • フレームに対する時間( t )を返します。
  4. timeToTimecord(t,timecordBase=30,isDuration
    • 時間をタイムコードで表示します。
  5. timeToNTSCTimecord(t,ntscDropFrame=false,isDuration)
    • 時間をNTSCで表示します。
  6. timeToFeetAndFrames(t,fps,framePerFoot,isDuration)
    • 時間をフィルムのフィート+フレーム数で表示します。

引数

  1. [ t ]は多くの場合現在の時刻=timeを使います。
  2. [ fps ]はフレームレートです。秒24コマなら[ 24 ]
  3. [ framePerFoot ]は35mmの場合は16、16mmでは40です。
  4. [ isDuration ]は、t 値が絶対時間ではなく 2つの時間の差を表す場合、true にする。

記述の省略

  • 引数を省略するとデフォルトの値が適用されます。
  • 例:fpsは[ 1.0 / thisComp.frameDuration]、isDurationはfalseがデフォルトですから下記の記述は有効です。

timeToFrames(time)

timeToFramesとframeToTimeの戻り値はNumberですが、それ以外はstringを返してきますので、表示には使えますがそのままでは計算に使うことが出来ません。

5.ポスタリゼーション時間

  • エクスプレッション内でposterizeTime(fps) を記述するとそれ以降のエクスプレッションのフレームレートを指定できます。
  • エフェクト>時間>ポスタリゼーション時間と同じ効果ですが、エクスプレッションの一部分だけに効果を適用することが出来ます。
  • 次の例ではy-positionだけが3コマの動きになります。

x=transform.position[0];
posterizeTime(8);
y=transform.position[1];
[x,y]

  • posterizeTime(fps) だけを記述してもエラーになります。ポスタライズするプロパティが必要です。

6.ネストした時間

  • In-timeのずれているコンポジションを参照した場合、timeはどうなるのでしょうか?
  • 下のエクスプレッションを見てください。
  • 平面1が[ Compo_Pre ]の中の[ 平面1 ]の回転を参照しています。

nest01.jpg

  • このエクスプレッションの結果は下のようになります。

  • 左・オレンジの棒が「平面1」で、緑の棒がプリ・コンポジット内の「平面1」です。 "Comp_Pre"内で緑の棒は1秒で180°回転するようにセットしてあります。
  • 親Compの"オレンジの棒"は"Comp_Pre"の時間そのままに参照するので、0フレームからスタートして1秒で180°回転しています。
  • 次の1秒で"Comp_Pre"の"緑の棒"が回転します。 つまり"Comp_Pre"のゼロ・フレームが親コンポジションのゼロ・フレームにそのまま対応しています。
  • ここでオレンジの棒を緑の棒とシンクロさせるには[ .souce ]を使ってエクスプレッションを次のように書き換えます。

thisComp.layer("Comp_Pre").source.layer("平面1").rotation

  • この結果は下のようになります。

  • [ .source ]を使うと、親コンポジションにおける"Comp_Pre"の時間を参照するので、2つのレイヤーの動きがシンクロします。"Comp_Pre"にタイムリマップを適用してもこの場合はリマップされた時間を参照するので2つのレイヤーは見事にシンクロします。