えむにわリソース

ITのスキマ的なあれこれを書きます。

VRMアバター作成のためのワークフロー 初級編 「俺はアークトラスで行く!」

前の記事からだいぶ空いてしまいました。
今回はVRMアバターの作り方(一からとは言っていない)を説明していきます。

VRMとは

VRM - dwango on GitHub

VRMとはオープンソースで公開された3Dアバターのためのファイルフォーマットです。
ドワンゴを中心に開発が行われ、VRMに対応したソフトウェア(バーチャルキャストやcluster.など)で、自分のアバターでコミュニケーションすることができます。

virtualcast.jp
cluster.mu

VRMの特徴として、ファイルフォーマットに形状だけでなく、権利表記配布条件も組み込まれている点があります。
これにモデルが管理できるプラットフォームがあれば、自分のアイデンティティを横断的に持つことが出来て良いのですが、
ニコニ立体さんAPI公開してくれないですかねぇ…

アバターを手にするまで

VR空間に着ていくアバターをすべての人が自作出来ればいいのですが、モデリングは人類の基本スキルではないようです。
そんな時我々オールドタイプは人様のモデルを拝借するわけですが、心して、以下の点は絶対に気を付けましょう。

権利的にクリアであること
(Unityにぶっこんでも許される、アバターで使ってもOKである、n次創作ではないなど)
雑誌が回収になったりバーチャルライフを叩き折られたりするので、冗談では済まされない事ですね。

今回チュートリアルで用いるのは、あいんつさん(@einz_twei)のアークトラスちゃんです。

www.melonbooks.com

アークトラスちゃんは以下の点でVRMチュートリアルを行うのに適しています。

  • 揺れモノを仕込まなくても不都合が無い
  • ポリゴン数が控えめ
  • Humanoidをセットアップしやすい(Unityで読み込むことが出来るfbx同梱)
  • カスタマイズしやすい

マテリアルやテクスチャ数がだいぶ絞ってあり、MMDerよりもゲの付く業界の人が作った感じでUnityで使いやすいです。
ユニティちゃんシェーダ2の作例としても優れていて、参考になります。

そんな厳しい条件をクリアできる子が 1080円 (おやつ約3回分)です。買わない手はありません

VRMセットアップ

バーチャルキャストや自作のアプリで動かしたい場合は、特に何も考えずVRMのドキュメントに従えばセットアップ可能です。 以下、モデルに依存した細かい部分について説明します。

VRM用のマテリアルを作る

前述したとおり、アークトラスちゃんのマテリアルはユニティちゃんシェーダ2でセットアップされています。 自作のアプリなどで、対応するシェーダを先に読み込ませておけば、何も考えずにVRM化して無事読み込めるのですが、
そうでない場合、VRMの基本的なシェーダでマテリアルをセットアップしなおさなければいけません。

今回は、マテリアルをMToonに置き換えます。

元のマテリアルはhrad, main, armor の3種類なので、変換後のマテリアルも同様の名前で3種類用意しましょう。

  1. UniVRMを空のプロジェクトにインポートします。
    Releases · dwango/UniVRM · GitHub

  2. Asset内の適当なフォルダにfbxをインポートしましょう。

f:id:m2wasabi:20180626045927p:plain

prefabを2体並べて比較しながら調整するとよいでしょう。 f:id:m2wasabi:20180626045938p:plain

VRM用のマテリアルを作成して
f:id:m2wasabi:20180626050059p:plain

片方のprefabに適用します。

f:id:m2wasabi:20180626050114p:plain

リムライトがなかったりMatCapの当たり方が異なったり、ベースカラー適用のロジックが異なったりするので、 全く同じに再現するのは難しいので、大体違和感がない程度に調整します。

大体こんなもんでしょうか。

f:id:m2wasabi:20180626050237p:plain

セットアップ例を示します。
カラーはスポイト機能を使って直接設定すると便利です。
f:id:m2wasabi:20180626050250p:plain:w200f:id:m2wasabi:20180626050257p:plain:w200f:id:m2wasabi:20180626050302p:plain:w200

VRMへのコンバート

VRMのマテリアルを適用したモデルをVRMに変換します。

VRM置き場(フォルダ)を用意して f:id:m2wasabi:20180626050328p:plain

