dA-tools.com

座標

コンポジションにレイヤーを置く際の基準になるのが座標です。

AfterFxには大きく分けて2種類の座標があります。

  • 1,グローバル座標
  • 2,ローカル座標

コンポジションの座標がすべての基準、すなわちグローバル座標です。そしてコンポジションの要素である[レイヤー]や[平面]の持っている座標がローカル座標です。

3D空間ではworld( )がグローバル座標になります。


座標は全て基準となる原点を左上隅(0,0)に取り、水平右方向がX軸のプラス、垂直下方向がY軸のプラスです。一般的に数学で使う座標系とはY軸の方向が逆になっているので注意が必要です。
 
エクスプレッションを使う際に全てのレイヤーサイズと位置が同じであれば特に問題ありませんが、サイズが異なるレイヤーの重ねではコンポジション上では同じ位置でもそれぞれの座標位置は異なっているので簡単に参照できません。それぞれの座標系の変換が必要になってきます。

 
レイヤー空間のトランスフォーム・座標変換

テスト

緑の丸の中心部分だけ「回転」エフェクトをかけるコンポジションを考えてみます。

まず各要素を以下のように設定しました。

  • コンポ
    • size= 320x240
  • 緑の丸
    • レイヤー名= cyclon / Size= 50x50
  • オレンジ平面
    • レイヤー名= Plane / Size= 280x80

アンカーポイントはデフォルトのままで、グリッドは20pix間隔です。


オレンジのレイヤーにエフェクト「回転」を適用して、そのパラメータ「回転の中心」に緑の丸の「位置」を参照するエクスプレッションを書けばよさそうです。

thisComp.layer("Cyclone").position

ところがその結果は意に反して図のようになってしまいました。

 具体的に値をチェックしましょう。

  • layer("Cyclone").positionの値は[80,60]です。
  • これを「回転の中心」に適用するとlayer("Plane")の座標[80,60]にエフェクトがかかってしまったので図のような結果になったのです。
  • つまりコンポジション座標をそのままレイヤー座標に適用したためにズレが生じてしまったのです。

これを解消するには2つのレイヤーの位置関係も計算に入れなければならないとするとなかなか厄介な問題です。

座標変換

そこでAfterFxには空間座標を変換するメソッドが用意されています。

  • 1,toComp(point,time)
    • レイヤー空間からコンポジション空間へポイントを変換します。
  • 2,fromComp(point,time)
    • コンポジション空間からレイヤー空間へポイントを変換します。

※引数のpointは配列で渡します。timeはデフォルトでは現在の時間ですので記述を省略できます。
 
早速このメソッドを使って前のコンポジションを修正しましょう。
("Cyclone").positionはコンポジション空間の座標で、エフェクトを適用するのはレイヤー座標ですから fromComp ( ) を使います。

fromComp(thisComp.layer("Cyclone").position)

結果は上のように見事にリンクします。
なんかあっさりと出来てしまって物足りないですね。ということで「親子関係」のTransformに踏み込んでみます。
 

子の「位置」

親子関係の子のpositionは?

緑の丸(子)を黒い棒(親)に付けて虫眼鏡のような形の親子関係を作りました。前と同じように fromComp ( ) を使ってエフェクトをかけてみましょう。

fromComp(thisComp.layer("Cyclone").position)

しかし結果は上図のとおりでオレンジの平面にエフェクトがかかっていません。親子関係にした「子」の座標はそのままでは別のレイヤー空間に変換できないのです。
 
そこでまず緑の丸(cyclon)の座標をグローバル座標に変換します。
それには toComp( )を使って

レイヤー. toComp(レイヤーのアンカーポイント)

とします。引数にアンカーポイントを使うのがポイントです。
具体的には次のようにします。

gPoint=thisComp.layer("Cyclone").toComp(thisComp.layer("Cyclone").anchorPoint)

変数のgPointはcyclonのグローバル座標です。これをオレンジのレイヤー座標に変換するにはfromComp( )を使います。

fromComp(gPoint)

この2行をエフェクト「回転」に記述します。
結果は下の通りです。レイヤー"Plane"が移動しても参照位置はぴったりと合っています。


このようにどんなに階層が深い親子関係でも一度グローバル座標に変換すれば他のレイヤーのローカル座標に変換することが出来ます。