« お盆 | メイン | ムービーの制御構造の再検討 »

2005年08月12日

吉里吉里 ムービー拡張日誌2:: ムービーをゴリゴリ動かす

    

現在のセグメントループやピリオドイベントは表示されているイメージと完全に同じフレーム番号で制御できているわけではない。
過去にいろいろと書いたと思うが、フィルタグラフ内部で描画しようとしているフレームの正確なフレーム番号を取得する方法がわからなかったので、再生が開始されたフレーム番号と再生が開始されてからのフレーム数によって現在のフレーム番号を得ている。
これには問題があって、再生レートなどを変更するとフレーム番号が狂ってしまう。(倍速時ピリオドイベントが機能しない 参照)
そして、ズレを考慮して、フィルタグラフ外の描画イベントで現在のフレームと指示されたフレームに2フレーム以上差がある場合は、現在のフレームを使うようにしている。
ただし、ダブルバッファリングしているので、現在のフレームと指示されたフレームは、1フレームずれているはず。
この関係で1フレーム早くセグメントループやピリオドイベントが処理されることがありうる。
また、内部的な時間はフレームではなく、doubleやlong longだったりするので、そこで誤差が生じている可能性もある。
処理落ちもある程度考えられる。

つまり、何が言いたいかと言うと、完全にフレームをつめてつなげたムービーをゴリゴリ動かすと、変なフレームが見えて、ちらついてしまうことがあるってこと。
また、ムービーの終わり付近にセグメントループの終端フレームを設定すると、セグメントループよりも、ムービー終端のイベントが処理されることもある。
だから、ムービーをつなげてセグメントループなどで制御する場合は、ムービーの区切りの間に2フレーム程度余裕を設けた方が良い。
ムービー終端付近でセグメントループする時も最後に5フレーム程度入れておくとよさそう。
入れるダミーフレームは、直前のフレームと同じ物にしておくと違和感は少ないように感じる。
とは言っても、ムービー終端付近のセグメントループ以外は、それほど問題は発生しない様子。


ピリオドイベントは、指定フレーム(eventFrame)が描画された瞬間に発生する。
セグメントループの終端イベントは、終端フレーム(goFrame)が描画されるべき時に発生する。(実際にはそのフレームは描画されない)
ピリオドイベントには、ムービー区切りの終端フレームを指定し、セグメントループの終端フレーム(goFrame)には、ムービー区切りの終端の次のフレームを指定するようにしておくと良さそうだ。



投稿者 Takenori : 2005年08月12日 13:38




comments powered by Disqus
Total : Today : Yesterday : なかのひと