ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

After Effectsコミュの【技術】エクスプレッション

  • mixiチェック
  • このエントリーをはてなブックマークに追加
見渡したのですが、とても面白い機能なのにトピが無かったので作成してみました。

覚えておくと便利なエクスプレッションについて語りませんか?

コメント(114)

テキストに小数点を表示させるのはどうしたらいいでしょうか?
数字を一気に変更する為にスライダ制御にリンクさせているのですが
小数点がある数字は表示されるのですが小数点がない場合でも
強制的に小数点以下二桁を表示させたいのです。
75 daiさん
例えば「10.00」の時「.00」部分を表示させたいという事ですよね?
試してみたのですがテキストレイヤーって小数点以下が0になると強制的に非表示になるんですね。知りませんでした!エクプレッションはまだまだ私は勉強中で強制的に表示させる方法はわかりませんでした。

代わりにエフェクトの「番号」を使うのはどうでしょう?画像参考までに。

テキストレイヤーでないと不可能なアニメーションや効果を付たいなら使えないかもしれませんが・・。

もっと効率的な方法分かる方いらっしゃればフォローお願いします。
>しずか さん
>核爆発 さん
ありがとうございました。

番号エフェクトを使うのは楽で良かったですね♪

核爆発さんのエクスプレッションもしよかったら解説お願いいたします。
私には難しかったので(><)
四捨五入や切り上げですよね・・・

そしていろいろと考えていてtoFixed関数が使える事を知ったので

(effect("スライダ制御")("スライダ")*1).toFixed(2)

で小数点二桁表示が可能でした。Fixedのあとを変えれば桁数も変わるので。
でもtoFixedはそのままではなぜかエラーが返ってくる・・・
ので無理矢理1をかけてます。
77 核爆発さん
78 daiさん
両方のやり方で試したら上手く行きました。

核爆発さんのは私も勉強が足りなく理解が難しいのですが、後ろに文字を付け足すという発想は何と無くわかりました。
daiさんの文、「*1」無しの所まで私も行き着いたのですが、「*1」を足すという発想まで行かず、断念してしまいました。しかし何故「*1」が要るのでしょうね???
勉強になります。
79 しずかさん

なぜ「*1」が必要なのかというと、ruさんが書かれているように型変換のためです。

effect("スライダ制御")("スライダ")の型は「object」です。
toFixedは数値のメソッドなのでスライダの「値」が必要ですから
型変換を使わなければ次のようになります。

effect("スライダ制御")("スライダ").value.toFixed(2);


JavaScriptでは数値が必要とされる所に文字列などを使うと自動的に数値型に変換されます。(可能な限り)
「*1」があると「乗算をするんだからこれは数値だな」って判断して、スライダの型を数値型に変換し、そして乗算してくれていたわけです。
JavaScriptは型に関してはゆるい言語なのでこんなことができます。
ですから[*1]でなくても[+0]でも[-0]でもOKです。
ruさん
核爆発さん
ヒゲマツさん

ご丁寧にありがとうございます!
型ですね、意識してみます!
[*1]でなくても[+0]でも[-0]でも大丈夫とは、面白いですね〜
なにやら過疎化してますね。エクスプレッション(・・;)

ニコニコにエクスプレッションを使用したオリジナルエフェクトの紹介を上げましたので、興味のある方はご覧になってください。
因にエフェクト自体はネットから落とせるようにしました。こちらからどうぞttp://www1.axfc.net/uploader/File/so/42067.dat (DLkeyはtoyopuyoです)

>レッドホット さん

サクっとはいかなかったので、こちらに書きました。

ttp://www.da-tools.com/AE/exp/jiturei/anyLoop.html

参考にしてみてください。
もっといい方法があるような気もしますが。
始めまして、こんにちは。

水玉映像さんを参考にさせて貰いながらエクスプレッションを勉強しているのですが、始めたばかりでよく分からなくて。
すみませんが、質問させて下さい!

Library009.Turbid1(nullの後を追尾)に記述されているスクリプトで

1行目  num = (name.slice(2,4)-(4-name.length)*10);
2行目  this_comp.layer("null").position.value_at_time(time-num/7)

とあるのですが、
1行目の”(4-name.length)*10”と2行目の”num/7”はどういうことなのでしょうか?


レイヤー名が”n_10”の場合、
1行目  numに、10-(4-name.length)*10を代入
2行目  ”n_10”の位置を、現在の時間から(time-num/7)秒遅い時のnullの位置にする
ということろまでは分かったのですが(違うかも知れないですが。。)、

