コンポジションをloopOut()した際のちょっとした手間を削減するスクリプトです。
「エクスプレッションで簡単ループ」のスクリプト化です。
[チュートリアル動画]
あったらヤなチュートリアルを作りました。スクリプトの動きと概要を掴めます。
[概要]
動画はプロジェクトウィンドウでループ化できますが、コンポジションはループ設定がないため、タイムリマップでループさせることになります。
実際に行ったことがある方はお分かりかと思いますが、コンポジションにタイムリマップを適用すると、最終フレームのキーフレームはコンポジションの最終フレーム+1(存在していない空のフレーム)となってしまうため、最後から1フレーム前にキーを追加し、最終フレームのキーフレームを削除、最後にエクスプレッション「loopOut()」を仕込むことになります…。
なんでなの?ねぇなんでなの?
さらにこの状態だとたまにループ状態のどこかのフレームが飛ぶ謎の仕様があります。
なんでなの?ねぇなんでなの?
これも回避しましょう。
案件中はこの時間も惜しいと感じてきますので、スクリプト実行だけで済ませましょう。
[使い方]
- ループさせたいレイヤーを全選択する
- スクリプトを実行する。
[注意点]
- 選択レイヤーの内、タイムリマップを適用できないレイヤーはスキップされます
- 元素材のフレームレートは配置する使用コンポジションと一致させてください
[解説]
var actCmp=app.project.activeItem;
var sel=actCmp.selectedLayers;
function f_tRemapLooper(){
for(i=0;i<sel.length;i++){
if(sel[i].canSetTimeRemapEnabled==true){
var out=sel[i].outPoint;
sel[i].timeRemapEnabled = false;
sel[i].timeRemapEnabled = true;
sel[i].timeRemap.addKey(out-(actCmp.frameDuration));
sel[i].timeRemap.setValueAtTime(out,0);
sel[i].timeRemap.expression=
'loopOut();';
}
}//for
}
app.beginUndoGroup("tRemapLooper");
f_tRemapLooper();
app.endUndoGroup();
「.canSetTimeRemapEnabled==true」で選択レイヤーがタイムリマップに対応している場合のみ処理をしてエラーを回避します。
また、すでにタイムリマップで停止したキーフレームが設定されているなど、意図しない処理になることを防ぐため、「timeRemapEnabled = false;」「timeRemapEnabled = true;」で一瞬タイムリマップを解除し再度タイムリマップをデフォルト状態で適用します。
「addKey」でタイムリマップをONにした直後の最後のキーフレームから1フレーム前にキーフレームを追加し、元々ある最後のキーフレームには「0」を設定し直します。
これで1秒(0~29フレーム)のコンポジションに、0、29、0という3つのキーフレームが設定されました。
直感的にはキーフレームは0、29の2つのみでいいのですが、これでloopOutするとどこかで1フレーム飛ぶ可能性があるのです。
キーフレームを3つにすると回避できるという謎な仕様があるので上記のような処理にしています。
稀にこれでも飛ぶフレームがある場合、キャッシュが悪さをしていることが多いです。キャッシュを削除してみてください。
この記事へのコメントはありません。