2つのレイヤーを親子レイヤーにすると、子レイヤーの位置情報はグローバル座標ではなくなります。そんなときにグローバル座標を得るためには以下のエクスプレッションを使います。
//子レイヤー名が『ヌル 1』。
mLyr = thisComp.layer("ヌル 1");
mLyr.toComp(mLyr.anchorPoint);
あるいは、一行にして、こんな感じですね。
thisComp.layer("ヌル 1").toComp(thisComp.layer("ヌル 1").anchorPoint);
このエクスプレッションはおそらく以下のサイトが初出?で、今では定番のやり方になっています。
アニメの道具箱様
しかし、なぜ『thisComp.layer(“ヌル 1”)』って2回書かなきゃなんでしょうか?
解説
結論は、『そう書くようにできているメソッドだから』です。身もフタもないですね。詳しく説明します。
まず思うのは「これでもいいんじゃないか?」ってことですね。
toComp(thisComp.layer("ヌル 1").anchorPoint);
toComp前のレイヤー指定を抜いています。が、これではダメなんですね。実際、これだとわけのわからない場所を差し示します。理解のカギは「toCompメソッドがどういう意味なのか」で、toCompメソッドは以下のような形と意味です。
レイヤー○○.toComp( [ x , y ] )
日本語訳
「レイヤー○○のレイヤー座標 [ x , y ] はグローバル座標だとどこか?」
くわしい日本語訳
『レイヤー○○の原点つまりレイヤーの左上はじから、そのレイヤー座標のマス目を使って数えた[ x , y ] は、グローバル座標に変換するとどこか?』
最初に書いた合っているエクスプレッションを訳に当てはめると、
『ヌル 1の左上はじから、そのレイヤー座標のマス目を使って数えた[ ヌル 1のアンカーポイント欄に入っている座標 ] は、グローバル座標に変換するとどこか?』
となります。そういえばアンカーポイント欄に入っている座標は何を意味しているでしょうか?
この記事にも書いた通り、アンカーポイント欄に入っている座標は『レイヤー原点(左上はじ)からレイヤー座標で数えたアンカーポイント印の位置情報』いわば『レイヤー座標版の位置情報』です。
これもふまえ再び当てはめてみると、
『ヌル 1の左上はじから、そのレイヤー座標のマス目を使って数えた[ レイヤー座標版のヌル 1の位置情報 ] は、グローバル座標に変換するとどこか?』
となります。直訳すぎてわかりずらいですが、つまりは
『(ヌル 1のグローバル位置は親子レイヤーになってわからなくなったけど)レイヤー座標版なら変わらず持ってるから、グローバル座標に変えてくんない?』
ということです。やりたいことと合っていますね!
疑問の解決
それでは、以下の文は何がおかしいのでしょうか?
toComp(thisComp.layer("ヌル 1").anchorPoint);
これには罠がありまして、エクスプレッションは抜けている箇所を補足してくれる機能があるんですね。
toComp前に『thisComp.layer(“ヌル 1”)』と明示的に書かないと、上の文は以下と同じ意味になります。
thisLayer.toComp(thisComp.layer("ヌル 1").anchorPoint);
『thisLayer』を補足してくれるんですね。そうなるとやりたいことと意味が違ってきます。日本語訳すると、
『(どうせ今書いてるtoCompエクスプレッションで移動させるから適当な位置に置いてある)このレイヤー自身の原点から、このレイヤーのレイヤー座標のマス目を使って数えた[ ヌル 1のレイヤー座標版のヌル 1の位置情報 ] は、グローバル座標に変換するとどこか?』となります。
位置出しに関係ない『移動させる予定のレイヤーの原点』を始まり位置にしてしまっているんですね。かつ、数えるマス目の大きさ(このレイヤーのレイヤー座標)と持っている情報のマス目の大きさ(ヌル 1のレイヤー座標)が違う。これでは、わけわからん位置に行くわけですね…。
結論
「toComp()を使うときは、カッコの中に入れる座標は手前につけるレイヤーの座標系にする」ということですね。エクスプレッションのメソッドは「何をやっているか」を理解すると応用が効きます。例えば、()には単なる座標を入れればいいので、
thisComp.layer("ヌル 1").toComp( [0,0] );
これでヌル 1のアンカーポイントではなく、原点のグローバル座標を得ることが可能。
また、標準的な使い方ですが
mLyr = thisComp.layer("ホワイト 平面 1");
mLyr.toComp( mLyr.effect("グリッド")("アンカー") );
これでホワイト平面 1にかけたエフェクト『グリッド』の中心をグローバル座標で得ることができます。
座標変換系エクスプレッションは理解すればほんとうに強力な武器になるので、ぜひともお試しください。