MLTDモデルをHumanoid VRMにするまで
検索避け略記ですが分かるオタクには分かる”MLTD”
本来このブログでやりたかった、ちょっとグレーでアレな技術記事です。これでお前もアイドルや
必要なもの
- 何らかの手段で用意したMLTDのデータ(キャッシュ)
- 泥の人はホームディレクトリのAndroidフォルダ以下を探せば非rootでも取れます
- 林檎の人はよくわかりません。以前の印象であれば脱獄しないとしんどかった記憶があります
- Blender(記事作成環境は2.81)
- blender_mmd_tools
- Unity(同2018.4.14f1)
- AssetStudio
- MMD4Mecanim
- UniVRM
- PMXエディタ
- Blenderだけでも大丈夫ですが、PMXエクスポートの確認等含めて一応使ってます
キャッシュからモデルのエクスポート
AssetStudioGUIを起動し、File -> Load folder
以前はキャッシュデータの構造が単純だったので必要なキャビネットを簡単に見つけられたのですが、いつぞやの更新からファイル名だけでは判別できなくなり面倒臭いので、キャッシュ全体を一度読み込ませます。
それなりにメモリは食うのであまりにも少ない人は注意。

上手く読み込めればAsset Listに所持しているアセットがリスト表示されます。

尚TypeがMeshのものだったりとかを間違えて踏んでしまうとハングしてしまうので注意してください。SpriteやTexture2D等の2D系はまず平気です。
この中からお目当てのアセットを検索します。今回はYKYMNOさんにご協力頂きました。

アセット名ですが、アイドルごとに『番号+区別名3文字』が割り振られていますので、これと検索欄を頼りに探します。YKYMさんであれば『037nao』、IBKさんであれば『016tsu』といったような感じです。
モデルの場合接頭辞『cb』『ch』が付きます。MLTDのモデルは衣装の実装都合上胴体と頭が別になっているので、恐らく『chara_body』と『chara_head』とかの略でしょう。
そして『pr001』『ex008』『ss103』等はカードの種類です。アルファベット2文字はカード種別(ss=SSR、sr=SR、pr=N、ex=イベント、gt=アナザー2 etc. 例外ありそう)、上1桁はアナザー種別(0=ノーマル、1=アナザー、2=アナザー2)、下1桁はカード種別(SSR1枚目、2枚目…)を示します。多分。
それでは今回はジョイフルグレーテルなアナザー衣装を着ていただきましょう。モデルのエクスポートはTypeがAnimatorのものを見つければ行えます。
目的のアセットが見つかったら右クリック -> Export selected assetsで任意のディレクトリに展開しましょう。
今回の衣装はモデル的にはアナザーも通常も差異がなく共通っぽいので、通常の『ss003』モデルからエクスポートします。

上手くいくとfbx(モデルデータ)とテクスチャが吐き出されます。

ただこのテクスチャは通常衣装のテクスチャなので、『ss103』でアナザー衣装のテクスチャを検索にかけます。

ついでに目のテクスチャと目のハイライトのテクスチャが別々になっているので合成しておきます。
凝った実装をすれば活かせるんでしょうが今回は面倒なので割愛。

最後に通常衣装のテクスチャを退避させ、アナザー衣装テクスチャのファイル名を通常衣装のものにリネームして完了です。

Blenderで読み込む
Blenderを起動したらファイル -> インポート -> .fbxと選択し、FBXをインポートします。
この際トランスフォームタブの拡大縮小を100にし、モデルサイズ100倍で読み込みます。やけに小さいんだ。
またUnityで使用されるFBXあるあるなのですが、そのまま読み込むとボーンの向きがぐちゃぐちゃになるので、プライマリボーン軸をX軸、セカンダリをYにします。モデルによってはボーン方向の自動整列だけで直ったりするのですが、挙動がよく分からん
リーフボーンや子を強制的に接続のチェックはなくても平気ですが、有効にしたほうが謎ボーンの数が少なくなったような気がします(未検証)

