最近のトラックバック

« 今日の作業BGM | メイン | 今日の作業BGM »

2013年10月12日 (土)

MMD for Unityでミクさんとケロリン町を周るお話 その1

20131012_00_thumbnail
暫定的では有りますが、
MMD for UnityがMecanimと言うシステムに対応しました。
これに依りMMDのモデル資産とUnityのモーション資産を、
混ぜ合わせて使う事が可能と為りました。

前回MMD for Unityを取り扱った時から
4ヶ月も立っていないのですが、
Mecanim対応も含め大分機能も増えてきました。
改めて、機能拡張された所を中心に使い方を見ていきます。

と言う事で、今回の完成したものです。
ミクさんとケロリン町を周るデモ (酔い注意)
MMD for Unityで変換したデータと
Asset Storeのフリー素材は使ったけれど、
コードを全く組まずに此処迄出来ます。
ノーコードで此処迄出来るUnityは凄いですし、
頂点や当たり・物理設定をしなくても使えるMMD for Unityも凄いです。
全力で乗っかっていきます。

さて、本題に入りましょう。
まずはMMDモデルをUnity内に召喚出来る様にMMD for Unityを準備します。
MMD for Unityは安定版のダウンロードがUnityでMMDを動かす会から、
開発版のダウンロードがMikuMikuDance for Unityからの様です。
今回は最近対応されたばかりのMecanimを使いますので開発版を使います。

20131012_01_m4u_hp
MikuMikuDance for Unityから右上のZIPを選択して
ダウンロードします。

20131012_02_unity3d
MMD for UnityのインストールはMMD for Unityでミクさんのツインテールを物理演算させるお話 その1を参照して下さい。
まぁ解凍してD&Dするだけです。
シェーダーがそこそこ有るので3分ぐらい掛かります。


ではミクさんを召喚しましょう。
MMD for UnityはPMX2.0に対応しているので
大体のモデルは召喚出来るかと思います。
今回はデモと同じくTda式初音ミク・アペンドさんを
召喚させる事にします。
ダウンロードは右記を参照して下さい。

20131012_03_pmdloader
モデル読み込みも基本MMD for Unityでミクさんのツインテールを物理演算させるお話 その1を参照すれば出来ます。

以前はPlugins/MMD Loader/PMD Loaderから
PMDLoader Windowを表示するしか無かったのですが、
今はPMX・PMDファイルを選択すると
Inspectorに読み込み用のメニューが表示される様に為りました。
新機能であるInspector上の読み込みメニューは、
まだバグ持ちなのかオプションが全然変更出来ません。

さて、読み込みオプションも以前に比べて色々増えています。
Use Mecanimが選択出来る様に為っていますし、
ScaleとPMXに関するオプションも有効に為っています。
それではオプションを順に解説します。

PMDLoader Window側の一番上はPMD Fileと為っており、変換対象のPMD・PMXファイルを指定する所に為ります。

Rigidbodyは物理設定(剛体・ジョイント)を読み込むかどうかです。
有効にするとMMDの剛体・ジョイント設定を読み込み、Unityの剛体・ジョイントとして変換します。

Use MecanimはUnityのVer4.0から搭載された新アニメーション技術であるMecanimを使用可能にするかどうかです。
Unityで人型を扱うゲームを作るなら今後は必須に為ってくるでしょう。
MMDの標準的なボーン構造とUnityのMecanimに必要なボーン構造が違うからか、崩れるのも多々有ります。
今の所、どのモデルでも使える訳では無い様です。

Use IKは足を筆頭とするMMDのIKをUnityでも使用可能にするかです。
Mecanimを使わないならIKは有効にしておかないと足がまともに動かないでしょう。
逆にMecanimに頼り切るならIKは不要でしょう。
上半身をMecanimで下半身をIKで等の器用な事も一応可能だろうと思います。
その場合MecanimとIKを両方有効にする事に為りますが、
両方有効だと足で喧嘩が起こるのでIKの設定は組み込まれますが全て無効化されています。
有効化はクリック1つで出来ますが、手動でしないといけないので器用な事をする場合にはご留意下さい。

Scaleはモデルの拡縮率です。
Unityは1mを1.0として扱う事に為っているのですが、
MMDモデルは大体20.0程度の高さを持っているのでそのままだと非常に巨人に為ってしまいます。
初期値は0.085と為っていて、その値を使うと大体170cmぐらいと良い感じに変換してくれます。
Scaleが無かった時はScale=1.0として読み込んでいたので、
旧データと混合させる場合はその様に設定し直した方が良いでしょう。

