MMDモデル制作メモ
あかり草のMMDモデルを作ったときに、ボーンと剛体を入れて物理演算に対応させるまでをしたのですが、当時ちゃんとやり方をまとめていなかったので私の中でロストテクノロジーになってしまっておりました。
あれやこれやと手を出しているせいで、どうしても時々しか触らず使い方を忘れてしまうんですよね…そのために毎度し直すのも非効率なので自分向けのマニュアルとして書き記しておきます。他人の書いたものよりかは自分の書いたものの方が読み直しても効率的でしょう。
また、手軽に再現手順を記録する方法としてYoutubeLiveに作業動画を垂れ流しておくのがよさそうです。終わったら勝手にアーカイブを動画にしてくれるので、ニコ生のようにアーカイブ管理をしなくてよいので便利です。 (ScreenCastKeysを有効死しておくとよさそ)
最後に使ったもの(Version)
- Blender v2.8.2a
最新版更新されているのでアプデしなきゃ
- mmd_tools v0.7.0
Forkだけど本家より更新されている。ただし、本家はMITなのに、ForkはGPL。MMDモデル作成自体には関係ないが。
- PMXEditor v 0.2.5.4
出力結果確認・検証用。PMXEで編集を加えると出戻りが辛いので、可能な限りBlenderで完結したい。
MMDモデルの初期化
最初から作る場合は、MMDタブのCreateModel、ボーン構築済みのオブジェクトでMMDモデルデータを初期化する場合は、ルートになるオブジェクトを選んでConvertModel。CreateModelだと、「すべての親」とかいう必須ボーンを作ってくれるので、最初からMMD向けならCreateModelの方がよい。BlenderやUnityでもレンダリングしたい場合には、マテリアルがMMD用のデータと相互作用を起こすので面倒くさいかも。UnityならマテリアルはUnity側で指し直す場合が多いし関係ないかな。
制作
逆に、これらのどちらかをやってないと、pmxエクスポートがグレーアウトしていてできません。
MMDのデータ構造
以下の図がよくまとまっています。mmd_toolsで作るのはpmxですが、拡張部分を含めれば大体同じです。
「DirectX12 Programming Vol.2」スラりんラボ より引用
基本情報
コメントが面倒くさいです。ノートアイコンがあるのですが、ここに直接入力することができないです。
TextEditorから新しいTextObjectを作成して参照させる方式のようです。
メッシュの作成
Blenderのメッシュデータは特別なModifierを除いて適用された状態で、結合されて一つになってpmxになります。出力前にマニュアルで結合する必要はないです。(結果がおかしくなってなければ)
つまり、適当に作ればOKです。最終的にアーマチュアの子になっていればよいですが、これはBlenderを普通に使えばそうなるので気にすることはないはずです。
マテリアルの割り当て
マテリアルはBlenderのマテリアル単位と共通です。ただし、シェーダはMMD固定なので詳細を設定しても意味がありません。
かわりに、MMDMaterialとMMDTextureの項目で設定を組みます。テクスチャは相対PathでOKです。
MMDモデルによくある質感に合わせるには以下のようにします。
- Diffuse:#000000/Speclar:#000000/Ambient:#FFFFFF
- Reflect:0
- AOをテクスチャにBake
- Albedoはテクスチャに乗算
AOTexture/PaintTexture/MainTextureをそれぞれ用意し、ペイントソフトでMain=AOPaintAlbede(矩形)として書き出して、最終結果としてはMainTextureを使うのがよさそうです。ペイントソフトではAOとPaintはスマートオブジェクト的なもので参照しておくと便利ですね。ただ、AOは全部出して焼くと稼働で離れる部分にも黒くなって醜いのでObjectProp>Visiblity>ShowInRendersで必要なものだけ出して焼く必要があります、これが結構めんどくさい。ちなみに、EeeveではベイクできないのでRenderProp>RenderEngineをCyclesにする必要があります。
ボーン
これもアーマチュアのボーンがそのまま持っていかれます。ただし、標準ボーンという命名規則があり、その命名規則に従っていると拾いもののモーションがさせるようになるので便利です。(準標準ボーンというのもあるらしい…) 名前解決なので、最後にでも対応すればよいかと思います。
IKを使う場合はチェーンの最後にダミーボーンが必要です。IK操作ボーンも含めてカニみたいになるはずです。
Blenderにはボーンの順番というものはありませんが、MMDにはボーンの順番が存在します。この順番は親→子の順になっている必要があり、壊れている場合、なぜか剛体の付いたボーンが消えたりします。
Blender上で順番を設定するには、適当なメッシュにダミーのアーマチュアを付けて名前をmmd_bone_order_override
とします。すると、そのメッシュのボーンにひもづけられた頂点グループの並び順にボーンがソートされて出力されます。
左右対称ボーンについては、Blenderでは***.L
/***.R
と命名しておくと対象操作などが効くようになっています。テンプレートボーンなどもそうなっています。しかし、MMDでは左***
/右***
といった命名がなされています。また、標準ボーンの命名規則もあります。MMDの命名規則に合わせてしまうと、左右対称操作がきかなくなってしまいます。それを解決するためにmmd_toolsでは、出力時の名前をoverrideするためのプロパティが存在します。
モーフ
Belenderのシェイプキーのうち、名前解決で指定したものが持っていかれます。一緒にモーフのカテゴリも選択します。(目、口など)
名前解決なので、Blender上で複数メッシュで構成する場合には、キー名が被りに注意する必要がありそうです。
表示枠
タイムラインに表示される項目(ボーン)などを設定できる。 ここに設定しておかないと個別でキーフレームを打てなくなるので、操作前提のボーン/モーフは登録しておいた方がよさそうです。
剛体
これは、MMDタブから追加する必要があります。実体としては、PhysicsPropertiesでRigidbodyが指定+ObjectConstraintPropertiesでmmd_tools_rigid_parent
がついています。このConstraintがMMDタブからしか付けられないのでBlender標準の方で作って持っていくことはできなさそうです。
また、重要な項目はRigidTypeとShapeです。ShapeはそのままCollisionの形です。Bone
/Physics
/PhysicsBone
とありますが、Bone
は他のBoneと物理的な相互作用を起こしません。PhysicsBone
はボーンに追従する代わりに他のPhysicsBone
/Physics
からの影響を受けません。Bone
とPhysicsBone
逆でした。(じゃあ、PhysicsBone
ってなんぞ?) Physics
はボーンとしての操作ができなくなります。
このConstraintに引っ付くボーンを設定すれば完了です。TimeLineWindowに切り替えて再生すると物理演算の結果を見られます。
Joint
剛体同士を接続します。実体はPhysicsPropertiesでGenericSpring
が指定されたEmptyとなっています。
こちらは剛体と違い、Blender標準の方で作れそうですが、MMDタブから作った方が手っ取り早いと思います。二つのボーンを選択した状態で「+」を押せば、ボーンの参照を設定するとこまでやってくれますし、間違えることもないでしょう。
SoftBody
もっちな肌や、布の表現ができるようですが、mmd_toolsからはできないので省略します。ある程度はBoneの組み合わせで代替できますしね。
まとめ
以上で、物理演算まで対応することができました。世に出回っているMMDモデルが実装している項目程度はカバーできていると思います。
未解決の問題
メッシュが重なっって描画された時の謎のアーティファクト
ポリゴンの隙間に線が入るのなんなんだろう…?
— うぷはし (@yukawallstudio) 2019年8月4日
テクスチャも使ってないから境界の問題でもないでしょうし?? pic.twitter.com/b23qO793RV