口の開閉については以下の3通りに大きく分類されます。 以下は、リップシンク(口パク)の制御をパラメータ「PARAM_MOUTH_OPEN_Y」として作った場合を前提にしております。
1.リアルタイムで音量を取得し、口の開閉度を直接指定する方式 model->setParamFloat("PARAM_MOUTH_OPEN_Y" , xxxx ) ;//.....(A1) model->update() より前で setParamFloat()の第2引数に直接0~1の値を設定することで口パクの量を制御できます。
iPhone / Android2.3以降(※)は、再生中の音量をリアルタイムに取得できます。 取得した再生中の音量の値を 0..1の範囲に加工して、その値を上記の命令で設定するとリップシンクさせることができます。 (標準パラメータ設定の通り、口の開閉は 0 から 1 のパラメータで作成しているため) 設定する値は0未満、もしくは1以上でもエラーにはなりませんが、その場合リップシンクが正しく動作しない場合があります。
(※):Android2.2以前については実行時に再生中の音量を取得することはできません。 その他のプラットフォーム(PSPなど)でリアルタイムに音量が取得できるか否かは、音声再生のライブラリに依存します。
2.リップシンク用の音量データを使って設定する方式リップシンク用の情報を何らかのかたちで抽出しておき、1と同じように設定する方式です。
3.リップシンク用の情報を持ったモーション(.mtn)を使う方式
アニメータまたは「 リップシンク用音量抽出ツール 」でリップシンクを含む .mtn を作成し、モーションを再生することでリップシンクを制御します。
基本的には、 通常のモーションとリップシンク用のモーションを同時に再生する形になります。 他のモーションとリップシンクを分けるため、リップシンクだけを管理するためのMotionQueueManagerインスタンスを生成して使います。 mtnファイルであればライブラリでは区別なく扱われるので、通常のモーション再生の部分をコピーしていく形で実装できます。
※この方式の場合、上記(A1)のように直接"PARAM_MOUTH_OPEN_Y"を更新する処理があればコメントアウトする必要があります。
念の為Live2Dが関係するソース全体を「PARAM_MOUTH_OPEN_Y」で検索して確認することをお勧めします。 また、通常のモーションのあとに更新しないとリップシンクが上書きされる可能性があります。
Java風の擬似コードだと以下のようになります。
---モーションの管理クラスの追加-------------------------------------------------------------private MotionQueueManager mainMotionMgr = new MotionQueueManager () ;//通常mtn用 private MotionQueueManager mouthMotionMgr= new MotionQueueManager ();//リップシンクmtn用
---更新の追加。--------------------------------------------------------------------------------- mainMotionMgr.updateParam( model ) //メインの動きを設定。 /* リップシンク用モーションの更新 */ mouthMotionMgr.updateParam( model );
---モーションの再生。------------------------------------------------------------------------- //リップシンク用のmtnから読み込んだモーションを再生。通常のモーションと同様。 mouthMotionMgr.startMotion( motion , false ) ;
|
|