3DプリンタでMMDデータを出力する - その3


概要

さて、先に説明の手順では、ポーズを固定したデータを加工して開口部を塞ぎました。 しかし、複数のポーズで出力したい場合、ポーズ後に編集していたのでは、時間がかかってしまいます。
そこで、ポーズを取らせたいお気に入りのモデルが見つかったら、まずは開口部になりそうな部分を塞いでしましょう。 そうすれば、どんなポーズも比較的容易にソリッドへ変換することが可能となります。
今回は、PMD形式のモデルデータを編集し、開口部を塞いだPMDデータに再出力します。 その後、VMDデータから、PMDモデルにポーズを適用します。 そして、先の手順により3D出力可能なデータに変換し、実際に出力します。

用意するもの

ハードウェア
みんな大好き3Dプリンタを使います。
ソフトウェア
以下のソフトウェアをそれぞれダウンロードしてインストールします。 この文書では、それぞれ表記のバージョンで作業しましたが、最新版で問題ないと思います。
アドオン
以下のアドオンを新しく追加します。ダウンロードして、展開して保存しておきます。
テストケース
ダウンロードして、展開して保存しておきます。

手順

1. blenderの環境設定

1-1. pymeshioを展開して、その附属の文書に従い、blender26-meshioフォルダをblenderのaddonsフォルダにコピーします。
1-2. blenderを起動します。 はじめて起動した人はまずその1の手順の環境設定を完了してください。
メニューから[File] → [User Preferences...]と選択してBlender User Preferencesウィンドウを開きます。 [Addons]ページの検索欄にmeshioと入力し、meshioアドオンを見つけて下さい。 見つけたら、右端のチェックボックスをチェック状態にして、アドオンを有効化します。
1-3. ひきつづきBlender User Preferencesウィンドウの[System]ページを開いて下さい。 右下の[International Fonts]にチェックを入れて下さい。 そうすれば、その下にLanguage欄が表示されますので、[Japanese(日本語)]を選択します。
ここまで設定したら、左下の[Save User Settings]を押して、設定をスタートアップファイルに保存します。
今回は日本語部分もたびたび参照しますので、文字化けしたままでは少し厄介になります。 ちなみに、Translate以下の各ボタンを押しておけば、UIも日本語になりますが、ここでは説明が煩雑になるため使いません。

2. データ編集準備

2-1. [File] → [Import]から、[MikuMikuDance model (.pmd)]を選択し、ダウンロードした Lat式ミクVer2.3_Normal.pmd を開いてください。 似たような項目がたくさんあるので、間違えないように注意して下さい。
2-2. pmdデータがインポートされました。 右のOutlinerパネルから、[LatミクVer2.3N]の左の+をクリックしてツリーを開き、[mesh]を選択します。 選択したら、EditModeに切り替えて下さい。
あるいは、単に形状部分を右クリックして選択してからTABキーを押しても構いません。 TABキーを押せば、EditModeとObjectModeが交互に切り替わります。
2-3. "P"キーを押して、Separeteメニューを表示し、[By Material]を選択します。 [By loose parts]を選択すると分解されすぎて、動作が非常に重くなるので注意して下さい。
2-4. モデルの各部位がそれぞれ別のオブジェクトに分解されます。 ObjectModeに戻って下さい。
2-5. 編集したいオブジェクトを個別に別のレイヤに移動させます。 "A"キーを押して選択解除してから、上着を右クリックして選択し、"M"キーを押します。 Move to Layerメニューが表示されたら、2番目のレイヤを選択します。
2-6. 次に下半身上部を選択して3番目のレイヤに移動させます。
2-7. 最後に後頭部を選択して4番目のレイヤに移動させます。
これで準備が整いましたが、以下の作業に進む前に、テンキーの"5"を押すか、メニューの[View] → [Veiw Persp/Ortho]を選択して、正方投影に切り替えておいて下さい。

3. 開口部に面を張る

