最近のトラックバック

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

2013年10月27日 (日)

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

20131027_00_thumbnail
この記事はその1からの続きと為っています。
その1を未読の方は先にそちらに目を通した方が良いでしょう。

前回迄の作業でカーソルキーからミクさんを動かせる様に為りました。
カメラも追尾して動くのでデモだと移動している感が無いですが、
縦横無尽に走り回れている筈です。


では前回の進行通り地面を用意しましょう。
デモと同じくBTA/kelorin jo式ケロリン町を召喚させる事にします。
ダウンロードは右記を参照して下さい。

20131027_01_kelorin_cho
取り敢えず、UnityにD&Dしました。

BTA/kelorin jo式ケロリン町はステージと言う事で、
頂点数もポリゴン数も非常にボリュームが有ります。

10個のPMXファイル7個のXファイルと、細かくファイル分割してくれていますが、
それでもミクさんに比べるとかなり大ボリュームです。

MMD for UnityはPMXに対応していますが幾つか既知の制限事項が有り、
その1つに頂点数に関する制限が有ります。
1つの材質が使える頂点数が65535未満で有る事です。

ミクさんでは1つの材質が65535頂点過剰に為る様な構成は見た事無いですが、
ステージは時々有ります。

今回のケロリン町も中核を成す“ケロ町メイン2.02.pmx”が
その制限に引っかかります。
依ってこのPMXは今の所読めません。

試しに読み込もうとしたら4GBの空きメモリを喰い尽くした挙句、
Unityを巻き込んで落ちました。
読めないのはまだしも落ちるのは迷惑ですね。

作業用用途ですが軽量化された“ケロ町軽.pmx”が在り、
こちらは頂点数制限に引っかかりません。
今回はこちらを使用して召喚します。

20131027_02_kelorin_cho_load_settin
PMDLoaderの設定はこんな感じです
・Rigidbody無効
・Use Mecanim無効
・Use IK無効
・Use PMX Base Import有効

剛体が設定されたステージPMXが有れば別ですが、
基本的にこの設定でどのステージPMXも大丈夫です。

20131027_03_kelorin_cho
読み込みました。

ボーン構成がシンプルなので読み込み自体はミクさんより早いですね。

20131027_04_shader_list
シェーダーの透過判定に誤爆が有るだろうと思って探しましたが、
大丈夫な様です。

探すのに時間喰うので、無いのなら幸いです。

さて、では歩く為に当たり判定を付けましょう。
Unityには6種類のコリジョンが有りますが、今回はメッシュコリジョンを使用します。

剛体が設定されたステージPMXならMMD for Unityで持ってきますが、無い場合はメッシュコリジョン1択だろうと思います。

坂の多いケロリン町では、面ベースでコリジョンを自動構築してくれるのは大変ありがたいです。
溜池や川迄コリジョンが作られるので氷みたいに水面を歩けてしまうのですが、今回は気にしません。
水面の材質だけ別メッシュに為っていれば其処だけコリジョンを作らない事も可能ですが、
全部ごっちゃに為っているので潔く諦めます。

20131027_05_mesh
ケロリン町のMeshを開くと2つ有りますが、
65535頂点を超えている為に分割されただけです。

両方ケロリン町のメッシュですので、共にメッシュコリジョンを付加します。

20131027_06_mesh_collider
Hierarchyからケロリン町のMeshを開き、Mesh0を選択します。
そしてメニューからComponent/Physicsと進み、
Mesh Colliderを選択します。

20131027_07_mesh_collider
するとInspectorの所にMesh Colliderが表示されます。

20131027_08_mesh_collider
次にMesh Colliderにメッシュを設定します。

ProjectのAssetsからケロリン町/Meshesと進むとメッシュが有ります。
今回は2つに分割されているので2つ有ります。

今はMesh0を設定中なので0_ケロ町軽を
Mesh ColliderのMeshパラメータにD&Dします。

これで1つ目のメッシュコリジョンが設定出来ました。

20131027_09_mesh_collider_
Mesh1も同様に設定します。

20131027_10_mesh_collider
メッシュコリジョンが正常に設定されると
緑色で表示されるメッシュコリジョンがモデル一面に広がります。

これでステージ側の当たり判定は設定完了です。

次にミクさんをケロリン町の地面に沿って歩かせます。
今回はプレイヤーがステージ上を移動する為だけに用意されているCharacter Controllerを使います。
使い方は今迄通りメニューから付加するだけです。

20131027_11_character_controller
Hierarchyからミクさんを選択します。
そしてメニューからComponent/Physicsと進み、
Character Controllerを選択します。

20131027_12_character_controller
やはりInspectorの所にCharacter Controllerが表示されます。

20131027_13_mesh_collider
初期状態だとコリジョンが大分下に付いているので調整が必要です。

20131027_14_mesh_collider
と言う事で上げました。

高さと半径はこんなものでしょうか。

