MagicaVoxel→Blender→Unityでボクセルモデルを動かす 改②
ボクセルモデルに自動ウェイト機能を使って楽をしたい、の2回目。
前回は、MagicaVoxelからエクスポートしたモデルで自動ウェイト機能が使えずどうしよう、というところまで進んだ。
MagicaVoxel内ではデータを格子状で持っているはずなのに、obj形式で出力するときに最適化してくれているようだ。
それはそれでありがたい機能なのだけど、今やりたいことに対してはちょっと困ってしまう。
・MagicaVoxelから別の形式でエクスポートしてみる
MagicaVoxelがエクスポートできる形式はobjだけではない。
他の形式でエクスポートすればなんとかならないだろうか。
というわけで、この中からply(ply Mesh)というのを選んでみた。
Wikipediaに説明がある。
PLY (file format) - Wikipedia, the free encyclopedia
エクスポートしたファイルをテキストエディタで開いてみた。
なんと各頂点の座標に加えて色の情報も持っている。
確かにエクスポートしたファイルは1つだけでpngファイルが無かった。
・Blenderにお試しインポート
Blenderを起動して、plyファイルをインポートしてみる。
スケールを整えてWireframeで表示してみる。
お、元のボクセル通りのメッシュになっている。これはいけそうだ。
・ボクセルモデルを差し替える
また最初からやり直すのも大変なので、以前アニメーションまで作成したファイルを読み込んで、ボクセルモデルだけ差し替えてみよう。
Pose Modeで全部のボーンを選択し、下のメニューからPose→Clear Transform→Rotationを選択して、アニメーションの回転情報を初期化する。
初期のポーズに戻ればOK。
次に、ボクセルモデルとArmatureの関連付けを外す。
Object Modeでボクセルモデルを選択して、右のレンチアイコンをクリックしてその下の赤枠「×」ボタンを押す。
Pose Modeでボーンを動かしてもモデルは動かなくなったはず。
ここまでできたら、ボクセルモデルを選択してDeleteキーを押す。確認のポップアップが出るのでDeleteを選択する。ボーンだけが残る。
plyファイルを読み込んで、Sキーを押して0.1と入力してスケールをあわせる。
同じに見えるけどメッシュの形は前回と全く異なる。
さて、前回の操作を実行して自動ウェイト機能を使用・・・といきたいところだけど、その前に不要な頂点を削除する。
設定にもよると思うが、画面の右上に現在読み込んだモデルの情報が出ている。
このモデルは頂点数が9136個となっている。
前回まで読み込んでいたモデルとメッシュが異なるとはいえ、4倍強ほどの数だ。
ply形式は1つのポリゴンを構成する4つの点をポリゴン毎に別々で持っているため、今回のような格子状メッシュだと1つの頂点が大体4回くらい使われることになるからだろうと思う。
重複する頂点は削除しよう。
【2020/04/24追記】
Blender2.8では重複頂点削除の機能自体が大きく変わったので、以下と同様の名前で探しても見つからない。詳細はこちらの記事で。
Object Modeでボクセルモデルを選択してEdit Modeに切り替える。
全部頂点を選択した状態(全身がオレンジになる。なっていなければAキーを2度押し)で、下のメニューからMesh→Vertices→Remove Doublesを選択する。
見た目は変わらず、右上の方に削除した情報が表示される。
6854個の頂点が削除されて、2282個になった。
大体前回のモデルと同じくらいになった。
・自動ウェイト機能を使用する
準備ができたので、前回記載した方法を実行してみよう。
エラーメッセージが出力されることもなく完了した。
早速Weight Paintに切り替えてみる。
おお、人の手では難しそうな綺麗なグラデーションで塗られている。
ただ、よく見ると頭だけを動かしたいときに肩も少し動いてしまいそう。
このように完全に思い通りにはならないところも出てくるので、そのときは手で修正することになる。こればかりは仕方が無いが、やり方はわかる。前回までの苦労は無駄ではなかったのだ。
自分の場合は、肩が頭の半分くらいまで動くようになってしまっていたので修正した。
そもそも、こうならないようなモデリングやボーンを作る技術というものも必要になりそうだ。
ボーン自体は変わらないので、以前作成したアニメーションをそのまま適用できる。
以前作ったものよりも、メッシュが均等で綺麗に動いてくれるのが嬉しい。
Unityへの取り込み以降は前と同じだろうと思っていたら、データの持ち方が違うためかエラーが出てしまったので、次回はその辺を調べてみる。