tanaka's Programming Memo

プログラミングについてのメモ。

MagicaVoxelのPLYファイルにウェイト設定してUnityでアニメーションさせる

f:id:am1tanaka:20180725214056g:plain

以前、表題の作業手順をまとめました。しかし、手軽にモデルを修正してエクスポートし直すには手順が多くて煩雑です。

また、PLYで出力するといい感じのメッシュで出力してくれるのですが、テクスチャーを自分でベイクする必要がありより面倒に。よさそうな方法も見つからず、もう自分で作っちゃえ、と、Blenderスクリプトを作成しました。

github.com

このスクリプトを使って、MagicaVoxelで出力したPLYファイルをUnityでアニメーションさせる手順をご紹介します。

素体を使わずにオリジナルでキャラクターを作った場合は、mixamoでウェイトをした方がよいでしょう。その場合はこちらをご覧ください。

目次

準備

予め、こちらを参照して、Blenderスクリプトをインストールしてください。

また、だいし様のMagicaVoxelで作ったプリキュアをUnityで動かすの記事で配布されているMagicaVoxel用素体(base.vox)と素体用アーマチュア(BaseArmature.blend)を利用するので、ダウンロードしてください

github.dev7.jp

PLYファイルからウェイト設定したキャラクターモデルとテクスチャーをエクスポート

MagicaVoxelでキャラクター作り

  • MagicaVoxelを起動して、base.voxを読み込みます
  • 記事に従ってキャラクターを作成します(手順を確認する場合はbase.voxのままで構いません)
  • キャラクターが完成したら、Export -> plyをクリックします

f:id:am1tanaka:20180725212913p:plain

  • 分かりやすい場所に任意のファイル名で保存します。ファイル名は半角英数のみ推奨(日本語や全角が混じったファイル名だとUnityで不具合が起きる可能性があります)

f:id:am1tanaka:20180725212935p:plain

アーマチュアとPLYの読み込み

ここからはBlenderでの作業です。必要なファイルを読み込みます。

  • Blenderが起動していなければ起動します
  • ダウンロードしてあったBaseArmature.blendBlenderにドラッグ&ドロップするなどして開きます

f:id:am1tanaka:20180725212953p:plain

  • 3D Viewの左のメニューからMiscタブをクリックします

f:id:am1tanaka:20180725213004p:plain

  • Import PLYボタンをクリックします

f:id:am1tanaka:20180725213017p:plain

  • PLYファイルのフォルダーを設定して、読み込むファイルを選択して、Import PLYボタンをクリックします

f:id:am1tanaka:20180725213034p:plain

デフォルトのPLYのサイズだと大きくなりすぎるので、アーマチュアとサイズが丁度良くなるようにサイズを0.22倍するようにしています。倍率は左下のScale欄で設定できるので、読み込みと同時にサイズを調整したい場合は、値を変更してからImport PLYをクリックしてください。

PLYファイルのインポートが完了しました。

f:id:am1tanaka:20180725213047p:plain

デフォルトのアーマチュアとbase.voxを使っていれば、大きさと位置が合っているはずです。もし、モデルとアーマチュアの配置がずれている場合は、縮小や移動をして上記のように重ねてから次に進んでください。

ウェイト設定

Blenderでウェイトを設定する場合は、メッシュとアーマチュアを階層して親子設定をするのですが、それらをAuto Weightボタンで自動化しました。

f:id:am1tanaka:20180725213125p:plain

以下のように、Outlinerarmatureの子供にメッシュが設定されていれば成功です。

f:id:am1tanaka:20180725213136p:plain

エクスポート

PLYはテクスチャーを持たないので、Unityで色を付けるにはテクスチャーをベイクする必要があります。また、マテリアルの作成も必要です。それらの作業を自動的に実行します。

  • Export FBX and Textureボタンをクリックします

f:id:am1tanaka:20180725213150p:plain

  • エクスポート先とファイル名を設定したらExport FBX and Textureボタンをクリックすれば完了です

f:id:am1tanaka:20180725213203p:plain

デフォルトで生成されるテクスチャーのサイズは512x512ピクセルです。ボクセル数が多いと足りないかも知れないので、Unityで見た時に色がずれているような場合は、Texture WidthTexture Height10242048に変更してみてください。

ボクセル数が少なくて、もっと小さいテクスチャーで構わない場合は128256にしてみてください。テクスチャーのサイズは2のテクスチャーのサイズは2の累乗である必要があります。よく分からない場合は、この設定はいじらないでください。

モデルのエクスポート自体は、ここまでで完了です!出力先のフォルダーに、以下のようにfbxpngの2つのファイルが出力されていれば成功です。

f:id:am1tanaka:20180725213217p:plain

Unityで動作確認する

出力したファイルがちゃんとUnityで動くか確認してみましょう(ここからは内容的にはオマケなのですが、記事的にはここからの方が長いです^^; ヒューマノイドモデルの使い方に慣れていたら、この先の手順は不要ですので、エクスポートしたファイルをご利用ください)。

以下、前提です。

  • Unity2018.1.3で確認(2017以降なら似たような操作でいけると思います)
  • Standard Assetsインストール済み

テスト用シーンを作成する

Unityを起動して、確認用のプロジェクト(空のプロジェクトでよいです)を開きます。

  • AssetsメニューからImport Package -> Charactersを選択して、Importします

