2008/8/2 (土)
RAネタ、その8b「コンポジションの尺を変更」
ちょっと間があきましたが、RAネタその8のb‥‥です。
前回の「コンポジションの尺を変更する」スクリプトは、尺を伸ばした分だけ空白になってしまう事が問題でした。

そこで、スクリプト内に以下の処理命令を追加・組み込みます。
//変数itmには当該コンポジションが代入されています
for(var l=1;l<=itm.numLayers;l++){
itm.layer(l).outPoint=itm.duration;
}
すると、ちゃんと全てのレイヤーがちゃんとコンポジションの最後まで延長されるようになります。

これで、めでたし、めでたし‥‥と言いたいところですが、実はこの処理はとんでもなく大きな「穴」があります。
例えば、以下のようなコンポジションがあったとします。

作業慣れしている人なら、すぐに「このコンポジションにおいては、一定区間ごとにレイヤーを分割してオペレーションしている」と読み取る訳ですが、コンピュータはそうはいきません。命令に書いていない事‥‥つまり、「作業経験から憶測する」事など、ゼロからは実行できません。単純に、先ほどのスクリプトを実行すると、以下の様にとんでもない「余計なお世話」を実行してくれちゃいます。

レイヤーを分割したのが、まるで台無し。薬よりも毒のほうが多いスクリプトになってしまいました。こんなスクリプトを実行してしまったら、全てのコンポジションを泣く泣く手作業で修復するハメになります。
ここで一考。作業者は「何を見て」レイヤーを伸ばすべきか否かを判断しているのでしょう。まさかインスピレーションではあるまい。
ずばり、作業者は「レイヤーのアウト点が、コンポジションのエンド点と同一もしくは以上か」を判断基準として、レイヤーを伸ばすか伸ばさないか決断しています。つまり、レイヤーの長さ(時間長)がコンポジションの終わりまで続いている場合は、そのレイヤーの絵が最後のコマ(フレーム)まで必要だ‥‥と言う事なので、都合、「レイヤーを伸ばす必要が生じる」‥‥と判断している訳です。もちろん、全ての事例においてその判断基準でオペレーションしている訳ではありませんが、少なくともコンポジションのタイムラインウィンドウの状態をパッと見て判断する場合は、「レイヤーの尻の状態」を見て判断します。
スクリプトで処理する場合、こうした「人間の判断基準」を処理内容に組み込まない限り、スクリプトの命令通り律儀に動作するコンピュータはいつまでも「おバカさん」のままです。
ではとりあえず、その問題点を克服するスクリプトを書いてみましょう。「レイヤーのアウト点が、コンポジションのエンド点と同一もしくは以上か?」でIF分岐を作ってみます。
for(var l=1;l<=itm.numLayers;l++){
if(itm.layer(l).outPoint>=itm.duration){
itm.layer(l).outPoint=itm.duration;
}
}
うまくいった‥‥ように見えますが、実際に動かすと、レイヤーのアウト点はうんともすんとも反応しません。何故でしょうか?

*上図のコンポジションにスクリプトを実行しても、何も変化がおこらない‥‥
答えは簡単。「コンポジションの尺を伸ばした後では、レイヤーのアウト点とコンポジションのエンド点の関係は変わっている」からです。コンポジションの尺を伸ばす前、つまり「オリジナルの状態」の時点でレイヤーのアウト点を調べなければイケないのです。コンポジションの尺を伸ばした後では、「コンポジションのエンド点と同一もしくは以上か?」なんて判断できない状況に陥っているのです。
では、その不具合を克服するスクリプトに書き換えてみましょう。
//各変数については、前回のスクリプトを参照
for(var l=1;l<=itm.numLayers;l++){
if(itm.layer(l).outPoint>=itm.duration){
itm.layer(l).outPoint=modDur;
}
}
itm.duration=modDur;//ここで初めてコンポの尺を変更
結果は以下の通り。

うまくいった‥‥様に見えます。しかし、これでもやっぱりポッカリと「大きな穴」が残されています。その大きな穴を修復するには、現状の「コンポジションの尺を変更する」程度の意識ではなく、発想の転換が必要となってきます。‥‥そこらへんのちょっとややこしい話は、次の「その8c」にて。