全く同じ設定で胴体と頭それぞれを読み込み、ウニの化け物みたいになったモデルが表示されればOKです。

ここからMMD(PMX)用のモデルに変換していきます。
右上のクソ見にくい矢印をクリックするとパネルが開くので、MMDタブを選択します。

メニューが出たらまず頭のアーマチュア(ボーン)と胴体のアーマチュアをCtrl+クリックで複数選択し、Ctrl+Jで結合します。

上手く行けばアーマチュアが1つ減ってるはず

同様にして頭のメッシュと胴体のメッシュも結合します。

結合し終えたらアーマチュアを選択した状態でConvert Modelを選択します。メッシュ選択状態だとボタンが無効のままなので注意してください。

上手く変換ができればアーマチュアの表示が変わり、よりウニっぽくなります。

再度メッシュ部分を選択し、Modelのエクスポートを選択。

エクスポート時の設定は拡大縮小を10倍、Copy texturesにチェックを入れておくとディレクトリ移動の際ちょっと楽だったりします。

PMXエディタでボーンを整理する
Blenderでも出来ます。
とりあえず先程書き出したPMXを読み込み、正常に表示されることを確認しましょう。

実はこの状態では胴体と頭のボーンがくっついていないので、まずはそこを直します。
最初に本物の頭ボーンを探します。ちゃんと首とか胸とかとくっついてて、名前が『ATAMA』だけのものです。
さて、残念ながらHAIRボーンの親は『ATAMA.001』という質の悪い偽物にくっついているのでここを変更します。
HAIRの親ボーンを先程探したATAMAボーンの番号に書き換えます。今回は38ですね。

そして偽物とその取り巻きを分からせてやります。Deleteキーで一発!

TransformViewを開いてちゃんと頭がくっついたか、どっかのボーンが狂ってやばい動きをしていないか確認しながら作業をすると捗ります。

そしてモデルによっては「何故か存在しているが何にも影響しないしなぜ存在しているのかわからないボーン」がたまにありますので、TransformViewで怪しいボーンを選択し、回転や移動をさせても何も変化が起きなければ編集ウィンドウから選択し、消します。消さなくてもいいのかもしれませんが気持ち悪いので消してます。

ここで先程の「リーフボーンを無視する」等にチェックが入っていると謎ボーンが少なくなるような気がします。
なんとなくきれいになったら最後に手のボーン構造だけ修正します。
UnityでモデルをHumanoid(VRMやVRChat等で使う形式)として扱うには手の指が全て同一の親ボーンを持っていないといけないのですが、MLTDのモデルは薬指と小指のみ調整用の別ボーン(KUKO)が親になっているので、これを修正します。
なんかすごく細やかにメッシュ変形させててすげーなってお気持ち

手のボーンであるTEボーンの番号をメモして、薬指(KUSU)と小指(KO)の親をKUKOからTEに変更します。

左右両方行ってください。
尚KUKOを勢い余って消してしまうと、手をニギニギさせた際にバケモノハンドになってしまいますので注意。
一通りチェックが済んだらモーフタブからモーフ名を編集します。
これもTransformViewでモーフの変化量を調整しながらわかり易い名前をつけておくと後が楽です。
今回は「あ」のモーフを『A』に変更しただけで面倒になってしまったので割愛します。

UnityでPMXをVRMに変換
Unityを起動し、ダウンロードしておいたUniVRMとMMD4MecanimをAssets -> Import Package -> Custom Packageから全てインポートします。ぶっちゃけ.unitypackageをダブルクリックで開いてもヨシ

インポートし終えたら適当な場所に.pmxとテクスチャを放り込みます。散らかるのが嫌な人はAssets以下にディレクトリを作っておきましょう。

インポート時に自動で作成される立方体アイコンの変なファイルを選択すると、インスペクタに規約が表示されるので同意します。怪しい

同意するとImport Settingsが開くので、Animation TypeをHumanoidに変更し、Apply。
コマンドプロンプトに文字が流れ上手く行けば下記のようにチェックマークが出ます。エラーが出る際は大抵ボーンのどこかがおかしいので、エラーメッセージを参考に戦ってみてください。

