自作ARモーション・キャプチャ・システムを使った自主制作アニメの制作記。今回は1つ目のシーンが出来て、区切りがよいのでかなり長めに突っ込んだ話を書きます。
どうにか今日の昼の時点で、1シーン分動画を作成しました。まあ、課題は多いのですが、それでも大きな前進です。
● ここ数日のソフト開発
ほとんどが「バグ修正」でした。実際に動画を作り始めて操作をしていると、「意図しない動き」がちらほらと見つかってきます。
なので、そのバグや問題を逐次潰していました。これが作業の大半でした。
以下、その中でも大きな改良点を掲載しておきます。他、UIに関する細かな改良を大量に行っています。
・データの取得をスプライン補間に変更。
・データ連続性閾値を100msecから250msecに引き上げる。
・アルファ値付きの半透明画像が暗く合成されていたのでOpenGLの設定を変更。
● データ取得方法の変更
最初の2つは撮影した座標データの利用方法の変更です。
本ソフトでは、ARマーカーの情報は、時間付きの座標の数値として記録し、ファイルに書き出します。例えばこんな感じです(実際のデータも時間は等間隔ではなく不連続です)。
時間(msec),座標X、座標Y,…
33,0.111,0.234,…
55,0.111,0.234,…
80,0.111,0.234,…
87,0.111,0.234,…
動画の再生やレンダリング時はこのデータを読み込んで、現在時間の座標を計算で求めて描画を行います。
問題は、この「時間」が「等間隔ではない」「不連続なデータ」であり、かつ「時間と時間の間のデータは存在しない」ことです。
最初の頃は、前後の時間から推測して現在の座標を求めるということをやっていました。図にすると以下のような感じです。
+時間1
|
+時間2
|
|・座標を求めたい時間(時間2と時間3の距離から座標を計算)
|
+時間3
まあ、これで大丈夫だろうと思っていたのですが、実際に動画を作り始めると、これでは問題が生じました。
問題とは、座標にかなりの誤差があり、そのまま計算すると、座標がカクカクしたり、レコードの音飛びのように座標が飛んでしまったりすることです。
それで、どうしようかと考え、各種アルゴリズムを検討しました。
最終的に、「時間」と「任意の座標」の二次元の数値を利用して「スプライン補間」を行うことにしました。この方法なら、動きは滑らかになり、ノイズはある程度軽減されます。
図にすると以下のような感じです。
:::::| 時間1と座標Aの値
:::|
::|
:|
:|
:| 時間2と座標Aの値
::|
:::| ←作成した曲線から、任意の時間の座標Aの値を取得
:::::|
:::::::| 時間3と座標Aの値
スプライン補間は、「Apache Commons Math」のライブラリを利用すれば簡単に行うことができます。この方法を使って、動画の滑らかさを上げました。座標飛びも軽減できました。
ただ、単純にスプライン補間を行うと、「データが存在しない時間も自動的に補間」されてしまうという問題が発生します。
たとえば、素早く画面外にマーカーを出して、数秒後に戻した場合、その期間にマーカーが存在していたかのように補間されてしまいます。
なので、一定時間以上データがない区間があれば、「データ無し」と見なす処理も入れています。
これは、当初100msecを閾値にしていたのですが、実際に得られるデータが100msec以上開きがある場合があったので250msecに幅を広げました。
● アルファ値付きの半透明画像が暗く合成されていた
たとえば「雲」のように、白色とアルファ値でできたPNG画像をOpenGLで合成しようとすると「きれいな白」ではなく、「うすぼんやりとした灰色」になってしまいます。
どうしたものかと思って調べていると、「glBlendFunc」と「glColor4f」の設定を変えるとよいという情報を得ました。
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1.0f, 1.0f, 1.0f, alpha);
としていたのを、以下のようにすると解決します。
gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA);
gl.glColor4f(alpha, alpha, alpha, alpha);
けっこうはまっていたので、解決方法をここに書いておきます。
● 動画作成(カットの作成と出力)
出来上がった動画を見てみて分かったのですが、一枚ぺらの絵を動かす場合は、表面のテクスチャ(質感)がかなり重要です。
画面内の占有面積が広いオブジェクトがのっぺりしていると、それだけで動画が退屈になります。
これは今後の絵を描く際の課題だなと思いました。
あと、「ARマーカー利用のモーション・キャプチャ・システム」を作った割には、ARマーカーを使わずに撮っているカットが多いです。
単純な動きだと、数値指定の方が速いということも分かりました。
● 動画編集
本ソフトは動画を作る機能だけで、複数の動画を繋げたり音声を合成する機能はありません。
この「動画編集」を、どのソフトで行えば一番よいのか分からず、かなり試行錯誤しました。
○ NiVE
まず最初は「NiVE」(NicoVisualEffects)を利用してみました。ニコニコ動画の方面で作成されたフリーソフトで、様々な動画エフェクトを行えることがウリになっています。
しかし、2点の理由から使用を諦めました。
1点目の理由は、プレビュー段階で音の確認がほとんど行えず、レンダリングして確認する場合も、そのレンダリング範囲を、その都度簡単に選べないことです。
音を結合して編集を行いたいから、動画編集ソフトを使うわけで、その使い勝手が悪いのは、ちょっと痛いです。
2点目は、作成した動画を出力すると2.5GBを超えてしまい、それだけでなく、動画生成が正常に終了せず、エラーになってしまったことです。
ソフトの説明を見ると、2GBを超えるAVI出力はできないと。たぶん、無圧縮で出力しているのだと思います。
作成している動画は1分半ほどです。これでは先が思いやられます。というわけで「NiVE」の使用は諦めました。
○ Windows ムービーメーカー
次に試したのは、Windows標準搭載のムービーメーカーです。これは、マルチトラック編集ができなかったので諦めました。さすがに、音声の合成ができないのは使い勝手が悪すぎです。というわけで、次のソフトに行きました。
○ AviUtl
□AviUtlのお部屋 最後は、AVIの加工にいつも使っている「AviUtl」です。
ネットで情報を調べていると、どうやら「AviUtl」は、公式ページにある「拡張編集Plugin」を入れて、[設定]−[拡張編集の設定]を選ぶと、動画のタイムライン編集ができるようです。
というわけで拡張編集を導入すると、動画や音声のタイムライン編集が手軽にできるようになりました。プレビューも簡単に範囲指定できるし、出力も早いしで申し分ありません。なので、このソフトで作業を行うことにしました。
ただ、難もあり、音声の「音量」を設定しても反映されず、先にwaveファイルを直接加工しておかなくてはなりませんでした。
出力設定は、以下にしました。もっとよい設定があるかもしれないですが、これは現在模索中です。
・ビデオ圧縮
再圧縮無し(チェック無し)
Microsoft Video 1 (圧縮の品質:100、キーフレーム:0)
・オーディオ圧縮
再圧縮無し(チェック無し)
音声なし(チェック無し)
PCM 8.000K Hz 1ch
● 動画編集2
さて、動画編集を「AviUtl」で行ったのですが、いくつか問題点が発覚しました。
まず、作っていた動画素材の長さが短かったことです。これはちょっと予定外でした。とりあえずは在り物の素材で動画を作り、早朝にアップしました。
その後、一眠りして、午前中にもう一度動画素材を作り直して再編集しました。そして編集作業を行い、動画を完成させました。そしてYoutubeにアップしました。
(動画とは別に、音声についても問題が発生したのですが、それについては後述します)
● 動画の圧縮
早朝に最初の動画をアップしたのですが、これはAVIファイルで350MBありました。おかげでアップロードに2時間掛かりました。
さすがにこれは無理目だろうと思い、圧縮してアップすることにしました。ただ、過去の経験で、圧縮した動画をYoutubeにアップすると、エラーが出ることが多かったので心配でした。
今回、動画の圧縮には「BatchDOO!」を利用しました。
□BatchDOO! 設定は「iPad向け-H.264(高画質)」を選び、音声のチャンネルだけ1チャンネルに変更しました。
この設定で、673MBの動画が29.5MBに圧縮されました。劣化は見てもあまり分かりません。
こうして作成した動画をYoutubeにアップすると、エラーは発生せずにそのまま公開できました。
ただ、公開用の変換作業がAVIファイルよりも掛かるようで、アップ後、公開できるまでにかなりの時間が掛かりました。
● 音声
音声関係は全て、マイクで音を取り込んで、「SoundEngine Free」で加工しました。
□SoundEngine Free うーん、音については課題がいっぱいです。
○ ノイズ
まず、スタジオでも何でもない場所で録音しているのでノイズが入っていますです。ノーマライズ(音の正規化)をすると、ノイズが目立ちます。
今回、タイムライン編集をしたあと、音声のところと非音声のとこのノイズ差があまりにも大きかったので、環境音として動画の全てにノイズを入れて差をなくしました。
これは何とか解決して手法を確立したいところです。
○ 声のピッチシフト(ボイスチェンジャー)
あとはまあ、全部の音を(効果音や環境音も)私の声で作っているので、「声」自体の問題があります。
女性キャラの声はピッチを上げて作っているのですが、人間の声ってピッチを上げると変なリバーブみたいな音割れが発生するんですよね。
この問題は、ピッチを大きく変えるほど顕在化します。
有料ソフトの試用版や無料ソフトのボイスチェンジャー機能を色々と試したのですが、これといった解決方法はありませんでした。
こういった音割れを発生させずに音の高さを変える方法も一応あります。
池田幹男氏の開発された「PICOLA」というアルゴリズムがありまして、こちらで音を伸張させた後、再生時間を短くすれば、クリアな音声のまま、声を高音にできます。
□PICOLA 一時期、この「PICOLA」や「FFT」(高速フーリエ変換)などのアルゴリズムで音声を加工するプログラミング実験を行っていたので、その頃のライブラリを引っ張り出してきて実験を行いました。
高音にはなるけど、女性風の声にはならない…。
ただ、音割れは防げるので、今後更なる実験を行い、上手い設定やしゃべり方を見つけたいところです。
○ 音楽
著作権的にフリーな音楽を探して、利用表示を行って利用するということを検討しないといけないです。
ただ音楽は、シーンに適合したものを探すとなると、それこそ一日がかりの作業になります。過去にゲーム開発で何度か経験があるので…。
またYoutubeなどにアップする動画では著作権がらみの問題も色々とあります。そのため今後どうしようかと思案中です。
● 作業途中の各カット
最後に、ここ数日に作成したカットも貼っておきます。まだサイトからはリンクを貼っていなかったですので。
というわけで、細々とですが、作業を進めています。