tanaka's Programming Memo

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

MagicaVoxelで作ったキャラをVRM化してclusterのアバターにする

clusterのゲームジャムイベントの時にデフォルトのアバターというのもなんだな~と思ってVoxelorerBirdの主人公キャラをアバター化してみました。

f:id:am1tanaka:20220326163636p:plain

VoxelorerBirdの主人公にはすでにボーンを設定していたのであっさり持っていけると思っていたのですが、ボーンの構造が単純すぎてVRM化に失敗。clusterの公式サイトで紹介されているmixamoでボーンを自動設定するのも、ボクセルキャラが人型ではなかったため失敗。やむを得ないのでVoxel Importerであらためてボーンとウェイトを設定することにしました。その際の作業の備忘録です。

※本記事のVoxel Importerへのリンクはアフィリエイトリンクです。

目次

使用ツール

以下のツールを使いました。

このうち、Voxel Importerは有料ですが、ボクセルを扱う最高のツールです。Unityでオリジナルのボクセルキャラを使ってゲームを作るならVery Animationとまとめてゲットしておくのがおススメです。

手順

MagicaVoxelでモデリング > Unityに読み込み > Voxel Importerでボーン設定 > dae形式でエクスポートして再読み込み > VRMにエクスポート、という流れです。

モデルの作成

Magica Voxelでキャラクターを作ります。いわゆるTポーズで作ります。Magica Voxelのサンプルのchr_knightとかのままだと変なになるので、あれを使う場合は装備を外して手を伸ばしてください。

f:id:am1tanaka:20220326145853p:plain
NG

f:id:am1tanaka:20220326150146p:plain
こんな感じに修正

左手の先に髪の毛が繋がってて駄目っぽいですが、Voxel Importerでうまいことウェイトを設定すれば切り離すことができます。斜め接続もVoxel Imporeterなら大丈夫です。

モデルができたらMagica Voxelのデフォルト形式のvox形式で保存すればモデル作成は完了です。Unityのプロジェクトがすでにあれば、プロジェクトのAssetsフォルダー以下の任意のフォルダーに入れればすぐに使えます。

ボーンの設定

作成したvoxファイルをVoxel ImporterでUnityに読み込んでボーンを設定します。

  • Unityを起動して Voxel Importer をインポートします
  • 空のゲームオブジェクトを作成して、Voxel Skinned Animation Object コンポーネントをアタッチします
  • InspectorウィンドウのVoxel File欄にMagicaVoxelで作成したvoxファイルをドラッグ&ドロップで読み込みます

f:id:am1tanaka:20220326150748p:plain
voxのインポート

  • 読み込み直後はボクセルの一辺1m相当で読み込まれて巨大なので、Scaleで適度な大きさに調整します。例えばchr_knightは高さが15ボクセルなのでそのままだと15mに相当します。Import Scaleのx,y,zすべてを0.08にすれば1.2m相当になります
  • Import Offsetは、Setボタンをクリックして、Feetを選択すると足元の丁度よさそうな場所が設定されます。

f:id:am1tanaka:20220326151336p:plain
OffsetにFeetを設定

  • Animation欄でCreate > VoxelImporter > Editor > BoneTemplates > Maximum Humanoid(Mecanim).asset を選択して、必要なボーン構造を生成します

f:id:am1tanaka:20220326151518p:plain
ボーンの生成

  • 生成したボーンのうち、Jawがあると後でエラーになるので削除します

f:id:am1tanaka:20220326151635p:plain
Jawを削除

他にもclusterのドキュメントにないパーツは削除して構いません。

cluster. カスタムアバターの制限

  • RigのAnimationタイプに Humanoid を設定します

このままだとボーンが巨大すぎてclusterなどに持って行った時にちゃんと表示されないので、ボーンのサイズを合わせておきます。

  • Hierarchyウィンドウでvoxを読み込んだオブジェクトを開いて、Hipsを選択します

f:id:am1tanaka:20220326153629p:plain
Hipsを選択

  • Inspectorウィンドウで Edit Bone Position をクリックして選択します

f:id:am1tanaka:20220326153712p:plain
Bone Positionの設定

最初はこのぐらいボーンの大きさが合っていません。

f:id:am1tanaka:20220326153758p:plain
Boneの位置合わせ

  • Scaling All欄に0.5を入力してApplyボタンを押して、それらしいサイズに調整します

f:id:am1tanaka:20220326153916p:plain
ざっくりサイズ合わせ

ボーン合わせとウェイト設定は慣れるまで大変なので、先に動作確認のためにVRMに出力してみましょう。

VRMの作成

VRMを作成するには、notargsさんのUniVRMを利用します。

github.com

ドキュメントに従ってUnityプロジェクトにインポートしてください。

Voxel ImporterのオブジェクトのままだとVRMに書き出せないので、一度エクスポートしてUnityの通常のアセットにします。

  • InsectorウィンドウのVoxel Skinned Animation Objectの三点アイコンをクリックして Export COLLADA(dae) File を選択します

f:id:am1tanaka:20220326152647p:plain
daeファイルでエクスポート

  • Assetsフォルダー内の適当な場所にエクスポートします。チェックは全てついていてOKです
  • Projectウィンドウでエクスポートしたdaeファイルを選択します
  • InspectorウィンドウでRigを選択して、Animation TypeがHumanoidになっていることを確認します。違う場合はHumanoidにしてApplyをクリックします
  • VRM0メニューから Export to VRM 0.x を選択します

