エクスプレッション

2点をつまんで描ける矢印シェイプ(.ffx配布あり)「Shape-Arrow」

After Effectsで矢印。もう言わずもがな。

特に絵コンテなどでシンプルな矢印をよく使うのですが、標準機能を組み合わせるだけでも実用的なものが作れます。

シェイプレイヤーとエクスプレッションで実用的な矢印を作ります。

シェイプを準備する

三角形と長方形を組み合わせれば終わるのですが、絵コンテのように次々と直感的に矢印を記入していく場合にスピーディさに欠けます。

長さや角度、矢印のスタイルの調整などが早くなるように頭を捻ります。

条件を整理する

  • 位置合わせを最適化したい
  • 角度合わせ面倒くさい
  • サイズ調節しやすくしたい
  • じゃあもう色も一箇所で変えたい

位置合わせを最適化したい

まず、矢印のさきっちょと長方形部分をちょうどいい角度に合わせて、長さ調整というのが効率悪いので、「頭とおしりの2点をドラッグで矢印が伸びないか?」ということです。

エクスプレッション制御の「ポイント制御」を2つ、矢印の開始点と終了点をセットする用に使い、矢部分は固定、棒部分は伸び縮みして欲しいわけです。

2つの座標をもとにまずは棒の部分を作ります。

エフェクトを準備

シェイプレイヤーのパスをエクスプレッション制御で描画するために最低限必要な項目はこの4つです。

「矢の位置」ポイント制御
「線の位置」ポイント制御
「角度判定」角度制御
「線の太さ」スライダー制御

をそれぞれ追加しリネーム。パスにエクスプレッションを追加します。

できました。

棒部分のパスのエクスプレッションVer.1

var angle=effect("角度判定")(1);
var p1=[effect("線の位置")(1)[0],effect("線の位置")(1)[1]];
var p2=[effect("矢の位置")(1)[0],effect("矢の位置")(1)[1]];
var futosa=effect("線の太さ")(1);
var p1a=f_pToRotate(p1,futosa);
var p1b=f_pToRotate(p1,-futosa);
var p2a=f_pToRotate(p2,futosa);
var p2b=f_pToRotate(p2,-futosa);

function f_pToRotate(point,futosa) {
	var a=degreesToRadians(angle);
	var xa = Math.cos(a)*futosa;
	var ya = Math.sin(a)*futosa;
	xa-=Math.sin(a);
	ya+=Math.cos(a);
    
	return [xa,ya]+point;
}

createPath([p1a,p2a,p2b,p1b],[],[],true);

「角度判定」はエクスプレッション内で記述しても良いのですが、矢のパスでも使うので、使い回せるように1箇所で計算させて引っ張るかたちをとります。

角度を求めるエクスプレッションは以下です。

var p=effect("矢の位置")(1)-effect("線の位置")(1);
var a=Math.atan2(p[1],p[0]);
angle=radiansToDegrees(a)+90;//右が0°

座標からアークタンジェントのMath.atan2()でラジアンの値が求められるので、角度のプロパティ用にradiansToDegrees()でラジアン→角度に変換、さらにアークタンジェントは右が0°のためAfter Effectsで馴染の深い縦方向が0°になるよう90°足して調整します。

先に最後の行の説明です。メインの処理が最後の行の「createPath()」で、エクスプレッションによってパスを描画できちゃいます。角度を考慮したパスを描画するためにパスの頂点を求める必要があるので、前半でごにょごにょし、これにぶち込んでいきます。

createPath([パスの頂点1座標,パスの頂点2座標,…], inTangents = [前の頂点に伸びるベジェのハンドル座標], outTangents = [次の頂点に伸びるベジェのハンドル座標], isClosed = パスを閉じるかtrueかfalse);

createPath()の詳細は先人たちが解説しているいい記事がいくつかあるので、意味をしっかり理解したい方はぜひ調べてご自身でも触ってみましょう。

C-Note様
https://kssaito20.livedoor.blog/archives/24655696.html

頂点が2つの線ではなく、頂点4つの長方形+塗りで描画します。

これに入れるための数値を「f_pToRotate()」で計算しreturnさせています。学生の頃いつ使うかわからずロクに学んでこなかったサイン、コサイン、タンジェントが大活躍しています。

12行目、13行目のサインMath.sin()、コサインMath.cos()にはラジアンを突っ込まなくてはならないので、11行目degreesToRadians()で変換しておきます。

上記のスクショのように指定する「矢の位置」ポイント制御の座標の左右に、線の太さ分+と-の座標に2点求め、棒部分の太さとします。「線の位置」も同じ処理をするので、これで合計4点の頂点が求まるので、長方形が完成です。

矢部分のパスとエクスプレッション

こちらは三角であればいいので、パスの頂点は3点必要です。そして矢部分の下は「線の位置」まで伸びなくていい代わりに、スライダー制御でサイズを調整できるよう準備します。

「矢の高さ」スライダー制御
「矢の幅」スライダー制御

をそれぞれ追加しリネーム。メインの処理は棒の方と同じですね。

var angle=effect("↓スタイル設定↓")(1);
var p1=[effect("矢の位置")(1)[0],effect("矢の位置")(1)[1]];
var p2=[effect("線の位置")(1)[0],effect("線の位置")(1)[1]];
var arrowsize=effect("矢の高さ")(1);
var p2a=f_pToRotate(effect("矢の幅")(1),arrowsize);
var p2b=f_pToRotate(-effect("矢の幅")(1),arrowsize);

function f_pToRotate(zure,arrowsize) {
	var a=degreesToRadians(angle);
	var xa=Math.cos(a)*zure;
	var ya=Math.sin(a)*zure;
	xa-=Math.sin(a)*arrowsize;
	ya+=Math.cos(a)*arrowsize;
    
	return [xa,ya]+p1;
}