Use PMX Base ImportはPMX仕様で読み込むかPMD仕様で読み込むかどうかです。
有効だと各種モーフ(頂点・UV・マテリアル・ボーン・グループ)が使え、
付与親ボーンも使える様に為りますがPMDファイルが読み込めません。
無効だとPMDファイルが読み込めますがPMXファイルを読み込ませてもPMD互換範囲しか使えません。
つまり追加分のモーフ(UV・マテリアル・ボーン・グループ)や付与親ボーンが使えません。
自動で判別して欲しい物ですが、今の所オプション制の様です。

20131012_04_tda_miku_load_setting
今回はPMXで有るTda式初音ミク・アペンドさんを、
Mecanimで動かしますのでその様に設定します。

こんな感じです
・Use Mecanim有効、
・Use IK無効、
・Use PMX Base Import有効
・その他は全てデフォルト

20131012_05_tda_miku
読み込みました。
遠目では無事に読み込めた様に見えますが、
カメラを移動させてよく見てみましょう。

20131012_06_tda_miku
モデルの上半身です。
顔が綺麗に出ていませんね、赤紫色の影が出ています。

ちなみに腕が水平に上がってTポーズに為っていますが、
Mecanimを有効にすると自動でTポーズに変換される仕様なので、
特に問題無いです。

20131012_07_tda_miku_in_mmd
一応本家と見比べます。

20131012_08_tda_miku
目に見える範囲でおかしい点は特に4つです。
・顔に影が出ている
・目が死んでいる
・ネクタイの模様が出ていない
・服の模様が出ていない
MMD for Unityはエッジ有無や影放ち有無等で
16種類のシェーダーを持っています。
その中に透過有無の違いも有るのですが、
この判定が割かし誤爆します。
面倒ですが直していきましょう。

20131012_09_shader_list
Hierarchyからモデルを選択すると、
Inspectorに付属コンポーネントが表示されますが
その中からMMDEngineを探して、
中に在るShader Listと言うパラメータを表示します。
此処には材質で使われているシェーダーが表示されています。

20131012_10_shader_list
Shader Listの見方を説明します。
縦に材質が並び、横に材質番号と設定が並びます。

先頭はMaterial、材質番号です。
番号の所にマウスカーソルを持って行くと材質名が表示されます。

1列目はTr、透過(TRansparent)するかです。
チェックが付いているなら、その材質は透過するものとして扱われます。
下記の様な材質は透過で無ければいけません。
・材質色の非透過度が1未満
・材質モーフに依って材質色の非透過度が1未満に為る
・テクスチャの半透明が含まれる領域をUV参照する
・UVモーフに依ってUV参照が半透明が含まれる領域に移動する
現状のMMD for Unityは解析が適当なので、誤爆が多いです。

2列目はEg、エッジ(EdGe)を持つかです。
チェックが付いているなら、その材質はエッジが描画されます。
PMD・PMXデータ共に1対1で対応するので誤爆はありません。

3列目はRv、両面描画(ReVersible)するかです。
チェックが付いているなら両面描画、無ければ表面のみの描画に為ります。
PMXデータに1対1で対応するので誤爆はありません。
PMDデータは1対1で対応しませんが、そんなに誤爆しません。

4列目はCs、地面影(Cast Shadow≒影放ち)です。
チェックが付いているなら、その材質は地面に影が落ちます。
PMD・PMXデータ共に1対1で対応するので誤爆はありません。
MMD for Unity側がセルフ影に未対応なので、
今後色々と変わっていくかもしれません。

少し離れて5列目はHi、ハイライト表示(HIghlight)です。
チェックが付いているなら、材質を全て無視して紫色で表示します。
デバッグ目的(対象となるメッシュの調査)で使います。

6列目はHd、非表示(HiDden)です
チェックが付いているなら、材質は描画されなく為ります。
こちらもやはりデバッグ目的で使います。

20131012_11_shader_list
では顔に影が出ている件から解決します。
まずHiを順番に有効にしていって
どの材質がおかしいか目星をつけます。

今回は13番(hairshadow)のハイライト表示を有効にしたら
顔に影が紫色に為りました。
この材質がおかしい原因です。

20131012_12_shader_list
13番(hairshadow)材質は透過が有効に為っていないので、
為る様に変更してみます。
変更すると影が消えました。
顔の影は無事に解決です。