f:id:am1tanaka:20220326152726p:plain
VRMエクスポート

  • 下の方にあるTitle欄にアバター名を入力します。例えばchr_knightなど
  • Versionに適当なバージョン番号(0.1.0など)を入力します
  • Authorに著作権者名入力します。自作のモデルなら自分の名前、他の人のものならその人の氏名(chr_knightならEphtracy)を入力します

以上設定したら Export ボタンをクリックして出力します。デスクトップなどの適当なフォルダーを指定して出力すれば完了です。出力したvrmファイルをclusterのアバターなどにアップロードします。

f:id:am1tanaka:20220326154518p:plain
clusterのアバターにアップロード

ウェイトを設定していないのでTポーズのままですが、ワールドに入れるはずです。

f:id:am1tanaka:20220326154430p:plain
とりあえずアバター化成功!!

あとは必要に応じて Voxel Skinned Animation Object の Advanced 設定をしたり、ウェイトを設定して、daeファイルのエクスポートからVRMファイルを作り直せばOKです。

Voxel Importerでのウェイト設定

苦戦したのでコツをメモしておきます。なにはともあれ、まずは公式動画を一度視聴します。

youtu.be

以下が作業のコツです。

  • 近寄って作業したいのにモデルがカメラを突き抜けてしまうとか、回転位置がおかしくて操作しにくい場合、注視点を設定することで直せます。Hierarchyウィンドウでウェイトを設定したいキャラクターをクリックして選んで、Sceneウィンドウ上にマウスカーソルを移動させたら、Shift + F キーを押します。これでズームや回転が操作しやすくなります
  • Sceneウィンドウは Iso(等角図)にした方がパースがかからずに設定しやすいと思います

f:id:am1tanaka:20220326155247p:plain
Isometricモード

  • ウェイト編集モードでモデルが真っ黒になって形状が確認しにくい時は、Spaceキーを押すと元の絵が表示できます
  • Spine(背骨)など親側から設定します
  • 全てのボーンにウェイトを設定する必要はなく、Spine, Left Upper Arm, Left Lower Arm, Left Hand, Head, Left Upper Leg, Left Lower Legあたりにざっくりと設定します
  • 頂点モード(Vertex)のRectでざっくりと設定すると、内部のボクセルもまとめて塗られて楽です
  • ボクセルが隣接していたり、斜めになって頂点が共有されている場合は、VoxelモードとVertexモードを上手に使い分けて塗ると正しく分割できます

f:id:am1tanaka:20220326161027p:plain
髪とくっついている手をVoxelモードでウェイト設定

f:id:am1tanaka:20220326161058p:plain
手にウェイトを設定。髪の毛は真っ黒なのでウェイト0

f:id:am1tanaka:20220326161202p:plain
切り離してアニメできます

  • ウェイトは1か0でめりはりをつけて設定しておく感じ
  • まずはざっくり設定して、細かいところはあとで修正

こんなところです。はじめのうちはコツが掴めず何回もやり直しましたが、動画を参考に、アニメさせながら調整するとか、ざっくり設定する感覚が把握できると、結構さくさくと設定できるようになりました。

揺れもの

UniVRMのVR Spring Boneを使うと、髪の毛やしっぽなどの揺れものを設定できます。詳しくはVirtualCastの以下のWikiにあります。

virtualcast.jp

Voxel Importerで作成した場合はドキュメント内のsecondaryに該当するものがないので、以下のような手順で下準備します。

  • ボーンにしたい位置に空のゲームオブジェクトを作成して、Voxel Importerの Voxel Skinned Animation Object Bone をアタッチしてボーンにします
  • ウェイトを設定します
  • Collada形式でエクスポートして、Unityオブジェクトに変換します
  • daeファイルをHierarchyウィンドウにドラッグ&ドロップしてシーンに読み込みます
  • シーンに読み込んだルートオブジェクトの子供にスプリング管理用の空のゲームオブジェクトを作成して、VR Spring Boneコンポーネントをアタッチします

あとは、Virtualcastのドキュメントに従って揺れ設定をすればOKです。

移動や回転が速すぎると当たり判定を設定しても反対側にすり抜けてしまって戻らなくなったりしました。スプリング(Stiffness Force)を最大に固くして、抵抗(Drag Force)を大きくして、重力を軽くして(Gravity Dirを0に近づける)、動きを抑えてなんとなく安定させました。

まとめ

MagicaVoxelで作成したvoxファイルをUnityのVoxel Importerでボーンを入れて、UniVRMでVRMファイルに出力してclusterのアバターを作成しました。

  • Magica Voxelでモデルを作成してvoxファイル化
  • Voxel ImporterでvoxファイルをUnityにインポート
  • Voxel Importerでボーンの作成とウェイト設定
  • Voxel ImporterでモデルをエクスポートしてUnityオブジェクト化
  • UniVRMでVRMファイル出力

難関はウェイト設定ですが、Voxel ImporterのVoxelモードとVertexモードを活用すると、くっついているボクセルを切り離すことができるのでモデル作成の制約が減ります。ウェイト設定時に Shift + Fキーでキャラクターに注目することと、Spaceキーで元の絵が見えることを知ると作業効率が格段に上がりました。

ボクセルならモデルが作りやすいのでモデリングが苦手な人でも自分用のオリジナルアバターが作れるのではないかと思います。

参考URL