インポート & セッティング!!
f:id:m2wasabi:20180626050413p:plain f:id:m2wasabi:20180626111143p:plain

そして変換。

途中NormalMapの変換で怒られるので「Fix now」で変換してしまいます。
深さ成分がスポイルされてしまいのっぺりしてしまいます。悲しいですが致し方ありません…

f:id:m2wasabi:20180626050522p:plain

変換の結果ノーマルマップの座標がおかしくなるので、Normal Map の数値を 0 にしておきます。

f:id:m2wasabi:20180626065840p:plain:w200

メタ情報を入力する

変換したVRMのprefabをHieralchyに展開しましょう。

f:id:m2wasabi:20180626111308p:plain

VRM Metaというスクリプトに、名前、作者情報、アバターの使用許諾条件などを記述しましょう。
Reference の項目でサムネイル画像を設定できるのですが、楽するために下のプレビューから画像を切り取って貼ってしまいました。

f:id:m2wasabi:20180626111317p:plain

ファーストパーソンの時の描画設定

モデルによってはアバターVRで入ったときに視界が顔の裏側で邪魔される場合があります。
そんなときに顔の描画を消す処理を定義します。
アークトラスちゃんの場合、腕輪がコントローラーの邪魔になるので、ファーストパーソンの時は腕輪も消えるように設定します。

f:id:m2wasabi:20180626051808p:plain

表情をつける

VRM BlendShape Ploxyコンポーネントから Blend Shape Avatar をダブルクリックして
BlendShapeEditorを開いて表情を定義していきます。

f:id:m2wasabi:20180626051851p:plain

f:id:m2wasabi:20180626051909p:plain

目の動きをBlendShapeで行う

アークトラスちゃんは瞳の動きをBlendShapeで定義しているので、
VRM Look At Bone AppluerVRM Look At Blend Shape Appluer に差し替えます。

VRM Look At Blend Shape Appluer を読み込んで
f:id:m2wasabi:20180626052014p:plain

VRM Look At Bone Appluer を削除します
f:id:m2wasabi:20180626052030p:plain

2回目のVRMコンバート(仕上げ)

セットアップが完了したので、VRMのprefabをApplyし、再度VRMエクスポートを実行します。

f:id:m2wasabi:20180626111424p:plain

ビュアーで見てみよう

VRMのサンプルプロジェクトに、VRMキャラクターのビュワーがあるので
インポートして実行してみましょう。

UniVRM-RuntimeLoaderSample-0.38.unitypackage をプロジェクトに展開し、
シーン VRMViewer を読み込んで実行します。

f:id:m2wasabi:20180626052257p:plain

動いた!

f:id:m2wasabi:20180626113003p:plain

バーチャルキャストで連携する

これでニコニ立体にアップすれば、バーチャルキャストに連携することもできます。
再配布が禁じられているモデルの場合、アップロードして下書きのまま運用すれば、
ニコニ立体の一覧に表示されないので、活用しましょう。

f:id:m2wasabi:20180626105939p:plain:w300f:id:m2wasabi:20180626105947p:plain:w300

バーチャルキャストの設定方法は、以下を参照ください。

www.infiniteloop.co.jp

cluster.対応 VRMセットアップ

アークトラスちゃんの真価は、制限に強いところだと言えます。
ポリゴン数控えめで、物理無くても困らないので、
cluster. などの制限フルなプラットフォームへの対応コストが劇的に低く、
ロー or ミドルポリゴン向けの環境にも、特にメッシュを落とさずに入っていけます。

要件を確認する

cluster. で動かすためのVRMアバターは結構制限が厳しいです。

要素 上限
ファイルサイズ 25MB
GameObjectの数 256
ポリゴン数 32000
メッシュの数 16
サブメッシュを含めたメッシュ数の合計 32
ブレンドシェイプの数 64
ボーンの数 128

参照元アバターの制限 - cluster. SDK ドキュメント

cluster. SDKでインポートしてみる

cluster. で使うアバターをセットアップするのに、 cluster. SDK があれば便利です。
中身はVRMアバターチェック、アップロード機能が追加されたものです。
セットアップは以下のリンクを参照してください。(SDKダウンロードのリンクもそこにあります)

最初のチュートリアル - cluster. SDK ドキュメント