3-1. 表示を2番目のレイヤに切り替えて、上着を選択し、EditModeにしてください。
3-2. 前回はナイフで切って水平面を作りましたが、モデルへの影響を最小にするため、今回は既存の頂点を使用して面だけを張ります。
頂点が選択されていれば、"A"キーを押して選択解除して下さい。 そして、上着の切れ目の一つ上の頂点を1回右クリックして選択します。 それから、向かって右の腰のあたりの頂点をShft+右クリックで追加選択します。
3-3. "W"キーを押して下さい。 Specialsメニューが表示されます。 そうすれば、[Select Vertex Path]を選択して下さい。 同じことはメニューの[Select] → [Vertex Path]でもできます。
3-4. はじめに選択した頂点から、あとに選択した頂点まで、連続した頂点パスが選択されました。 胴を一周するまで、これを続けます。
3-5. 後ろに回り込んで、右端の頂点をShift+右クリックで追加選択し、[Select Vertex Path]すると、このようになりました。 本当はその下のラインを通って欲しかったのですが、距離が遠いとこうなる場合もあります。
3-6. その場合は、Ctrl+Zを二回押してアンドゥし、追加の頂点選択からやり直します。 少し短い距離で追加の頂点を選択し、[Select Vertex Path]をすれば、意図したラインで繋がりました。
3-7. 最後は、最初の頂点のひとつ前の頂点を選択して[Select Vertex Path]をすれば、胴を一周する頂点パスが繋がります。
3-8. "F"キーを押して、面を作成します。 これはメニューの[Mesh] → [Faces] → [Make Edges/Faces]と同じです。
これで上着の作業は終了です。 ObjectModeに戻って下さい。
3-9. 3つめのレイヤに切り替えて、下半身を選択し、EditModeにします。
3-10. 開口部の2頂点を選択し、メニューの[Select] → [Edge Loop]を選択します。
3-11. 開口部の一周が選択されれば、"E"キーを押して下さい。 メニューから[Mesh] → [Extrude Region]を選択してもよいです。
Extrude Regionモードになったら、"Z"キーを二回押して移動方向をZ方向限定にし、程よく、少し長めに上に伸ばして下さい。
もし操作を間違えて、途中でESCを押したときは、注意してください。 Extrude Regionは、頂点のコピーと、その移動の二段構成になっています。 ESCでは移動だけがキャンセルされ、頂点のコピーはキャンセルされません。 その結果、元の頂点があった場所にコピーされた頂点が重なり、二重頂点状態となります。 解決方法はいくつかありますが、確実なところまでCtrl+Zでアンドゥするのが簡単でしょう。
3-12. さて、下半身を伸ばし終わったら、ObjectModeに戻って下さい。 2番目のレイヤをShift+クリックで選択し、2番目と3番目のレイヤを両方表示状態にします。 そして、Alt+Bで向かって右の半身を選択して、断面の様子を確認します。
3-13. 先ほど上着に追加した面を、下半身が貫いています。 こうなっていれば問題ありません。
3-14. しかしそれにしても少し貫き過ぎのような気もします。 あまり突き抜けていると、体を動かしたときに外に飛び出す可能性があります。 下半身の頂点を少し下げておきましょう。
3-15. EditModeに切り替えれば、先ほどの選択状態が保存されています。 このまま"G"キーを押して下さい。 または、[Mesh] → [Transform] → [Grab/Move]でもOKです。
3-16. カーソルを動かせば、頂点が追従しますので、ちょうど良いところまで頂点を下げます。
この編集方法は、身体の左右方向にも頂点が少し移動しますので、気を付けて下さい。 厳密に編集する方法もありますが、少々のことであれば、見えない部分ですので、今回は簡易的に行います。
3-17. さて最後に後頭部です。 後頭部では、面を張る前に少し前処理をします。
4番目のレイヤを表示し、後頭部を選択して、EditModeに切り替えます。 切り替えたら、"A"キーを押して全選択状態にして下さい。
3-18. "W"キーを押してSpecialsメニューを表示し、[Remove Doubles]を選択して下さい。
3-19. 画面の上のステータスバーに Removed 50 vertices と表示されます。
3-20. "A"キーを押して選択解除したら、メニューから[Select] → [Non Manifold]を選択します。 Shift+Ctrl+Alt+Mを押しても同じですが、指が攣りそうになります。
3-21. 開口部が一周選択されたら、メニューから[Mesh] → [Faces] → [Fill]と選択します。 Alt+Fぐらいなら押しても良いです。
3-22. 開口部に面が張られました。 これで後頭部の編集は終了です。 ObjectModeに戻って下さい。
ちなみに、二重頂点を削除しないままNon manifoldを選択するとこのようになります。 二重頂点があること自体は構わないのですが、今回は作業が増えてしまうため、前処理で削除しました。
3-23. 開口部の編集は終わりましたが、PMDでエクスポートする前に、顔の部分を少し整理します。 このモデルでは、レンダリング画像の調整のために、顔の表面から少し浮いて透明なポリゴンが配置されています。 これは3D形状の出力には必要がなく、外形状に干渉するため、取り外しておきます。
前髪のすこし下の黄色い部分を右クリックして選択し、"X"キーを押します。 確認メニューが表示されたら[Delete]を選択し、削除します。
3-24. あごの部分を選択し、EditModeに切り替えます。
3-25. EditModeにすると、頬のところに一枚オーバーコートがあることが解ります。 いろんなパーツが複雑に錯綜していますので、もし違うパーツを選択していれば、やり直してください。
カーソルをそのオーバーコートの頂点のひとつの近くに置いて、"L"キーを押します。
3-26. オーバーコート部分が選択されました。
3-27. "X"キーを押して、Deleteメニューを表示します。 [Vertices]を選択して、頂点を削除して下さい。
3-28. もうひとつ、鼻柱の部分にもオーバーコートがあります。 頂点にカーソルを近づけて"L"で一括選択し、"X"キーを押して、[Vertices]を選択して削除して下さい。 ここまで完了すれば、ObjectModeに戻って下さい。
顔面自体を削除しないように気を付けて下さい。 間違えた場合は、Ctrl+Zでアンドゥしてやり直します。
3-29. 右のOutlinerパネルで、LatミクVer2.3Nをクリックし、選択状態にします。 それから、メニューの[File] → [Export] → [Miku Miku Dance Model(.pmd)]を選択し、エクスポートします。
3-30. ここでは、Lat式ミクVer2.3_Normal_mod.pmdと名前を付けました。 pmdデータは、外部テクスチャを参照するため、元のデータと同じフォルダに保存します。
これでblenderでのpmdデータの編集は終了です。 ただし、今回のデータは、エクスポートされたpmdにボーン接続の不具合が少々ありますので、次の作業で修正します。

