閉じる
閉じる
さて、ついに目玉機能は完成しました。
が、アンカーポイントが気に食わないと。
というわけでアンカーポイントをど真ん中にもってくることを考えましょう。
これはエクスプレッションにも使われる有名な関数があります。
sourceRectAtTime()
という文を見た事は無いでしょうか。
テキストに合う四角いシェイプを作ろうとかそういう記事で大変よく見かけるものです。こいつを利用したいと思います。
レイヤーの描画範囲の中心の座標は
CX = layer.sourceRectAtTime(0,true).width*0.5+layer.sourceRectAtTime(0,true).left;
CY = layer.sourceRectAtTime(0,true).height*0.5+layer.sourceRectAtTime(0,true).top;
で求まります。layerのとこはちゃんとselectedLayer[0]なりなにかレイヤーを入れてくださいね。
.widthとか.leftが横幅なのか~とか範囲の一番左の座標か~とかは分かっていただけると思いますが、
(0,true)
という引数はちょっと見なれませんね。エクスプレッションの時にこれを書いた方はほぼ皆無ではないでしょうか。実は書けるんですよ。
一つ目の0は時間を表します。timeと書いてもいいわけです。
何故0としているかというと、私のスクリプトではアンカーポイントや位置やスケールなどにキーフレームが打ってある場合はアンカーポイントの揃えをしないという方針を取っているからです。イージングとかの管理が大変めんどくさいので。なのでキーが打たれてない時しか揃えないという事は、別にいつの時間のソース短形を取ってもいいので、0を取ってるわけです。問題が起きた時はinPointとかに変えよっかな~みたいな感じです。
で、trueですが、これはextentsという引数らしいです。必要に応じてシェイプレイヤーの境界のサイズを広げるために適用されるとか説明されますが、これがfalseの時は、多分トランスフォームの変更によって生じるソース短形のサイズ変動が無視されてしまう、みたいな事なんじゃないかと思っています。分からん。多分。メイビー。自分で検証してみて。
とにかくtrueにしとけばなんか想定外の変形分も取得できるはずだと。そういう話です。
で、これをアンカーポイントに入れたいところなのですが、実はここでまた問題が発生します。
これをそのまま直接アンカーポイントに代入すると、シェイプレイヤーのコンテンツ空間内の座標系が取り残されてしまうのです。
この後「構造分解した文字を囲うように丸を追加しよ~」とコンテンツから丸を軽率に追加すると、「アンカーポイントが0,0の時のアンカーポイントがあった場所をコンテンツ内の原点としてシェイプが追加される」という事が起きます。今度は追加した丸がぶっ飛んだ場所にいる事になってしまうのです。
これを避けるためには、アンカーポイントを中央に配置するのと同じようなソース短形になるようにシェイプの構造グループを移動させる必要があるのです。
なので中央アンカー座標の代入先はトランスフォームのアンカーポイントではなくシェイプのコンテンツのグループの中のトランスフォームのアンカーポイントとなります。
そしてこれを全構造に対して行うと、全てのパーツは中央にぎゅっと集まります。
元の位置のままで居てくれたりなどしないのです。なんて不器用。
プログラムってそんなものです。
という事で、アンカーポイントを中央に揃えた時に発生した描画位置の変動を打ち消すように、今度はレイヤートランスフォームの位置を動かして上げる必要があります。
で、もう勿体ぶらず先に言ってしまいますが、次元を分割しているかいないかで位置の座標のアクセスは変わります。
X位置へのアクセスは、次元を分割していない場合は
layer.property("ADBE Transform Group").property("ADBE Position").value[0];
次元に分割している場合は
layer.property("ADBE Transform Group").property("ADBE Position_0").value;
となります。ifで分けてください。
さあもうこれでGG文解は完成だ!長かった!!!
よっしゃリリースだー!と世に出した後、とあるバグが発覚しました。実際にこのタイミングで。
トランスフォームのスケールを使ってサイズを変更したり、回転を掛けていたりすると、アンカーポイントの中央ぞろえを打ち消す位置の変動が上手く動作しない。
次回はこの他にも様々なリリース後のデバッグ物語をお送りして、最終回とさせて頂きます。
が、アンカーポイントが気に食わないと。
というわけでアンカーポイントをど真ん中にもってくることを考えましょう。
これはエクスプレッションにも使われる有名な関数があります。
sourceRectAtTime()
という文を見た事は無いでしょうか。
テキストに合う四角いシェイプを作ろうとかそういう記事で大変よく見かけるものです。こいつを利用したいと思います。
レイヤーの描画範囲の中心の座標は
CX = layer.sourceRectAtTime(0,true).width*0.5+layer.sourceRectAtTime(0,true).left;
CY = layer.sourceRectAtTime(0,true).height*0.5+layer.sourceRectAtTime(0,true).top;
で求まります。layerのとこはちゃんとselectedLayer[0]なりなにかレイヤーを入れてくださいね。
.widthとか.leftが横幅なのか~とか範囲の一番左の座標か~とかは分かっていただけると思いますが、
(0,true)
という引数はちょっと見なれませんね。エクスプレッションの時にこれを書いた方はほぼ皆無ではないでしょうか。実は書けるんですよ。
一つ目の0は時間を表します。timeと書いてもいいわけです。
何故0としているかというと、私のスクリプトではアンカーポイントや位置やスケールなどにキーフレームが打ってある場合はアンカーポイントの揃えをしないという方針を取っているからです。イージングとかの管理が大変めんどくさいので。なのでキーが打たれてない時しか揃えないという事は、別にいつの時間のソース短形を取ってもいいので、0を取ってるわけです。問題が起きた時はinPointとかに変えよっかな~みたいな感じです。
で、trueですが、これはextentsという引数らしいです。必要に応じてシェイプレイヤーの境界のサイズを広げるために適用されるとか説明されますが、これがfalseの時は、多分トランスフォームの変更によって生じるソース短形のサイズ変動が無視されてしまう、みたいな事なんじゃないかと思っています。分からん。多分。メイビー。自分で検証してみて。
とにかくtrueにしとけばなんか想定外の変形分も取得できるはずだと。そういう話です。
で、これをアンカーポイントに入れたいところなのですが、実はここでまた問題が発生します。
これをそのまま直接アンカーポイントに代入すると、シェイプレイヤーのコンテンツ空間内の座標系が取り残されてしまうのです。
この後「構造分解した文字を囲うように丸を追加しよ~」とコンテンツから丸を軽率に追加すると、「アンカーポイントが0,0の時のアンカーポイントがあった場所をコンテンツ内の原点としてシェイプが追加される」という事が起きます。今度は追加した丸がぶっ飛んだ場所にいる事になってしまうのです。
これを避けるためには、アンカーポイントを中央に配置するのと同じようなソース短形になるようにシェイプの構造グループを移動させる必要があるのです。
なので中央アンカー座標の代入先はトランスフォームのアンカーポイントではなくシェイプのコンテンツのグループの中のトランスフォームのアンカーポイントとなります。
そしてこれを全構造に対して行うと、全てのパーツは中央にぎゅっと集まります。
元の位置のままで居てくれたりなどしないのです。なんて不器用。
プログラムってそんなものです。
という事で、アンカーポイントを中央に揃えた時に発生した描画位置の変動を打ち消すように、今度はレイヤートランスフォームの位置を動かして上げる必要があります。
で、もう勿体ぶらず先に言ってしまいますが、次元を分割しているかいないかで位置の座標のアクセスは変わります。
X位置へのアクセスは、次元を分割していない場合は
layer.property("ADBE Transform Group").property("ADBE Position").value[0];
次元に分割している場合は
layer.property("ADBE Transform Group").property("ADBE Position_0").value;
となります。ifで分けてください。
さあもうこれでGG文解は完成だ!長かった!!!
よっしゃリリースだー!と世に出した後、とあるバグが発覚しました。実際にこのタイミングで。
トランスフォームのスケールを使ってサイズを変更したり、回転を掛けていたりすると、アンカーポイントの中央ぞろえを打ち消す位置の変動が上手く動作しない。
次回はこの他にも様々なリリース後のデバッグ物語をお送りして、最終回とさせて頂きます。
広告