cluster. SDK の推奨バージョンは Unity 2017.4 です。
他のバージョンでも動きそうではありますが念のため合わせておくと確実です。

新規プロジェクトにcluster. SDKを読み込み、
モデルを変換しようとすると、
問題がある場合は、写真のように問題がある箇所を指摘されます。
なお問題ない場合はそのまま変換されます。
やってみよう!

f:id:m2wasabi:20180625133756p:plain:w300

今回はメッシュの数が1つ多いようです。
つまりやるべき作業は、 メッシュの統合を行って数を減らす ということです。

blenderでメッシュを統合する

blederでfbxを読み込ませます。
設定はこんな感じで。

f:id:m2wasabi:20180626083752p:plain:w250f:id:m2wasabi:20180626083808p:plain:w250

軸設定が大事で、以下のように設定します。
Main が -Z Forward , Y Up
Armatures が Primary Y Axis, Secondary X Axis

cluster.の基準に入るには
メッシュを一つ統合すれば済みます。
あとで得物とかギミックを仕込めるように、もう少し統合しておきましょう。
背骨のアーマーとブーツをそれぞれまとめます。

統合事故を避けるために編集したいメッシュ以外非表示にしましょう。

f:id:m2wasabi:20180626022917p:plain

Shift キーを押しながら統合したいメッシュを選択して、左の Join ボタンで統合します。

f:id:m2wasabi:20180626030701p:plain

ブーツも同様に統合します。

f:id:m2wasabi:20180626030803p:plain

名前をシンプルに変えます。

f:id:m2wasabi:20180626030825p:plain

仕上げにfbxに書きだします。

f:id:m2wasabi:20180626030925p:plain:w300

fbx書き出しの設定はこのようにします。
軸設定は、インポート時と同じにしましょう。
あと注意する点としては、 Path Mode : COPY にする Add Leaf Bones は OFF とかです。

f:id:m2wasabi:20180626084242p:plain:w200f:id:m2wasabi:20180626031001p:plain:w200f:id:m2wasabi:20180626084329p:plain:w200f:id:m2wasabi:20180626031010p:plain:w200

Humanoidのセットアップ

Unityにインポート

blenderから書き出したfbxをUnityに読み込ませます。
変更前のファイル一式もプロジェクトにインポートしておきます。

Rig

3DモデルデータをUnityにインポートするとき、ボーンやテクスチャの設定が必須なのですが、
アークトラスちゃんはボーン名がローマ字読みで入っていて辞書で解決されないので、ボーンの設定が面倒です。
そこで先に変更前のモデルのアバター定義を HumanTemplate ファイルとして保存して、読み込ませます。

変更前のfbxを開いて、 Rig の設定から Avatar Definition → ✓ Configure... をクリックします。

f:id:m2wasabi:20180626084823p:plain:w250

アバターのボーン設定メニューになるので、下の Mapping から Save で保存します。

f:id:m2wasabi:20180626085410p:plain:w250

次に変更後のfbxに保存した HumanTemplate ファイルを読み込ませて Rig の設定は完了です。

Main

Main は変更前のfbxの真似でOKです。
f:id:m2wasabi:20180626090115p:plain

Materials

Materials は、既にVRM用のマテリアルを定義済みだと思うので、それを適用します。
f:id:m2wasabi:20180626090328p:plain

Prefabの作成

Hierarchyに変更したモデルを設置すると、変更前とツリー構造が異なっていることに気が付きます。
f:id:m2wasabi:20180626090833p:plain

散らかって分かりにくいので元のツリー構造と同じに設定します。
f:id:m2wasabi:20180626091100p:plain

*_ALLGとかいう謎の追加オブジェクトは削除してしまいましょう。

モデルをプロジェクトディレクトリにドロップして Prefab 化します。

VRMの作成(2回目)

Hierarchy上のPrefabをVRMに変換します。
以降は前述のVRMセットアップと同じ内容なので省略します。
そんなわけでメタ情報や表情の設定を同様にやりなおして完成です。

cluster. にアップロードする

cluster. SDK のメニューからアバターをアップしてみましょう。
f:id:m2wasabi:20180626110322p:plain:w300

MANZOKU
f:id:m2wasabi:20180626121040p:plain