20131012_13_shader_list
目や服の模様も同様に対応していきます。
目は2番(eye_hi)と3番(eye_hi2)
ネクタイは9番(body_green2)
服の模様は10番(body02)ですね。

やはり透過が有効に為っていないので、変更します。

20131012_14_shader_list
綺麗に為りました。

と、言っても見えている所が綺麗に為っただけで、
他にもおかしい所は有ります。
腰に付いている緑色の羽根は透けていないし、
眼鏡モーフで眼鏡を出すと透けてません。

20131012_15_shader_list
と言う事で私の調整結果です。
今迄の追加で更に5つを透過にしました。

11番(hair00)・12番(hair01)は髪を透過させる為、
14番(cheek)は照れモーフで出てくる頬を透過させる為、
15番(lens)はメガネモーフのレンズを透過させる為、
16番(wing)は腰に付いている緑色の羽根を透過させる為です。

実を言うとこの設定だと髪と照れモーフが微妙に喧嘩するのですが、
現状解決方法が無いので放置です。

はい、漸くTda式初音ミク・アペンドさんが召喚出来ました。
透過の誤爆が減ってくれればもう少し楽なのですが、現状は仕方無いです。

20131012_16_play
ちなみに今、再生してみたらこんな感じでした。
カメラを触ってないので、遠いですね。
今は気にしません。

次にユーザーの入力に従って動かす事にします。
ユーザー入力を受け取ってモデルを動かす等のアクティブな処理はUnityの資産が活きます。
MMDにも移動モーションは充実していますがそれらは使用せず、
アクティブ処理も含めてUnity Asset Storeから一式頂いてきましょう。

20131012_17_mecanim_locomotion_star
今回はUnity社がフリーで提供している
Mecanim Locomotion Starter Kitを使用します。

20131012_18_select_asset_store
と言う事でMecanim Locomotion Starter Kitをインポートします。
まずはUnityのメニューからAsset Storeへ移動します。

20131012_19_select_asset_store
Asset Storeウインドウが新規に開くので、右上の検索欄に
“Mecanim Locomotion Starter Kit”と入力して検索します。

20131012_20_select_asset_store
検索結果の中に“Mecanim Locomotion Starter Kit”が
有ると思いますので、それを選択します。

20131012_21_select_asset_store
詳細ページが表示されますので“Import”ボタンを選択します。

20131012_22_select_asset_store
Importiong packageウインドウが開きます。
別に全部インポートしても問題無いのですが、
今回は最低限のみにしておきます。

今回必要なのは下記の4種類19ファイルです。
・Locomotion Setup/Locomotion/Animationsの中に在る@付きのfbx
・Locomotion Setup/Locomotionの中に在るLocomotion.controller
・Locomotion Setup/Locomotionの中に在るScriptsディレクトリ
・Locomotion Setupの中に在るScriptsディレクトリ

それらを選択して右下の“Import”ボタンを選択します。

20131012_23_locomotion
インポートが無事に終わるとProjectの所に
Locomotion Setupディレクトリが出来ています。

早速インポートした機能を組み込みましょう。
Locomotionを効かせるには2つの作業が必要です。
1つがAnimatorにLocomotion.controllerを設定する事、
もう1つがLocomotionPlayer.csをモデルに付与する事です。

20131012_24_locomotion
まず1つ目、Locomotion.controllerの設定です。
Locomotion Setup/Locomotionの中に
Locomotion.controllerと言うファイルが在りますので、
それをミクさんのAnimatorに在るControllerパラメータにD&Dします。

20131012_25_locomotion
次にLocomotion Setup/Scriptsに在るLocomotionPlayer.csを
Animatorの下辺りにD&Dします。

20131012_26_play
以上の作業でLocomotionが組み込まれました。
再生してみましょう。

Locomotion組み込みデモ

カメラをまともに調整していないのでやや遠いですが、
キーボードの“↓”を入力すると
振り向いてこっちに寄って来てくれます。

20131012_27_play
動かせた感動を味わおうかという矢先、
近付いた姿に落胆する事に為ります。
Tda式初音ミク・アペンドさんの特徴とも言うべきしっぽが伸びてます。
重力に引っ張られて2倍ぐらい伸びてます。

Unityはゲームエンジンですので色々な設定が
速度重視に為っています。
物理演算の精度も初期値だと結構悪いです。
MMDは更新周期が30fpsで物理演算周期が60fpsなのに対して、
Unityは更新周期が60fpsで物理演算周期が50fpsです。
更新周期よりも物理演算周期の方が低いので、
割りと滅茶苦茶に為ります。
長さ固定のジョイントで繋げてても平気で2~5倍は伸びます。
そしてその伸びた状態から物理演算するので盛大に暴れてくれます。