f:id:am1tanaka:20180725213417p:plain

  • 地面が欲しいのでPlaneを作成します。HierarchyビューのCreateをクリックして、3D Object -> Planeを選択します

f:id:am1tanaka:20180725213428p:plain

  • Hierarchyビューで作成したPlaneをクリックして選択します
  • Inspectorビューで、Transformの右の歯車アイコンをクイックして、Resetを選択して、場所を原点にしておきます

f:id:am1tanaka:20180725213613p:plain

  • Planeにマテリアルを設定して色を着けたり、Main Cameraの位置を調整して、Gameビューでそれっぽく見えるようにします

f:id:am1tanaka:20180725213624p:plain

  • Projectビューで、Standard Assets -> Characters -> ThirdPersonCharacter -> Prefabsの左の三角アイコンをクリックして開きます

f:id:am1tanaka:20180725213632p:plain

  • ThirdPersonControllerプレハブをドラッグして、Sceneビューで良さそうな場所に配置します

テスト用のシーンができました。Playして、矢印キーや[A][S][D][W]キーでキャラクターを操作できます。

作成したキャラクターを設定

エクスポートしたキャラクターを読み込み、設定します。

  • BlenderでエクスポートしたFBXPNGを[Ctrl]キーを押しながら選択して、まとめてUnityのProjectビューにドロップします

f:id:am1tanaka:20180725213725p:plain

注意!! FBXとPNGファイルを同時にドラッグ&ドロップしないとテクスチャーが貼られないので気を付けてください!!

  • Projectビューで、読み込んだPNGを選択して以下を設定します
    • Generate Mip Mapのチェックを外す
      • 小さくした時に変な線が出ることがあるので
    • Wrap ModeClampに設定
      • 画像端のにじみ防止
    • Filter Modeを*Point(no filter)に設定
      • にじみ防止
    • 以上できたら、Applyボタンをクリック

f:id:am1tanaka:20180725213740p:plain

  • Projectビューで、読み込んだモデルをクリックして選択します

f:id:am1tanaka:20180725213751p:plain

  • Modelについて、以下を設定します
    • Import Visibility, Import Cameras, Import Lightsのチェックを外す
      • くっついてませんが念のため
    • 設定したらApplyボタンをクリック

f:id:am1tanaka:20180725213800p:plain

  • Rigについて、以下を設定します
    • Animation TypeHumanoidに変更します
    • Applyボタンをクリックします

f:id:am1tanaka:20180725213809p:plain

これで、Configure...の左にチェックが表示されれば成功です。これをやらないと、設定したアーマチュアなどの設定が反映されないので重要な設定です。

以上でキャラクターの読み込みと設定完了です。

プレイヤーに適用して動かす

読み込んだモデルをテスト用のキャラクターに差し替えて動かして見ましょう。

  • Hierarchyビューで、ThirdPersonControllerの左側の三角をクリックして開きます

f:id:am1tanaka:20180725213855p:plain

  • Hierarchyビューで、[Shift]キーを押しながら、EthanBody, EthanGlasses, EthanSkeletonの3つを選択します

f:id:am1tanaka:20180725213907p:plain

  • Inspectorビューの左上のチェックを外して、選択したオブジェクトを無効にします

f:id:am1tanaka:20180725213916p:plain

  • Projectビューから読み込んだモデルをドラッグして、HierarchyビューのThirdPersonControllerにドロップします

f:id:am1tanaka:20180725213924p:plain

  • Hierarchyビューで、ドロップしたモデルをクリックして選択します

f:id:am1tanaka:20180725213932p:plain

  • Inspectorビューで、Animatorの左のチェックを外して、モデルにくっついているアニメーターを無効にします

f:id:am1tanaka:20180725213941p:plain

ThirdPersonControllerのアニメーターを作成したモデルで再生するようにします。

  • Projectビューで、読み込んだモデルの左の三角をクリックして開いておきます

f:id:am1tanaka:20180725214004p:plain

  • Hierarchyビューで、ThirdPersonControllerをクリックして選択します

f:id:am1tanaka:20180725213952p:plain

  • Projectビューからモデルの子供にあるAvatarをドラッグして、InspectorビューのAvatar欄にドロップします

f:id:am1tanaka:20180725214021p:plain

これで、ThirdPersonControllerのアニメーターが、オリジナルキャラクターのアバターを制御するようになります。

Playして、矢印キーなどで操作してみてください。エクスポートに成功していたらアニメーションを確認できます。

f:id:am1tanaka:20180725214056g:plain

キャラクターの大きさを調整したい場合の注意点

動かして見るとちょっとキャラクターが大きすぎるようです。半分の大きさにしてみます。

重要なのは、親のゲームオブジェクトのScaleを変更しないことです。変更するのは、子供にしたモデルのオブジェクトのScaleにしてください。以下の通りです。

f:id:am1tanaka:20180725214039p:plain

RigidbodyをアタッチしているゲームオブジェクトのScaleは、必ず1にしておきます。これを守らないと当たり判定や動作で予想外の不具合を引き起こします。必ず守りましょう!

まとめ

以上で、MagicaVoxelで作成したPLY形式のキャラクターにウェイト設定をして、Unityに読み込んで、テスト動作させることができました。

Unity側での作業も少々あるので、一瞬で完了できる、というほどではありませんが、かなり手軽にモデルの修正をして、Unityに持ってくることができるのではないかと思います。

ご活用いただければ幸いです。

参考・関連URL