createPath([p1,p2a,p2b],[],[],true);

ブラッシュアップと仕上げ

2つのシェイプを一括でカラー変更できるよう、エフェクトを追加します。

「色」カラー制御

です。シェイプの「塗り」に以下のエクスプレッションを記述します。

effect("色")(1);

棒部分のパスのエクスプレッションVer.2

追加となったのは

「とがらせる」チェックボックス制御
「角丸」チェックボックス制御
また、エフェクトが増えてきたので特に触らない「角度判定」スライダー制御を「↓スタイル設定↓」にリネームし、非表示に出来ない分、視認性の点で無理やり活用します。

var angle=effect("↓スタイル設定↓")(1);
var p1=[effect("線の位置")(1)[0],effect("線の位置")(1)[1]];
var p2=[effect("矢の位置")(1)[0],effect("矢の位置")(1)[1]];
var arrowsize=effect("矢の高さ")(1);
var futosa=effect("線の太さ")(1);
var p1a=f_pToRotate(p1,futosa,0);
var p1b=f_pToRotate(p1,-futosa,0);
var p2a=f_pToRotate(p2,futosa,arrowsize);
var p2b=f_pToRotate(p2,-futosa,arrowsize);
if(effect("とがらせる")(1)==1){
	p1a=p1b=p1;
}

function f_pToRotate(point,futosa,zure) {
	var a=degreesToRadians(angle);
	var xa = Math.cos(a)*futosa;
	var ya = Math.sin(a)*futosa;
	xa-=Math.sin(a)*(zure-(zure/2));
	ya+=Math.cos(a)*(zure-(zure/2));
    
	return [xa,ya]+point;
}

createPath([p1a,p2a,p2b,p1b],[],[],true);

とがらせる処理を追加し、チェックボックスONで棒の方がとがるように仕掛けをしました。

10行目のif文で、座標の左右に開くはずのp1aとp1bをともにp1にすることでとがる状態にしました。

(さらに、矢と棒が離れるのが怖かったので18行目、19行目でzure/2←矢の高さの1/2分食い込ませました。)

もう一息、角丸機能です。

シェイプに標準で追加できる「角を丸くする」を棒にだけ影響するように、シェイプの中身を

角を丸くする

の順に並べます。

そして角丸の半径は線の太さの値を入力したいので、毎回計算しなくて済むようにチェックボックスとし、エクスプレッションのif文でチェックボックスONのときに「線の太さ」の値を代入するように仕込みました。

if(effect("角丸")(1)==1){
	effect("線の太さ")(1);
}else{
	0;
}

最後にちょっとこだわって、描画されるパスの中心にアンカーポイントが来るようにアンカーポイントと位置にエクスプレッションを記述します。

([effect("矢の位置")(1)[0],[effect("矢の位置")(1)[1]]]+[effect("線の位置")(1)[0],effect("線の位置")(1)[1]])/2;
transform.anchorPoint

これにより、3Dレイヤーにしたときに直感的に回転させることができます。絵コンテではよく手前から奥に向かう角度をつけた矢印も多用するので、効率がまったく変わってきます。

完成

おまけでドロップシャドウのレイヤースタイルを非表示状態で残してあります。場合によって目玉をONにしてすぐ使えます。

そしてプロパティは「アニメーションプリセット」として簡単に保存しておけるので、ご自身が使いやすいプロパティに調整した状態で「保存したいプロパティだけを全て選択した状態で」アニメーションプリセットとして保存しておくと、すぐに呼び出せます。

キーフレームアニメーションも保存しておけるので、ぜひ汎用的なテロップやアニメーションが作れたら、今後の資産として保存しておくクセを付けておくことで、効率アップが積み重なっていきます。

↓今回は「コンテンツ」「エフェクト」「アンカーポイント」「位置」「レイヤースタイル(非表示)」を選択状態で[アニメーション]>[アニメーションプリセットを保存]してあります。

ダウンロード

ランダムに配置するスクリプト「posUn-Align.jsx」前のページ

1コンポでアニメーションパターンを管理するスクリプト「tRemapPlayer@Selector.jsx」次のページ

ピックアップ記事

  1. なぜ?After Effectsのレイヤーをエクスプレッションで効率化
  2. なぜ?After Effectsの操作を「スクリプト」で効率化
  3. フリーランスの開業届提出は開業freeeでとにかく簡単に
  4. amazonのスポンサー商品(広告)を非表示にするブックマークレット「amazO…
  5. YouTubeで一時停止中のコントローラーを非表示にするブックマークレット

関連記事

  1. エクスプレッション

    フェードイン・アウトをエクスプレッションで自動化する

    レイヤーの不透明度に、フェードイン・フェードアウトを自動化するエクス…

  2. エクスプレッション

    オーディオのフェードイン・アウトをエクスプレッションで自動化する

    オーディオレイヤーの音量のフェードイン・フェードアウトをエクスプレッシ…

  3. エクスプレッション

    タイムリマップでレイヤー管理するエクスプレッション(2フレーム以上)

    複数の種類で同じ大きさのオブジェクトを何度も使用する場合、プリコンポー…

  4. エクスプレッション

    ランダムに配置するスクリプト「posUn-Align.jsx」

    複数のレイヤーを放射状に整列させるエクスプレッションを仕込むスクリプト…

  5. エクスプレッション

    なぜ?After Effectsのレイヤーをエクスプレッションで効率化

    「なにかの動きに連動する」アニメーションを作るには、キーフレームで頑張…

  6. エクスプレッション

    タイムリマップでレイヤー管理するエクスプレッション(フリーズフレーム)

    複数の種類で同じ大きさのオブジェクトを何度も使用する場合、プリコンポー…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA