拙作のこちらの関数を使えば、シェイプグループトランスフォームをデフォルトから変えてしまったパス点を得られるんですが、使わない方法もあります(ただし歪曲には非対応)。
『シェイプグループトランスフォーム』の名前が長いので、以下SGTと表記します。
やり方
まずはシェイプレイヤーの階層内を見て、パスに至るまでの間にある SGT ぶんだけ、ヌルを用意します。
*シェイプグループとは
デフォルトでできる『シェイプ 1』プロパティや、右クリックで作成できる『グループ 1』といった名前のプロパティです。シェイプレイヤー直下にある『コンテンツ』はシェイプグループではありません。
*シェイプグループトランスフォームとは
シェイプグループ内の一番下にあるトランスフォームのことです。並び順からすると一番下にあるのでパスには影響が無いように見えますが、グループが持つプロパティ全てに影響します。
各SGT の『位置~回転』プロパティを各ヌルの『位置~回転』にコピペします。
(不透明度は不要、歪曲はヌルに無いので不可)
* SGT の値を後で変える場合、エクスプレッションでリンクでもよいです。が、処理スピードはコピペしたもののほうが速いです。
シェイプレイヤーを親、ヌルを子にして下さい。浅い階層のSGTに対応するヌルから子にしていきます。深い階層のもの、つまりパスに一番近いSGTに対応するヌルが一番子孫となります。
これで『一番子孫にしたヌルのレイヤー座標』と『パス点の座標』がイコールとなり、パス点のグローバル座標を得たり、逆にグローバル座標のヌルなどにパスを追従させたりできるようになりました。
具体的にはヌル.toComp()やヌル.fromComp() を使います。詳しくは以下のエクスプレッションをお試しください。
*各ヌルが見えていると作業しづらいのでヌルの目玉マークは消してください。
以下、一番子孫にしたヌルの名前を“mShpGpTfmNull”にしてあります。また『ポジションの値を得たり渡したりする新規ヌル』は”ヌル 1”という名前にしてあります。混同しないよう気を付けて下さい。
■パス点のグローバル座標を得る。
//ヌル 1を作って、そのポジションに以下を適用。
//パスの場所は適宜ピックウィップで得る。
//mVtxs[0]の数字を変えれば別の点を得られる。
mPath = thisComp.layer("シェイプレイヤー 1").content("グループ 1").content("シェイプ 1").content("パス 1").path;
mVtxs = mPath.points();
mVtx = mVtxs[0];
mNull = thisComp.layer("mShpGpTfmNull");
mNull.toComp( mVtx );
■ グローバル座標のヌル点にパスを追従させる。
//ヌル 1を作る。以下エクスプレッションはパスに適用する。
//パスの場所は適宜ピックウィップで得る。
//mVtxs[0]の数字を変えれば別の点を操作できる。
mPath = thisProperty;
mVtxs = mPath.points();
mIns = mPath.inTangents();
mOuts = mPath.outTangents();
mNUll = thisComp.layer("mShpGpTfmNull");
mTgtPt = thisComp.layer("ヌル 1").transform.position;
mVtxs[0] = mNUll.fromComp( mTgtPt );
createPath(mVtxs, mIns, mOuts, mPath.isClosed());
*パスの点番号を得る方法はこちら。
解説
この手法は非常に明快です。まず「toComp()やfromComp()は親子になっている座標を変換できる」んですが、「親子認識はレイヤー単位までで、プロパティ内まで深くは処理できない」んですね。そして「シェイプグループは実質シェイプレイヤーの子」です。ならば『ヌルを使って実際に親子レイヤーにしてしまえば、 toComp()やfromComp() が認識できるじゃない』ということです。
レイヤーのトランスフォームに『歪曲』が無いので歪曲には対応できませんが、そうでない場合はあまり複雑なエクスプレッションを組むことなくパス点の操作ができるので、是非ともお試しください!