無事チェックマークがついたらConfigureを選択し、モデルの調整を行います。
Humanoid変換時にUnityが勝手にアバターとボーンの対応をしてくれるのですが、どうやらMLTDモデルとは左手周りの相性が悪いらしく大抵の場合ズレるので修正していきます。
修正画面右上の軸をクリックすると軸正面へとカメラが切り替わるので、まずはY軸(緑)をクリックし上から見下ろします。

また、このままではパースが効いて見にくいので同様に真ん中の立方体をクリックしてパースを無効にします。

うまく表示ができたら、左手の修正に入ります。
まずは曲がっている左手のボーンを左側のヒエラルキービューから探します。シーン上で上手くクリックできそうであればそれでも大丈夫です。

回転ツールでY軸のみの回転(緑色の半円をドラッグ)をして、まずは上からの見た目を整えます。
白い円をドラッグすると、カメラの角度によってはX軸やZ軸方向にも開店してしまうので注意。

Tポーズじゃないよと怒られますが、悪いのはボーンの自動設定を間違えたUnityくんなので無視しましょう。
続いて青のZ軸をクリックして正面からのカメラに切り替え。
同様に青い半円をドラッグして手を整えます。

親指の付け根がちょっと下に向いているので、同様に青半円ハンドルで調整し完成。
この作業の制度がどれくらい影響してくるのかわかりませんが、怖いので丁寧にやりましょう。

さて、インスペクタビューを見るとLeft Armがかなりぐちゃぐちゃなので直します。親指は手ではない

これは該当部分にヒエラルキービューから目的のボーンをドラッグ&ドロップしてあげればOKです。
下の画像であれば、正しいRight Armを参考にSAKOTSU_LをLeft ArmのShoulderにD&Dします。
尚以下で行うボーンのマッピングを先に行うと、先程行った姿勢の修正を行った際に自分の環境ではUnity Editorごとクラッシュしたので気をつけて…

同様に肩、腕、手を直すとTポーズ云々のエラーメッセージが消えます。

ここが終わったら緑のアバター左下にあるトグルボタンからLeft Handを選択。

何も設定されていないので、指のボーンをマッピングしていきます。
迷ったら下の画像を参考にしてみてください。

一通りマッピングが終わったら左下のApplyを押し変更を反映。Muscles & Settingsタブに切り替えてちょっと変形させてみます。ボーンがおかしいとモデルが破綻したりするので、ちゃんとチェックしましょう。

チェックが終わったらDoneを選択。完成したPrefab(下画像左から4番目、アイコンとしてモデルが表示されてるやつ)をヒエラルキービューにドラッグし、シーンに配置します。

この時点で一度モデルをVRMに変換してエクスポートします。
ヒエラルキービューでモデルが選択されていることを確認したら、メニューよりVRM -> UniVRM-x.xx.x -> Export humanoid

Authorだけ設定が必須なので、適当に設定したら任意のディレクトリに保存します。

保存できたら再度Assets以下に書き出されたVRMを放り込みます。この際サブディレクトリが色々生成されるので、散らかるのが嫌な人はやはり専用のディレクトリを作っておきましょう。

インポートができたらPrefabをヒエラルキービューに放り込みます。が、だいぶ薄暗いですね。
これはシェーダーのせいなので、設定を変更しみんな大好きトゥーンシェーダーを新たに割り当てていきます。

上画像のようにヒエラルキービュー上のPrefabを展開していくとU_Char_xが見えると思います。
これを選択するとマテリアル一覧が表示されるので、各マテリアルの『Standard』となっているShader部分を変更していきます。
見栄えが良ければ何でもいいですが、今回はVRM -> MToonを選択。

変更したら、各マテリアル左下にある矢印をクリックして詳細設定を開きます。
デフォルトではLit Colorが暗めなので、これを白に変更。Shade Colorは影色ですが、面倒だったら白で大丈夫です。この辺を上手く調整すると後々の見栄えに大きく影響するので、気合のある人はそれっぽい影色を選んだりとかしてみてください。

