dA-tools.com

HOME > AfterFx > expression > 実例 > カラーピッカー

 カラーピッカー (色指定風)

Sample:sampleImage( ) / Math.atan2/ linear()

  • ピクセルの色を画面内に表示する

 色指定ライクに:

  • AfterEffectsでキャラクターの色を変更した時にそれを色指定さんにフィードバックしたいことがあります。その場合カーソルを画像の上に置いて[情報ウィンドウ]の値をメモしてもいいのですが、ここではCS3から追加されたメソッド[ sampleImage ]を使って色指定風に表示するエクスプレッションを考えてみます。
  • 図のカラーチャートが色を拾う元になる(昭和の匂いがする)レイヤーです。
  • ライン[Gr]は白の平面をモード「差」で重ねています

 設定

  • まず、線になる平面レイヤー(L1)を追加します。サイズは100*1で色は任意です。
  • レイヤー(L1)のアンカーポイントを [ 0 , 0.5 ] に移動します。
  • 次にテキストレイヤー(例:Dog)を追加します。フォントサイズや色は任意です。見やすいように設定してください。レイヤーの名前がそのままコンポジションに表示されます。
  • テキストの [ソーステキスト ]に次のエクスプレッションを書きます。

target=thisComp.layer("comp"); //色を拾うレイヤー
p=thisComp.layer("L1").position; //色を拾う位置
fc=target.sampleImage(p);

//fcは色情報配列ですのでそれを個別に取り出します。その返却値は0から1の範囲なので、0から255にリマップします。さらに端数を切りすてます。
r=Math.round(linear(fc[0], 0, 255));
g=Math.round(linear(fc[1], 0, 255));
b=Math.round(linear(fc[2], 0, 255));

//レイヤー名とRGB値をつなぎます。
thisLayer.name + " " + r + ":"+ g + ":" + b;

  • 次に平面(L1)の[回転]に次のエクスプレッションを書きます。

delta=thisComp.layer("Dog").position-position;
angl=Math.atan2(delta[1],delta[0]);
radiansToDegrees(angl)

  • 最後に平面(L1)のスケールに次のエクスプレッションを書きます。

xs=length(thisComp.layer("Dog").position, position);
[ xs , scale[1]]

 使い方

  • 色を拾いたい位置にレイヤーL1を移動させます。
  • その位置の色が表示されます。
  • テキストレーヤーを移動させても線は色を拾う位置とテキストの間をつなぎます。
  • テキストから出る線の始点はテキストレイヤーのアンカーポイントを移動して変更します。
  • 必要な数だけ増やしてください。
  • 平面(L1)のエクスプレッションは前サンプルのパース定規と同じやり方です。

 さらに

  • 色を拾うレイヤーが1枚だけならばいいのですが、サイズ、位置、スケールの違うレイヤーがコンポに含まれている場合は上のままでは使えません。そこでエクスプレッションを次のように拡張します
  • 色を拾うレイヤーを選びやすいようにテキストレイヤーにエクスプレッション制御の[ レイヤー制御 ]を追加します。
  • [ソーステキスト ]のエクスプレッションを変更します。

target=effect("レイヤー制御")("レイヤー");
p=thisComp.layer("L1").position;
tp=target.fromComp(p);
fc=target.sampleImage(tp);

r=Math.round(linear(fc[0], 0, 255));
g=Math.round(linear(fc[1], 0, 255));
b=Math.round(linear(fc[2], 0, 255));
thisLayer.name + " " + r + ":"+ g + ":" + b;