まぁゲームで使う物理演算って割かし賑やかし要素的な所が有るので、
それっぽく動いていたら十分な場合が多々有ります。
銃で空き缶撃った時の挙動なんて誰も知りませんしね。

しかし、今回の場合は頂けない。
MMDの物理演算では伸びないのだから、Unityの物理演算でも伸びないで頂きたい。
と言う事で改善しましょう。
物理演算周期を初期値の50fpsから倍の100fpsに変更します。
それでもやっぱり伸びる場面は多々有るのですが、これだけで大分改善されます。
少なくとも重力に引っ張られているだけで2倍に伸びる様な事は無くなります。

20131012_28_time_manager
メニューからEdit/Project Settingsと進みTimeを選択します。
するとInspectorの所にTimeManagerが表示されます。

物理演算周期はFixed Timestepの所に逆数で設定されています。
今は0.02が設定されているので1÷0.02=50と為り、
物理演算周期は50fpsです。

20131012_29_time_manager
今回は物理演算精度を上げる為に倍の100fpsにしたいので、
Fixed Timestepを0.01に変更します。
これで物理演算周期が100fpsに為りました。

20131012_30_play
再生するとこの様な感じです。
しっぽの伸びが許容範囲ぐらいには為ったと思います。
しかも暴れる事も無く為りました。

唯一の欠点はCPU負荷が重く為った事です。

20131012_31_fixed_timestep
Statisticsで負荷を比較してみましょう。
上が物理演算周期50fps、下が100fpsです。

50fpsではMain Threadが8.8msですが、
100fpsでは9.8msと10%程負荷が上がっています。

とは言え、物理演算処理は別スレッドでしているでしょうから
今時の4コア8コア当たり前のPCなら、
そんなに気にしなくても良いのではないかなと思います。

スマートフォン等では結構シビアな問題に為るので、
負荷を犠牲にしている事は頭に留めておいた方が良いでしょう。

さて、漸く走り回れる様に為った訳ですがカメラが固定なのですぐに画面外に出てしまいます。
と言う事でカメラを移動させる事にしましょう。

カメラの挙動は作品の善し悪しにかなり左右する要因と為ります。
思い通りに動かせないとか、見たい方向に向いてくれないとかはまだ可愛い方で、
失敗するとすぐに酔ってしまい長い事触っていられなく為ります。
突き詰めていけば何処迄も時間を掛けられるカメラですが、
今回はMecanim Locomotion Starter Kitに付属しているカメラを使います。

20131012_32_camera
HierarchyからMain Cameraを選択して、
Inspector上にカメラの情報を表示します。

20131012_33_camera
次にLocomotion Setup/Scriptsに在るSmoothFollow.jsを
Audio Listenerの下辺りにD&Dします。

20131012_34_camera
後は追尾対象を設定する為に、
HierarchyのミクさんをSmooth FollowのTargetにD&Dします。

20131012_35_play
以上の作業でLocomotionのカメラが組み込まれました。
再生してみましょう。

Locomotion付属カメラ組み込みデモ

地面が無いのでいまいち挙動が掴めないですが、
少なくとも画面外には出なくなりました。
多分カメラがちゃんと追尾してくれているのでしょう。

さて、では次は地面ですね。
と言いたい所ですが、長く為ってしまったので今回は此処迄としましょう。
次こそはケロリン町を召喚して見て周りたいですね。
それではその2でまたお会いしましょう。



トラックバック

このページのトラックバックURL:
http://app.blog.eonet.jp/t/trackback/351525/31896861

MMD for Unityでミクさんとケロリン町を周るお話 その1を参照しているブログ:

コメント

この記事、超参考になりました!
おかげでUnityでMMDを使ったアクションクイズゲームを作ることが出来ました。
http://mikumikuplay.com/quiz/

↓でこのブログを紹介させていただきました。
http://qiita.com/yamarou/items/62d3f71f01adc7f2ebfa

素晴らしい記事を書いてくれてありがとうございました!

まさかクイズゲームでこの記事が活きるとは思ってもみませんでしたw
参考に為った様で何よりです。

ミクさんが歩くだけでもテンション上がりますよね!!

Unity4.6.0のWebPlayerだと足が動かなくなってしまっていますね。

コメントを投稿