20131027_15_play
Character Controllerは落下制御もしてくれるので、
もう再生したら地面を歩いてくれる筈なのです。

しかし、現状で再生しても浮いたままです。

20131027_16_conflict_collision
それどころかツインテールやらネクタイやらの物理が猛烈に暴れます。

これはMMD for Unityで持ってきた物理設定(剛体・ジョイント)と、Character Controllerが衝突しているのが原因です。
Character Controllerは地面迄落下しようと重力方向に他のコリジョンを探しに行きますが、
すぐ近くに在るツインテールやら足やらのコリジョンに接触してしまう為、地面に設置していると判断してしまいます。
もっと近くのコリジョンに捕まってしまうと埋没していると判断してしまい、
それを解消する為に上に持ち上げてしまう事もあります。
これではケロリン町の地面との距離が正確に測れません。

そうすると必然的にCharacter Controllerには、
MMD for Unityで持ってきた物理設定(剛体・ジョイント)を無視して欲しいと思う訳です。
Unityにはその為の機能が有ります。
コリジョン1つ1つの単位で接触設定を出来る機能と、
コリジョンをレイヤー分けしレイヤー単位で接触設定を出来る機能が有ります。
今回は後者を使います。

20131027_17_conflict_collision
それでは接触設定をする前に行いたい設定を纏めましょう。

まずケロリン町の地面を突き抜けては困るので、
Character Controllerはケロリン町のメッシュコリジョンに当たって欲しい。

しかしMMD for Unityで持ってきた物理設定(剛体・ジョイント)に
Character Controllerが当たって欲しくない。

ではMMD for Unityで持ってきた物理設定(剛体・ジョイント)と
ケロリン町のメッシュコリジョンはどう設定しましょうか。

ツインテールが建物に減り込むのは良く無いですし、
ガードレール等も引っ掛かる様に動いた方が自然でしょう。
と言う事でこれらは当たりますね。

20131027_18_conflict_collision
分ける時にレイヤー名を付けないといけないので、
今のうちに名前を付けておきましょう。

別に何でも良いのて適当に
"モデル当たり判定"には"Player"、
"モデル物理設定"には"MMD Physics"、
"ステージ当たり判定"には"Stage"としましょうか。

20131027_19_layer
では纏まった所でレイヤーを分けしていきます。
まずレイヤー名をひと通り設定しましょう。

Inspectorに在るLayer欄を選択して、Add Layer...を選択します。

20131027_20_tag_manager
するとInspectorの所にTagManagerが表示されます。

0~7は変更出来無い様なので、8以降に先程決めた名前を設定します。

20131027_21_layer
設定出来ていればLayerの所に表示されます。

20131027_22_layer
では、まずミクさんに"モデル当たり判定"の"Player"と、
"モデル物理設定"の"MMD Physics"を設定します。

MMD for Unityで持ってきた物理設定(剛体・ジョイント)は、
ミクさんの至る所に散らばっているので1つ1つを
"MMD Physics"にする凄く大変です。

と言う事で、ミクさんを子要素含めて全てを一旦"MMD Physics"に分けます。

20131027_23_layer
子要素も変更します。

20131027_24_layer
このままだと"Player"に分ける予定のCharacter Controllerさえも
"MMD Physics"に為ってしまいます。

それを直す為に、今度は子要素を含めずに"Player"に分けます。

20131027_25_layer
子要素を含めずに変更します。

20131027_26_layer
これでMMD for Unityで持ってきた物理設定(剛体・ジョイント)は
"MMD Physics"に分けられ、
Character Controllerは"Player"に分けられる様に為りました。

20131027_27_layer
ケロリン町のレイヤー分けは簡単ですね。
全て"Stage"に分けましょう。

20131027_28_layer
子要素も含めます。

以上で各コリジョンのレイヤー分けが出来ました。

次にレイヤー単位の接触を設定します。

20131027_29_layer_collision_matrix
メニューからEdit/Project Settingsと進み、Physicsを選択します。

20131027_30_physics_manager
するとInspectorの所にPhysicsManagerが表示されます。

下の方に在るチェックボックスの三角形が、
レイヤー単位の接触を設定する所です。

幾つか最初から在る項目の所為で設定項目が増幅されていますが、
"Player"・"MMD Physics"・"Stage"以外は無視して、
この3つの接触設定を行います。

20131027_31_physics_manager
基本的に接触するものなので、
上の方で決めた"Player"と"MMD Physics"だけ接触しなくします。
"Player"と"MMD Physics"の交わるチェックボックスを無効にします。

20131027_32_play
これでコリジョン関係の設定は終わりです。
再生してみましょう。

ケロリン町徘徊デモ


無事に地面を歩ける様に為りました。
漸くですね。

20131027_33_play
暫く走り回っていると色々と気に為ります。
・影が落ちていない
・髪が靡かない
・カメラの挙動をどうにかしたい