・name.lengthは文字と数字の数を取って「4」なのか、文字の数だけ取って「2」なのか
・4からname.lengthを引いて10かけるというのはどういうことか
・numを7で割るのは、特別な意味(ex.name,slice(,○,○)のようにレイヤー名から参照したいものがある)があるのか

という疑問、不明点があります。
お手数かけますが、ご教授宜しくお願いします (*_ _)



>>あかす さん

◎ レイヤー名が”n_10”の場合、name.lengthは「4」です。数字、文字、記号の区別はしません。
◎expression2行目の最後を1/7, 2/7, 3/7.... 20/7としたいので、レイヤー名にアスタリスク「*」のついているレイヤーの変数numが11,12,13....となるように -(4-name.length)*10)としたのだと思います。
ex:「n_10*」レイヤーは10-(4-5)*10で20。

もしもレイヤー名が...n_10,e_11,x_12...だったら -(4-name.length)*10) は不要です。

ちょっとややこしいですね。w
>ヒゲマツさん

早速のお返事有り難うございます!
整理して紙に書いてみると、すんなり謎が解けました。

一人で勉強していると、解決策が見つからないことが多いので本当に助かります!
どうも有り難う御座いました。
こんにちわ。
近頃、エクスプレッションの勉強を始めたのですが
わからない事だらけでどなたか教えていただけないでしょうか?

移動するlayer(1)とそれに関連付けようとするlayer(2)があったとします。

layer(2)に打った式

thisComp.layer(1).position.valueAtTime(time-5)

という式は「layer(1)のpositionを5秒遅れで表示する」
といった意味合いだとおもうのですが、ではこれを

「layer(1)の 【X座標のみの】 positionを5秒遅れで表示する。
 y座標はlayer(2)の【y座標のみの】を参考にする。」

としたい場合にはどの様に書けばよいのでしょうか?
どなたかご教授お願いいたします。
>>核爆発さん

初心者の質問にご返答ありがとうございます!

なんとなく、おぼろげに[0]や[1]を使うのは見えかけたのですが
まさか、valueAtTime(time-5)の後に
[0]が適応されるとは分かりませんでした・・・。

勉強になりました!ありがとうございます!

質問させていただきます。
今、平面にレンズフレアを適用し、光源の位置が中央によるほどフレアの明るさを
大きくしたいと考えています。

距離が0になるほどフレアの明るさが100
距離が100以上であればフレアの明るさが50
となるエクスプレッションを書いてみたのですが、思った通りにはならず、
フレアの明るさは50のままです。
以下をフレアの明るさに適用しました。

mini=0;
max=100;

P=effect("レンズフレア")("光源の位置");
C=[thisComp.width,thisComp.height];

Len=length(C,P);
linear(Len,mini,max,100,50);

どこをどう直せばいいのでしょうか。エクスプレッション初心者なのでわかりやすく教えていただけると助かります。よろしくお願いします。
99さん

なるほど見落としていました。

ありがとうございます!
>>98

横から失礼します。
ちょっと質問させて頂きたいのですが
よくlengthを見かけるのですが、
これはどういった意味を持つのでしょうか?

とある、サイトにおいて

「AfterFXにはベクトルの長さを求めるメソッドlengthが
 Mathオブジェクトに用意されています。
 引数にはベクトルを渡します。」

とありましたが、初心者の自分には何がなにやら・・・
申し訳ないですがご教授いただけないでしょうか?


ご質問させていただきます。
昨晩からエクスプレッションをさわりだしたばかりで、
まったくわかっておらず、申し訳ないのですが、
ご教授いただければと思います。



動きとしては、、、、
”イラストの鳥が右や左へ動くのですが、右に動く時は右向きに、
左に動く時は左にしたいのです。”



鳥のscaleに下記のエクスプレッションを書いたのですが、
4行目にエラーが出てしまいます。


エクスプレッションのイメージとしては
”もし現在のフレームの鳥のxポジションの値よりも、
1フレーム前の鳥のxポジションの値が大きければ、スケールを-75にする。”
と記述したつもりなのですが。


------------------------------------------------------------------------------------------
ab=thisComp.Layer("bard").position[0].valueAtTime(time);
ac=thisComp.Layer("bard").position[0].valueAtTime(time-1/30);
if ( ab<ac )
{scale[0],scale[1]}
else
{scale[0]-75,scale[1]}
------------------------------------------------------------------------------------------


何卒宜しくお願い致します。
>>103
全然動かしてないので、僕の指摘も合っているか微妙ですが。