4. ボーンの順序修正

4-1. PmxViewを起動して、Lat式ミクVer2.3_Normal_mod.pmdを読み込みます。 とくに問題ないように見えますが、F9キーを押してTranformViewを開いて下さい。
4-2. なにやら名状しがたき様態になっています。
4-3. Pmx編集ウィンドウを開き、ボーンタブを確認しましょう。 親ボーンの参照番号が自分の番号よりも大きいボーンがいると、このような状態になります。
4-4. スクリプトを使ってボーン番号を付け直します。 メニューから[編集] → [プラグイン] → [CSScript] → [C#スクリプト]を選択します。
4-5. CSScriptウィンドウが表示されたら、メニューの[ビルド]を開きます。 そして[簡易形式:ヘッダコード追加]と[簡易形式:フッタコード追加]のチェックは両方とも外した状態にします。
4-6. 以下の通りスクリプトコードを入力して、[実行]をクリックして下さい。
IPEPluginHost host = args.Host;
IPEConnector connect = host.Connector;
IPEXPmd pex = connect.Pmd.GetCurrentStateEx();

for(int i=0; i<pex.Bone.Count; ++i)
{
	if(pex.Bone.IndexOf(pex.Bone[i].Parent) > i)
	{
		IPEXBone rbx = pex.Bone[i].Parent;
		pex.Bone.Remove(rbx);
		pex.Bone.Insert(i, rbx);
		--i;
	}
}

connect.Pmd.UpdateEx(pex);
connect.Form.UpdateList(UpdateObject.All);
connect.View.PMDView.UpdateModel();
connect.View.PMDView.UpdateView();
4-7. スクリプト実行開始.....終了 まで表示されればOKです。
4-8. TransformViewで正常に表示されていることを確認します。
これで、ポージングセーフなモデルデータが完成しました。 念のため、pmxファイルに名前を付けて保存しておきましょう。 以下の手順からは参照しませんので、名前は何でもOKです。

5. ポージング

5-1. さてそれでは、VMDからポーズを読み込みます。 TransformViewウィンドウの[モード] → [VMDリスト]を選択して下さい。
5-2. VMDリストウィンドウのメニューから[ファイル] → [VMD追加]で、ダウンロードした まゆたんのカンフー正宗0-605.vmd を開きます。
5-3. リスト項目を右クリックして[選択]を選択すると、モーションが選択されます。
最初から入っているstand.vmdは、ここでは消しましたが、残しておいても構いません。
5-4. TransformViewのツールバーから、[リアルタイム更新]と[モーション再生]を有効化すれば、モデルが動き始めます。 [物理演算]は、必要に応じて、有効化したり無効化したりします。
5-5. 好みのポーズの部分ですかさず[モーション再生]を止めれば、その姿勢が固定されます。 ここで、[ファイル]→[現在の形状で保存]すれば、その姿勢でのPMXファイルが出力できます。
あとの作業は、以前のその1の手順と全く同じです。 出力したPMXデータをblenderで読み込んでからstlで出力し、MeshLabでUniform Mesh Resamplingをかけます。 そして、それを再度blenderで読み込んで、内部と外部を分離します。 後処理のShrinkWrapやDecimateは好みで調整して下さい。

Appendix. リーク箇所の特定

しかし、あらゆるモデルに対して、たった3箇所の形状編集でうまくいくとは限りません。 不幸にも内部と外部が繋がってしまった場合の対処法について、以下で説明します。 ここまでの手順と操作に慣れていることを前提に、手短に説明します。
A-1. まず、MeshLabでUniform Mesh Resamplingをかけて、外皮の抽出まで行います。 Alt+Bで細長く選択して、断面を見ます(下図)。 このデータは、後頭部と胴体部がリークしています。
いったいどこから? それを特定しないと、編集すべき箇所が明確になりません。
以下の手順でリーク箇所を特定しましょう。 まず、頂点数を減らして作業しやすくします。 [Add Modifier]からDecimateモディファイアを追加し、Ratioを0.05にして[Apply]します。
A-2. 頂点数を減らしたら、今度はAlt+Bで半身を選択して、モデルの半身だけを表示状態にします。 そしてEditModeに切り替え、形状の外側のどこかと内側のどこかで、2頂点を適当に選んで選択状態にします。 それから、Select Vertex Pathを使用します。
A-3. 外側から内側までの経路が頂点パスとして表示されました。
A-4. 表示範囲限定を解除して、後頭部の少し下から見たところです。 パス経路から、首筋からうなじのあたりから、内部に侵入していることがわかります。 これで、首の近辺を重点的に塞ぐ必要があることがわかりました。
リークを防ぐためにどのように編集すればよいかは、ケースによってさまざまです。 基本的には、開口部に面を張るか、開口部を引き延ばして別の面に交差させるか、ということを行えばOKです。

6. 出力

6-1. 今回は5体のポーズを出力しました。 数が多いですので、Low設定でどんどん出力しました。
一体目。1時間44分。サポートが途中で途切れたので、足先がすこし垂れてしまいました。
6-2. 二体目。1時間54分。これは完璧です。
6-3. 三体目。1時間38分。これも完璧です。
6-4. 四体目。2時間5分。これは途中で失敗したので、ここからサポート材を増やす設定で再出力しました。
標準のMakerBot Slicer ABS Templateを元に、一部を以下のように再設定しています。
    "layerHeight": 0.30, 
    
    "platformTemp": 115, 
    
    "doSupport": true, 
    "doSupportUnderBridges": true, 
    "supportAligned": true, 
    "supportLeakyConnections": true, 
    "supportDensity": 0.2, 
    "supportExtraDistance": 2.0, 
    "supportAngle": 68.0, 
    "supportModelSpacing": 0.4, 
    "supportExcessive": false,
6-5. 五体目。2時間5分。これは一回目、出力時に転倒したため、90度回して再挑戦しました。
6-6. 全員集合。
成功した出力だけでも10時間に及ぶ大プロジェクトでした。 失敗した時間も含めると、全部で12時間ぐらいかかっています。
ABSフィラメントの使用量は、サポート材を含めて一体あたり20g前後で、全部で約100gです。
フィラメントはリールあたり1kgで供給されています。 これからすると、1kgというのは莫大な量に思えるのですが、それでも気がつくと無くなっているのが恐ろしいところです。
6-7. 近寄ってみます。 あれ、なんかかっこいい……
6-8. クロースアップ。 未加工で出力しているので、手が袖にめり込んでいますが、気にしません。
6-9. まるで仏のように穏やかな表情ですね。
6-10. 指の形もちゃんと表現されています。
6-11. 後列の彼女からは、幾多の修羅場をくぐり抜けてきた深みを感じます。
6-12. 勝てる気がしません。土下座して許しを請いましょう。
6-13. 最後に明るめの写真で。
積層厚みは全て0.3mmです。 かなり荒い積層ですが、これでも立体形状の楽しさは、十分に出ています。
0.1mm積層にすればまた全然雰囲気が変わります。 ただし、失敗しやすくなるのと、時間がかかりすぎるので、今回はパスしました。 Replicator 2Xでは、CG用途のデータを0.1mm積層でそのまま出力するのには、少し物理的な困難があります。 出力しやすいような形状にする工夫が必要でしょう。

2013/7/14 初版
不明な点があれば章節番号添えて@junnnoへ。または感想や応用情報など、手を叩いてよろこびます
nanos gigantum humeris insidentes.

戻る