リンクをクリップボードにコピー
コピー完了
タイムリマップを使用して、パラパラアニメを作っているのですが、不思議な挙動をします。
例えば、下図の様に、口、眉、目のコンポジションを持ったMainのコンポジションがあるとします。
各コンポジションはパラパラアニメをするために、フレーム単位でパターンの絵を格納しています。
例えば、目のコンポジションは
0フレーム目:目開き
1フレーム目:目閉じ
例えば、口のコンポジションは
0フレーム目:口閉じ
1フレーム目:口開き
等々…
これらをMainのコンポジションでキーを打ち込んでパラパラアニメを作っています。
大抵の場合、うまくいくのですが、まったく法則が特定できないバグり方をしてしまいます。
目には20フレーム(20個の絵のパターン)の情報を格納しているのですが、Mainのコンポジションで目のキーに10の値のキーを打ち込むと、
目のレイヤーは正常に指定したキーの絵が表示されるのですが、なぜかほかのレイヤー(例えば口のレイヤー)の絵も変わります。
ほかのレイヤーにはそのタイミングではキーは存在しないので、絵が変わるはずがないのにも関わらず、ほかの絵が表示されます。
この状況になると、明示的に口のレイヤーにキーを打ち込んだとしても、その値は無視されるのか、おかしなパターンのままになってしまいます。
上図では、エモーションにタイム「6」の値を入れて絵のパターンを変更した時なのですが、キーを打ち込んでいない口のパターンもなぜか変わってしまいます。
ほかのレイヤーなのに何故エモーションのタイムラインが影響を与えてくるのか謎です。
この状態で、口のコンポジションに入り、調整レイヤーを追加すると治ったりします。治らない時もあります。
ほかのコンポジションのタイムラインの数が狂うような挙動をしているような感じです。
口のコンポジションは以下のようになっています。
調整レイヤーを増やしたり、減らしたりして、アフターエフェクトのプログラムにこのコンポジションが持つレイヤー数にタッチしてやると、
正常に動く得もあったり、そのような謎の挙動をします。
また、この現象が発生するのは常にというわけでなく、コンポジションの長さ、キーの数、レイヤーの数によって変わるようにも思えます。
最初はキーの値の誤差(浮動小数点数の丸め込みによるバグ)かと思ったのですが、ほかのレイヤーに影響を与えているので、
そういうものではなく、コンポジションが管理しているレイヤー数の管理プログラム付近に何かしら問題を抱えているのではないか?と疑っています。
このような現象に見舞われた方がいらっしゃいましたら、回避方法などご教授していただけますと助かります。
また、この現象は ノートPC、デスクトップPC等、異なる環境でも発生していますので、どこでも起こりえる現象のようです。
問題が発生するアフターエフェクトのプロジェクト一式をお渡しすることもできます。
リンクをクリップボードにコピー
コピー完了
レイヤーのタイムリマップをクリックしてから、グラフエディッターを開いて動作を確認してはどうでしょうか。
リンクをクリップボードにコピー
コピー完了
アドバイスしていただきありがとうございます。
グラフエディタを開いてみたところ、特に問題はありませんでした。
グラフエディタ上でも 0 の値になっているものの、表示されている絵は別の値のものとなっていました。
そこで、もう少し調べてみたところ、キーを手入力したのと、スクリプト上から設定したもので挙動が異なるという事が分かりました。
タイムリマップに直接手で、6と打ち込むのと、
スクリプトの命令で、以下のような感じで数値をセットする
レイヤー.timeRemap.setValueAtTime(app.project.activeItem.time,6*app.project.activeItem.frameDuration);
では挙動が異なる様で、直接入力時は問題ないものの、スクリプトを通して数値を設定するとダメなようでした。
タイムライン上では同じ数値、同じ挙動のように見えたものの、内部的で何か妙なことが起こったのかもしれません。
スクリプト経由という事をお伝えし忘れていたことをお詫びいたします。
不思議なのはスクリプト上で0~5、7~8は問題ないのに、6の値が入ったときだけほかのレイヤーが狂うという謎があります。
スクリプトは1行だけ、指定した数値をsetValueAtTimeに渡していれているだけなので、特別なロジックもなく、妙なことは起こりそうにはないのですが、、、謎です。
またスクリプトは、ボタンを押したらそのボタンにあった数値が打ち込まれるというシンプルなものとなっています。
スクリプトも添付したかったのですが、Zip添付はできないようですね、、、
上記のような感じで、ラジオボタンを選択すればそれに見合った数値がsetValueAtTimeに渡されるというようなノリの処理となっています。
rbExt05.onClick =function (){setRemKeyExt(4);}
rbExt06.onClick =function (){setRemKeyExt(5);}
rbExt07.onClick =function (){setRemKeyExt(6);}
function setRemKeyExt(num)
{
LayerExtent.timeRemap.setValueAtTime(app.project.activeItem.time,num*app.project.activeItem.frameDuration);
}
上記のようなノリで、引数も直値でとなっていて、6が入ったらほかのレイヤーがおかしくなる…という状況です。
リンクをクリップボードにコピー
コピー完了
Photoshopファイルを配置しているコンポジションをプリレンダリングしてみるのはどうでしょう
リンクをクリップボードにコピー
コピー完了
ありがとうございます!!
プリレンダリングしておくことで、問題が解決できました。
スクリプト経由で設定してもおかしなことが起こらなくなりました。
助かりました!
本当にありがとうございました。
リンクをクリップボードにコピー
コピー完了
お役に立てて良かったです。
読み込み方法を変更すれば、プリレンダリングが不要になるかもしれません。
Photoshopの書き出しで「レイヤーからファイル」を選択すると、レイヤーごとにPSDファイルが作成されるので、After Effectsで連番シーケンスファイルとして読み込めます。
ただし、ファイル名の番号の後ろにレイヤー名が入っていると連番にならないので、修正が必要です。