tSlave - タイミングスレーブ [[AEexpression]]
目次
タイミングスレーブ AEexpression
概要
任意のタイムラインのキーと値を参照して、タイミングに置き換えるエクスプレッションです。任意のコマうち対応アーカイブとか特にないです。必要な方は「お道具箱」の以下のページでコピペするですよ。
http://homepage.mac.com/nekomata_ya/tools/documents/AEexpression.html
説明
このエクスプレッションは、ターゲットにしたタイムラインのキーと値を読んで、 その区間のどの辺にいるのかを自分のレイヤの「タイミング」(値でなく時間軸)に置き換えるエクスプレッションです。複数のタイムライン(位置と透明度と回転を同タイミングで変化)とか複数のレイヤを同時制御する時に使えます。
デフォルトでは、スライダの値を読むようになっていますが、冒頭の値を書き換えてお好きなタイムラインの値を使用できます。
読み取る値は1次元の値だけなので、まだちょっと使い勝手は良くないかも。
コマうちの制御は、専用の「スライダ」タイムラインを作成してお使いください。
値の差を読んでいるので、参照する前後のキーの値が同じ場合は、動きが止まってしまいます。参照用のスライダを作成する場合は、必ず前後のキーの値を変えておいてください。
ソース
var targetTimeline=effect("マスコン").param("スライダ"); // ここに対象タイムラインをピックウィップします。通常はマスコンで var skipTimeline=effect("フレームスキップ").param("スライダ"); // コマうち設定"スライダ制御"が必要です。 /* tSlave 2005/12/04 Nekomataya/kiyo $Id: tSlave.js,v 1.2 2005/12/04 20:17:18 kiyo Exp $ 任意のタイムラインのキーと値を参照して、タイミングに置き換えるエクスプレッション。 任意のコマうち対応 被参照側にキーが存在しない場合当該レイヤのキーに設定された本来の値とズレることがあります。 --- おことわり このプログラムの著作権は「ねこまたや」にあります。 あなたは、このプログラムのこの著作権表示を改変しないかぎり 自由にプログラムの使用・複製・再配布などを行うことができます。 あなたは、このプログラムを自己の目的にしたがって改造することができます。 その場合、このプログラムを改造したものであることを明記して、この著作権表示を 添付するように努めてください。 このプログラムを使うも使わないもあなたの自由なのです。 作者はこのプログラムを使用したことによって起きたいかなる 不利益に対しても責任を負いません。 あなたは、あなたの判断と責任においてこのプログラムを使用するのです。 なんか、困ったことがあったら以下で連絡してもらえると何とかなるかもしれません。 http://homepage2.nifty.com/Nekomata/bbs2/ 12/03 タイミングまねっこエクスプレッション 12/04 コマうち拡張 */ function kac(StartSize,EndSize,timingValue) { if (timingValue == 0 || timingValue == 1){ if (timingValue == 0) {resultS = StartSize}; if (timingValue == 1) {resultS = EndSize}; } else { resultS = StartSize / ((((StartSize/EndSize) - 1) * timingValue) + 1); }; return (resultS); }; //出力変数の初期化 var Result=this.value_at_time(time); var timingV=0; //参照すべきキーの総数を求める。 //失敗した時(キーまたはレイア自体がない場合)は、値を0に初期化して終了 var maxIndex = targetTimeline.num_keys if ( maxIndex != 0) { // 再近接のキーの時間とインデックスを求める nKeyT = targetTimeline.nearest_key(time); nKeyS = skipTimeline.nearest_key(time); // 現在時と比較して前キーの値と後ろキーのインデックスを求める。 // 最少キーの前と最終キーの後ろは前後キーに同じ値を代入 if( time >= nKeyT.time ) { var preIndex = nKeyT.index;var postIndex = nKeyT.index + 1; if(postIndex > maxIndex){postIndex = maxIndex} }else{ var postIndex = nKeyT.index;var preIndex = nKeyT.index - 1; if(preIndex == 0){preIndex = 1} } var skipPreIndex =( time >= nKeyS.time || nKeyS.index == 1)? nKeyS.index : nKeyS.index - 1; // 前後キーが一致している場合は、無条件で最近接キーの値を引き継いで終了 // 位置情報は、現時点のリニア位置情報 if(preIndex == postIndex) { Result=this.value_at_time(nKeyT.time); } else { //ステップ係数を取得 ステップ係数にしたがって算定用の時間オブジェクトを生成 //ステップ係数は、フレーム継続時間に掛ける値。スキップ0なら1、11なら12 var StepValue = Math.abs(skipTimeline.key(skipPreIndex).value) + 1; var StepShift= this_comp.frame_duration*((skipTimeline.key(skipPreIndex).time/this_comp.frame_duration)%StepValue); //現在時間をステッピングする if (StepValue <=1){var Stepedtime = time} else { var Stepedtime= Math.floor((time + StepShift)/(this_comp.frame_duration * StepValue)) * (this_comp.frame_duration * StepValue); } //前と後ろのキーフレームオブジェクトを取得 preKey = targetTimeline.key(preIndex); postKey = targetTimeline.key(postIndex); /* タイミング係数の分母を得るために前後キーの差をとっているので、 前後キーの値が同一だとゼロ除算エラーになる 回避のため前後キーの値が同一の場合、現時点のリニア情報を返す */ if(preKey.value == postKey.value){ Result=this_layer.value_at_time(time) } else { //スライダの値から現在のタイミング値を取得 //マスタのステップ値からタイミング変数をとる timingV=Math.abs(targetTimeline.value_at_time(Stepedtime)-preKey.value)/Math.abs(postKey.value - preKey.value); /* タイミングを重ねたスケールを算出 var Ptiming=Math.abs(targetTimeline.value_at_time(Stepedtime) - preKey.value)/Math.abs(postKey.value - preKey.value); outputScale=kac(preKey.value,postKey.value,Ptiming); var timingV=Math.abs(outputScale-preKey.value)/Math.abs(postKey.value - preKey.value); */ //タイミング助変数をもとにタイミングを補正 Result=this.value_at_time(preKey.time+timingV*(postKey.time-preKey.time)); }}} // Result
Powered by YukiWiki 2.1.2a / Modified by Nekomataya.