さて、だんだん見栄えが良くなってきたところですが、たまに下のように謎の黒テクスチャが出ることがあります。

フリルの隙間とか花柄部分、アクセサリ部分に多いですが、これはテクスチャの透過部分を透過できていないのが原因ですので、該当マテリアルのレンダリング設定をOpaqueからTransparentに変更するときれいになります。

見た目は完成

次に髪やアクセサリ等の揺れものを設定します。もしカッチカチモデルで構わないのであれば飛ばして大丈夫です。
ヒエラルキービューのモデルPrefabにあるsecondaryを選択すると、インスペクタビューに『VRM Spring Bone』という項目があるのが確認できます。
こちらの『Root Bones』に揺れ物のボーンの根本を登録していきます。Sizeを変更するとElementの数が変わるので、揺らしたい物の数分だけ用意してください。(後で変更できるので適当でいいです)

代替モデルを見れば揺れそうなものはわかるので、検討をつけながらヒエラルキービューから該当のボーンを探していきます。
今回のYKYMさんであれば髪、首アクセサリ、スカートが揺れそうです。
尚MTLDモデル作成者は変態なので、胸とお尻を揺らす用のボーンが存在します。ちゃんと揺れますが、そのままではあまりにも揺れてやばいのでオススメしません。

今回はこうなりました。あくまで根本だけ登録すればいいので、例えばElement 7のドリルヘアーなんかは縦に4つボーンが連なっていますが、一番上のボーンだけを登録しています。
さて、ここからはこのモデルにおいては追加作業となります。
揺れものの当たり判定を設定するのですが、YKYMさんをよく知る皆様であればHARAPEKOTシャツの上に星型の長いネックレスをしているのを思い出すことは容易でしょう。
このネックレスも揺れものでありちゃんとボーンが入っているのですが、そのままでは揺れ方によっては腹の中に星がめり込んでしまいます。
これを避けるためにはお腹のあたりに当たり判定を設定するのですが、その作業が以下のものとなります。
まず当たり判定を設定したいボーンを見つけます。今回はわかりやすい1.joint_KOSHIとかでいいでしょう。
次にプロジェクトビュー右上の検索欄に”VRMSpringBone”と入力し、VRMSpringBoneCollider.csを見つけます。 VRMSpringBoneColliderGroup.csとかいう紛らわしいものもあるので気をつけましょう。

見つけたらこちらのC#スクリプトを目当てのボーンまでドラッグ&ドロップします。

アタッチできていれば該当ボーンをクリックしたときにインスペクタに表示される内容が増えていると思います。
ここでサイズやオフセット、半径なんかをいい感じに調整しましょう。
調整ができたら、先程行った揺れものボーン追加と同じ要領でsecondaryを選択、Collider Groupsへの追加を行います。
尚ここにはVRMSpringBoneCollider.csをアタッチしたボーン以外は追加できません。

さて仕上げです。ヒエラルキービューからモデルPrefabの大元を選択し、インスペクタビューを下にスクロールします。
Animatorコンポーネントの下に『VRM Blend Shape Proxy』コンポーネントがあるので、こちらのBlend Shape Avatarに設定されている『BlendShape (BlendShapeAvatar)』をダブルクリック。

インスペクタビューの表示が変わるので、VRMでデフォルトで設定されている表情を設定していきます。ここを頑張ると後で楽しいです。

尚このモデルに目のボーンは組み込まれていないので、目線操作系統(LOOKUPとか)はそのままで大丈夫です。
ここでモーフ名をわかりやすく設定し直した人は報われます。
さて、表情含めて満足できるものになったら書き出しです。 メニューよりVRM -> UniVRM-x.xx.x -> Export humanoid。設定項目はそのままで大丈夫です。

書き出したVRMモデルを3teneで読み込んでYKYMさんになってみました。かわいい
最近のコメント