MRが楽しい

MRやVRについて学習したことを書き残す

hololensでMMDモデルにダンスを踊ってもらう

今回はMMDモデルのダンス枠です。
前回ユニティちゃんにPerfumeを踊ってもらうことができたので、MMDモデルに踊ってもらうことに技術的な新要素はありません。
bluebirdofoz.hatenablog.com

(追記)
あわわ。本記事内の注意書きが足りないとのツッコミに気付いて追記です。
MMDの利用の注意点について以下の記事で述べています。MMD系の技術は利用前に必ずツール、モデル、モーション毎の利用規約の確認をお願いします。
bluebirdofoz.hatenablog.com

さて、それでもMMDを使いたいと考えるのはキャラクタの完成度、ひいてはダンスの完成度が非常に高いからです。
純粋な観客として見たとき、PerfumeのダンスとMMDのダンスのどちらに感動するかと自身に問いてみると、やはりMMDです。
技術的にどちらが凄いかなんて観客は知ったこっちゃありません。難儀です。

さて、話を戻します。

まず、MMD4Mecanimの使用ですが、やはり取りやめました。
理由としてはhololens向けにビルドしようとしたところ、大量のエラーが発生したためです。
f:id:bluebirdofoz:20170717061438j:plain
以下のメッセージを見ると、意図的に利用できないようにしているようです。
f:id:bluebirdofoz:20170717061446j:plain

よって今回のテストプレイにはBlenderのアドオンであるmmd_toolsを利用しています。
github.com

基本的に以下の記事で実施した内容の再実施ですが、新たに確認した情報を備忘録として残しておきます。
bluebirdofoz.hatenablog.com

まずmmd_tools取り込み後、以下の Build ボタンを押すことで剛体シミュレーションが行えるようになります。
f:id:bluebirdofoz:20170717061513j:plain
分かりやすく言えば、キャラクタの髪などの揺れ表現を実現します。
キャラクタをダンスで利用する際は有効にしておいた方がいいでしょう。

Unityに取り込むとColliderがセットで付いてきますが、Colliderは関連していないようなので消してしまっても剛体モーションは動作します。
f:id:bluebirdofoz:20170717061533j:plain

エクスポートしたFBXファイルを取り込む際の注意点です。
自分の場合そのまま新規プロジェクトに取り込むとキャラクタのテクスチャが取り込めていませんでした。
f:id:bluebirdofoz:20170717061542j:plain
予め、テクスチャファイルを用意した上でインポートする必要があるようです。
f:id:bluebirdofoz:20170717061550j:plain

次に、mmd_toolsで読み込んだキャラデータは1m=1posの大きさになっていません。
基準となるオブジェクトがないので目安ですが、大体サイズを0.4倍しておけばそれっぽいサイズになります。
f:id:bluebirdofoz:20170717061559j:plain

そうして、ようやくhololens上で動きを見ることができました……が。
動きがカックカックです。止まると言う程ではありませんが、大きな動きをするダンスだと流石に気になります。
録画なんぞしたらコマ送りになりそうな勢いです。

そもそもMMDモデルとモーションは元々高性能なPCで時間をかけてレンダリングすることを想定しています。
hololensの中でリアルタイムに演算させたらこうなるのは当然でした。

となれば、プログラムを軽量化するほかありません。
ツールが何であれ。結局のところ、調整が必要ということですね。
調整方針の決定のために、まずはhololens上での処理負荷の原因について探ります。

比較のため、以下の4種類のモデルを用意しました。

1.2万ポリゴン、剛体モーションありのモデル
2.2万ポリゴン、剛体モーションなしのモデル
3.2千ポリゴン、剛体モーションありのモデル
4.2千ポリゴン、剛体モーションなしのモデル

ポリゴン数の削減についてはなるべく他の要素は等価になるよう、BlenderのDecimateモディファイアを利用しています。
シェーダについてはmmd_tools利用時だとStandardのシェーダが利用されていたため、とりあえずそのままとしました。

これらのモデルでhololens上の動作確認を実施しします。早速、以下のチュートリアルで学んだProfilerが役立ちます。
bluebirdofoz.hatenablog.com

目安としてオブジェクトが何もない状態のPlofilerを貼付します。
f:id:bluebirdofoz:20170717163324j:plain
通常時は凡そ100fps。fpsが落ちている不安定な後半部分は顔振りを試しています。

それぞれのモデルをhololens上で躍らせた結果、以下の通りとなりました。

1.2万ポリゴン、剛体モーションありのモデル
f:id:bluebirdofoz:20170717163336j:plain
15fps以下のまま。

2.2万ポリゴン、剛体モーションありのモデル
f:id:bluebirdofoz:20170717163359j:plain
15fps以下のまま。

3.2千ポリゴン、剛体モーションありのモデル
f:id:bluebirdofoz:20170717163412j:plain
凡そ30fps。

4.2千ポリゴン、剛体モーションなしのモデル
f:id:bluebirdofoz:20170717163422j:plain
凡そ30fps。

ポリゴン数の変化は顕著に影響が出ます。逆に剛体モーションのありなしはそれほど問題ではないようです。
処理箇所を見比べると、Graphics.PresentAndSyncの処理が大きく変化しています。
合わせてCPUの方を確認すると、HololensWaitForGPUの処理時間が長いことが分かります。
f:id:bluebirdofoz:20170717163611j:plain
1.2万ポリゴン、剛体モーションありのモデル 実行時のCPU状況です

半ば分かっていたことですが、原因はGPU側やはり描画の問題の方が大きいということですね。
おいかけっこアプリで問題として検出できなかったのは簡易なゲームモーションではfpsの低下が気にならなかっただけのようです。

ついでにポリゴン数を色々変えてみました。記事が長くなったので分けます。
bluebirdofoz.hatenablog.com