どうにかしていきましょう。

まずは影が落ちていないのを直しましょう。
MMD for Unityは影受けに対応しているのですが、逆に影を受けない事に対応していません。
その結果、本来影を受けない様に設定している材質も全て影を受ける様な描画に為ってしまいます。
特に多くのモデルは顔に影が出ない様にしている物が多く、其処に影を受けると見た目が劣化してしまいます。
全材質に影を受けると劣化が激しいのですが、全材質に影を受けない場合はまだ許容範囲に収まると思います。
その判断から、変換直後は全材質が影を受けません。

今回の様なステージの場合は、地面影の為に影受けが必要なので手動で戻します。

20131027_34_shadows
ケロリン町のメッシュを選択すると、
Skinned Mesh RendererにReceive Shadowsと言う項目が有ります。
これが影受けの項目なので有効にします。

20131027_35_shadows
するとケロリン町にミクさんの影が落ち…てませんね。

光源を忘れていました。
追加しましょう。

20131027_36_shadows
メニューからGameObject/Create Otherと進み、
Directional Lightを選択します。

20131027_37_shadows
するとHierarchyの所にDirectional lightが追加されます。

ライトの初期設定では影は無効化されているので、有効に為る様に変更します。

20131027_38_shadows
Directional lightのLightにはShadow Typeが有りますので、
Hard Shadowsを選択します。

これで影が落ちる様に為りました。

20131027_39_play
再生してみましょう。
無事に影が落ちていますね。

次、髪が靡かないのを直しましょう。
髪が靡かないと言うとMMD for Unityでミクさんのツインテールを物理演算させるお話 その3を思い出しますね。
今回靡かないのも同じ様な原因です。
VMDLoaderを使って読み込んだモーションデータはミクさんのModel下に在る全ての親ノードの座標を書き換えます。
ですので、それより外側に出してしまえば良かったのです。
今のMMD for Unityは靡いて欲しいものはPhysics下に纏められているので、全ての親ノードの移動は綺麗に靡いてくれます。
しかし今回は借り物のLocomotionで動かしています。
これはミクさんのルートノードの座標を書き換えて移動させている様です。
Physicsはルートノード下に有るので、これでは靡きません。

直す方法はと言うと、2つ有ります。
1つはLocomotionの処理を改変して、全ての親ノードを使って移動させる様にします。
もう1つはPhysicsを移動するノードの外側に出します。
スクリプト作業は避けたいので今回は後者の方法を取りましょう。
ミクさんのルートノードが移動すると為ると、更にそれ依りも外に出す事に為ります。

20131027_40_physics
ミクさんの下にあるPhysicsを掴んで、外に移動します。

20131027_41_physics
プレファブとの関連付けが切れる件について訊いてくるので、
Continueを選択して強行します。

20131027_42_physics
するとPhysicsが親子関係から外れます。

20131027_43_physics
再生して移動してみましょう。

靡く様に為っていますね。

しかし今度は靡き過ぎと言いますか、前髪がめり込んでしまってネクタイが体を貫通してしまっています。
全速力で走ると胸も体内にめり込んでしまいますね。
物理演算周期を100fpsにして有りますが発生しています。
200fpsに上げようが、それこそ1000fpsとか迄上げてもこれは改善しませんでした。
Unityではオブジェクトをスクリプトで動かすと、
くっ付いている物理演算オブジェクトが引っ張られる迄に更新周期1フレーム程度の遅延が起こる様です。
これは流石にどうしようも無いですね。

とは言え、靡かせる前はめり込んだり貫通したりはしていなかった訳です。
と言う事で、前方に歩く時にめり込みが顕著な前髪とネクタイそして胸は靡く処理を元に戻しましょう。
MMD for Unityには靡きに関する有効無効オプションが有るので無効にします。

20131027_44_physics
Hierarchyから先程外に出したPhysicsを選択します。

するとInspectorの所にPhysics Managerが表示されます。

20131027_45_physics
靡く物理演算ノードが一覧で表示されていますので、
前髪とネクタイそして胸関連を無効にします。

これで前髪とネクタイそして胸が靡かなく為りました。

20131027_46_play
再生してみましょう。

靡きデモ

借り物カメラでは微妙に綺麗に撮れないのですが、
ツインテールは靡いているのに、
ネクタイが靡いていないのが分かりますでしょうか。

まぁ本来なら顔にも体にも剛体が設定されているのだから
靡きつつめり込まないのが理想です。
しかし、実際問題Unityの物理演算ではめり込むのですから
こういう嘘物理で見栄えを調整するのも1つの手段でしょう。

さて、では残る気に為る点はカメラですね。
カメラをノーコードで処理すると言うのは相当無茶な気がしますが、今回は長く為ってしまったので又の機会としましょう。
それではその3でまたお会いしましょう。



トラックバック

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

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

コメント

コメントを投稿