>if ( ab<ac )
>{scale[0],scale[1]}
>else
>{scale[0]-75,scale[1]}
この部分に、ダメな点が3つあります。
結論だけ先に書きますと、

if ( ab<ac ) {
[scale[0],scale[1]];
} else {
[scale[0]-75,scale[1]];
}
になるかと思われます。

問題点1.
>{scale[0],scale[1]}
の"{"が全角になっている。コードは半角で書いてください。

問題点2.
{}のカッコは、ifやforで実行する命令のスコープ(範囲)を示すものです。
複数の値を一括りにする場合は[]を使用して、[値1,値2…]というように指定します。

問題点3.
値を返す部分に;(セミコロン)がありません。;をつけてください。

まずはプログラミング的な約束事を調べてください。
ドミンゴスさま

ab=position.valueAtTime(time);
ac=position.valueAtTime(time-1/30);
if ( ab[0]>=ac[0] )
[ scale[0],scale[1] ]
else
[ -scale[0],scale[1] ]

これで動いていると思います
ご参考までに
>>104様
>>105様

ありがとうございました!!!
鳥がいきいきと動き出しました!!!
感激です。

これからエクスプレッションのことを色々と
勉強していきたいですので、また今後とも宜しくお願い致します。
ドミンゴスさま

無事にイメージがカタチになったようでよかったです。

エラーの原因のひとつには、この体裁にあるようです。

ab=thisComp.Layer("bard").position[0].valueAtTime(time);

-------------

一般的に

thisComp.Layer("A").position
は
thisComp.Layer("A").position.valueAtTime(time)
と同じです。

現在の時間を参照するのが一般的だから、
(ということからだと思いますが)
valueAtTime(time)は省略可能になってます。

が、基本はそれがあるものとAEは考えていると思います。

次元をセレクトするわけですが
それを、positionとvalueAtTimeの間に入れてしまいますと
AEは?となるようです。

さきほどの回答例ではif文の条件の箇所で変数に次元をつけていましたが
下記のような体裁を1,2行目でとっても動くはずです。

thisComp.Layer("A").position.valueAtTime(time)[0]

-----------------------------
また、今回4行目でエラーが、とのことでしたが
エラーのコメントは
かならずしもあっていない事もあるようです。

問題の切り分けとして
1行目の結果をスライダ制御にいれて
数値が返ってくるか
そのとき、その値が予想内のものか
など流れの途中途中で
情報をモニターして
エラーの切り分けをするのも
ひとつの方法だと思います。

今回は一行目をスライダ制御に入れて
その結果をモニターしてみるとエラーになるはずです。

ご参考までに
モミー・テール様


御丁寧にありがとうございます。
とても勉強になります。今後の糧とさせていただきます。


S.ドミンゴス
ご報告までに、こちらでも問題なく動きました!
-------------------------------------------------------
ab=position.valueAtTime(time)[0];
ac=position.valueAtTime(time-1/30)[0];
if ( ab>=ac )
[ scale[0],scale[1] ]
else
[ -scale[0],scale[1] ]
-------------------------------------------------------
初歩的な事かもしれませんがエクスプレッションは得手では無いので
ご教示下さい。
レイヤーやカメラなどを時間によって動かすのによく使うのですが
位置プロパティに

value+[time*100,0]

等をよく使っています。
今回横にながーいレイヤーの上をカメラが走っていくのに使っていたのですが
最後にある時間が来たら止めたくなったのですが
1200フレーム(40秒)で動きを止めるにはどうしたらよいでしょうか?
エクスプレッションをキーフレームに変換しちゃえーと
やってみるとどうもカメラの動きがカクカクとなる箇所が出てきて困っています(><)
核爆発様

ありがとうございました。完璧です。
ちょこっと解説頂けるとさらに嬉しかったり♪
なぜに「?」が入るのかな〜と疑問に思っております。
核爆発様ではないですが


[(time > 40 ? 40 : time) * 100, 0]

まず上の文は簡単に言うと[X,Y]です。
それでXの値に

time>40? (時間は40秒より大きいか)
という条件がついていて、

40秒より大きかった場合には
40の値を返すとなっており、

40秒以下の場合には
time(現在時間)の値を返す

という形になっています。
シャム猫 様

なるほど。
40秒よりも大きいかどうかというのは
Time>40
だけかと思っていましたが
40秒より大きいときには40を返すというところで迷っておりました。

私はXYZでもXYでもこれをよく使っていましたので
この時間制御が出来るようになって非常に嬉しいです。
ありがとうございました。

ログインすると、残り87件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

After Effects 更新情報

After Effectsのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。