こんばんは、織田檸檬です。
現在、AEのエクスプレッションに大苦戦中です。
解読不能
コードはこちら
コードはdA-toolsさんにて公開されているコードをそのまま使っています。このトリガーっていうところの一番下にある、例2、マーカーの位置で振動っていうのを試しています。
上のGIFでいうと、青い丸のバウンドが、僕が適当につけたマーカーをトリガーにしてはずんでいます。
下記にソースコードを貼っておきます。
keyN = 0; shiftTime=0;
if (marker.numKeys){
keyN = marker.nearestKey(time).index;
if (marker.key(keyN).time > time) keyN--; }
if (keyN > 0) shiftTime = time - marker.key(keyN).time;
vel=50; amp = 50; decay = 2.0;
y=amp*Math.sin(vel*shiftTime)/Math.exp(decay*shiftTime);
position+[0,y]
意味を解読してみる
nearestKey(t)というのは、t秒目において、一番近いマーカーを取得するということらしいです。ここにtimeが入ると、現在時刻において一番近いマーカーを取得する、という意味になります。
ただそうすると、キーフレームのちょうど中間でnearestKey(time)の値が変わってしまうので、トリガーとしてはよろしくありません。なので、そこを調節してくれるのが最初の4行みたいです。
おそらくここで現在時刻よりも後に設定したマーカーを取得しないようにしているんだと思います。
僕は3行目のindexの意味がわからなかったのですが、解決しました。
nearestKey(time)の戻り値はMarkerkeyというものらしく、それには2つの属性があるみたいです。ひとつはtime属性、もうひとつはindex属性です。
なので、nearestKey(time)の時点ではtime属性とindex属性、両方もっているということになるみたいですね。
で、いまほしいのはindexのほうですから、.indexでindexにアクセスし、それをkeyNに代入していると。そういうことみたいです。
僕はnearestKey(time)の時点でマーカーの番号であるindexが入っているものだと思っていましたが違ったようです。マーカーには2つの属性がある。なるほどな。
太郎君には男属性、夫属性、父属性の3つの属性があるみたいな感じですね。マーカーはtimeとindexがあると。ふむふむ。
これでつぎの文、marker.key(keyN).time > timeで比較して現在時刻よりもあとのマーカーを取ってこないようにしているんですね。取得したマーカーのtimeが現在時刻よりも
大きかったら、まだそのマーカーは通過していないのだからkeyN--、1引いてねと書いてあります。(あってますかね)
ここまできたらあとは簡単で、現在時刻からマーカーのある時刻を引いて、その値を関数につっこむんですね。これでマーカーを打ったところで0になるので、いい感じに挙動するみたいです。
個人的に(keyN > 0)が気になってるんですよね。ていうかそもそもmarker.numKeysが条件式になってますけど、これってマーカーがあればってことで解釈していいんでしょうか。
keyNが0よりも大きければ処理、そうでなければ何もせずに通過ってことでいいんでしょうか。そしたら0フレーム目ってどうするんやろって思うんですけど。
まとめ
Markerkeyに属性が2つあるというのは、公式リファレンスを参照しました。
前にも言いましたが公式ドキュメント、公式リファレンスを見ろ。という一言に尽きますね。
それにしても疲れました。嫌いな食べ物をむっちゃ時間かけて食ったったみたいな感じです。
まだまだエクスプレッションと仲良くなるには程遠いなと思いました。
今日のGIFについて
レオルさんの動画のなかで集中線が出てくるところがあったのですが、あれどうやって作ってるんだろうとずっと悩んでいました。
今回はシェイプレイヤーで丸をつくり、線をつっこんで、破線にして、サイズと線幅を調節して3つの集中線をつくります。
しかしそれだと線が太すぎるのでそれをコピーし、角度をずらしてトラックマットしました。あとは親子関係にして完成と。こういう感じで作ってみました。