見出し画像

('20/11更新)【初心者向け解説】VRoid アバター(+汎用モデル)をclusterで使えるようにする方法

*2020/11にVRoid Studioでの軽量化方法について大幅に加筆し、最新情報にアップデートしました*


3Dアバターの使い道の一つがVR-SNSです。
その代表ともいえるVRChatの他、配信向け機能に優れたVirtualCast、そしてなんとスマホへの対応をした、現在一番間口が広いと思われるclusterがあります。

clusterではVRライブVtuberとの交流イベントも開かれており、最近ではVR-SNS的な性格も強まっています。そうなると、やはり「私はここだよ!」というアピールのためにも、初期アバターでない3Dモデルが欲しくなってきますよね。

同人通販サイトのBoothや即売会であるバーチャルマーケット(Vケット)などでモデルの購入は容易になりつつありますが、自分だけのオリジナルアバターが欲しいとなると選択肢は限られます。
その一つが、pixivが提供しているVRoid Studioです。パラメータの調整だけでゲームのキャラメイクのように外見を思い通りにでき、またBoothなどでテクスチャファイルを購入することで簡単に衣装替えができます

七変化

ただ一方で大きな問題点が。それはclusterでのアバター制限
clusterはスマホ対応等のためにモデルの軽量化にやや厳しい制限を設けており、アバターの制限のないVRChatVirtualCastとの大きな違いとなっています。そしてVRoidモデルはデフォルトだとこの制限に対応していません

というわけで今回は、VRoidを始めとする3Dモデルをclusterにアップロードできるよう軽量化する方法を解説します。多少の知識さえあれば、十分できるレベルの作業かと思うのでぜひトライしてみて下さい。
Quest向けVRChatへの対応など、一般的な軽量化などにも応用可能です。


なお今回の解説は、3D初心者(PC作業は多少できるが、BlenderとUnityは触ったことがない)を想定しています。そのため冗長な部分も多いので、適宜読み飛ばして下さい。


【共通】cluster向け軽量化のポイントと作業の流れ

まずcluster向けの軽量化でポイントになるアバターの制限公式のドキュメントから引用して説明します。

オブジェクト数:256個以下
ポリゴン数:32000以下
メッシュ数:16個以下
サブメッシュ数(primitive):32以下

ボーン数(joint):128以下

マテリアル数(material):8個以下
テクスチャ(image):16枚以下

テクスチャサイズ:2048*2048以下

ちなみに私が作ったVRoidモデルをそのままclusterにアップロードして引っかかった制限は以下の通り。

画像1

またVRoid Studioでは【撮影・エクスポート】⇒【エクスポート】からも現在のモデルの状態が確認できます。

画像14

これらの数字を制限に収めれば、アップロードができるようになります。
具体的には、以下のような作業の流れになります。

【VRoidモデルの場合】
①VRoidモデルを読み込む(購入モデルの場合は.vroidファイルが必要)
②VRoid Studio内で軽量化設定をしてエクスポート
【VRoidモデル以外の場合】
① 必要なソフトの準備
② VRM Importer PluginでモデルをBlenderに読み込み
③ CAT'S Blender Pluginで自動軽量化+マテリアルを8個まで統合
④ Blenderからfbx形式でエクスポート
⑤ UniVRMを使いUnityにモデルを読み込む
⑥ テクスチャとRigの設定を調整
⑦ UniVRMからVRMへエクスポートしclusterへアップロード
 (またはClusterSDKを使いclusterへアップロード)

では、実際の作業に移っていきましょう。
VRoidモデルの場合は次章から、それ以外の場合はそこを読み飛ばして進めて下さい。


【VRoidモデルの場合】VRoid Studioでの軽量化設定

VRoid Studioはver0.9より軽量化機能がサポートされました。なので、VRoid内の作業で軽量化は完結します。
(未インストールの方は下記からVRoid Studioの最新版をインストールしてください)

自作の方は問題ないのですが、販売or頒布されているVRoidモデルを軽量化する方は、.vrmファイルではなく、大本となる.vroidファイルが必要になります。
もし同梱されていない場合は、何らかの方法で手に入れるか、VRoidモデル以外の場合の手順に沿って軽量化できます。


① VRoidモデルの読み込み (自作の方は読み飛ばしてOK)
 VRoid Studioはメニューからファイルを読み込むのではなく、特定のフォルダに置かれたファイルを読み込む仕組みなので、大本の.vroidファイル【ドキュメント】フォルダ内にある【vroid】⇒【avatar】フォルダの中に置いてください。
これで読み込みが可能になります。

画像15


② 軽量化設定その1:髪のボーンを減らす
 次に【髪型編集】⇒【揺れもの】の画面を開きます。ここで髪のボーンを減らすため、ボーングループ数を10以下に設定して、【ボーングループを自動生成】を押します(分かる方は手動でも可)。

画像16

するとボーン (joint)数が丁度いいぐらいに軽量化されます。
なお、私のようにメガネやヘアピンなど装飾品を付けている方は、ここから手動調整がさらに必要なのでご注意。


③ 軽量化設定その2&出力
 次に【撮影・エクスポート】⇒【エクスポート】メニューに入ります。
ここで【エクスポート情報】を確認して、clusterの制限に対してモデルがどれぐらい重いかを確認します。

○復習:clusterの制限
 ・ポリゴン数:32000以下
 ・マテリアル数:8個以下
 ・ボーン数:128以下

通常なら、制限に収まっていないのはマテリアル数だけかと思います。
なので【マテリアルの削減】⇒【マテリアル数: 8】【テクスチャアトラス解像度: 2048】に変更します。
変換が完了したら、エクスポートで出力してあげればOK!

画像17

なおマテリアル数だけでは制限に収まらない方は、【ポリゴンの削減】【ボーンの削減】からモデルの見た目がおかしくならない程度に調整を行って下さい。
VRoidモデルの軽量化は以上で終了です!

最後にclusterのHPからvrmファイルをアップロードしてみて、成功すれば完了!お疲れさまでした。

画像18

※軽量化したモデルは【名前を付けて保存】から別名で保存しておくことをおすすめします。



【VRoidモデル以外の場合】①必要ソフトの準備

軽量化するモデルを準備したら、まずは下記の必要なソフトをダウンロードしてインストールします。
これ以降の解説は下記のソフトウェアのインストールがすべて終わっていることを前提として進めます。

【②~④ Blenderでの軽量化作業】

メインとなるBlenderは2020/11現在最新の2.9を使っておけばOK。
VRM ImporterCATs Blender PluginはBlenderインストール後にアドオンとしてソフト内からインストールします。こちらもバージョンに対応したものを選ぶよう注意して下さい。

Blender … モデル編集・軽量化作業を行うメインのソフト
VRM Importer Plugin … Blender内で動作。VRoidのVRMファイルを読み込めるようになる
CATs Blender Plugin … Blender内で動作。軽量化を半自動化してくれる神プラグイン

⇒ソフトウェアのインストール方法解説
【Blender初心者向け】Cats Blender PluginをつかってVRoidモデルを軽量化する - Qiita

(作業がしやすいように上記解説に沿って日本語化設定も)


【⑤~⑦ Unityでのモデル調整とアップロード】
UnityはUniVRMとcluster creator kitが対応しているバージョン2019.4 LTSが無難でしょう。UniVRMはUnityのアセットなので、対応バージョン('20/11現在はver0.62)を確認してUnityでプロジェクト作成後にインストールします。

Unity … Blenderで編集したモデルを再調整するソフト
UniVRM … Unityのアセット。VRMを扱えるようになる

⇒ソフトウェアのインストール方法解説
UniVRMマニュアル - UniVRMのインストール


②Blenderにモデルを読み込む

Blenderを立ち上げます。右欄のメニューの「CATS」⇒「Model:Import」を押すとモデルのインポート画面が立ち上がるので、モデルを選択して読み込みます。

画像3

もしCATSタブが表示されない、VRMが読み込めないなどの場合は↑で説明したBlenderのプラグイン(アドオン)のインストールが出来ていない可能性があります。インストールが完了した後も、チェックボックスをオンにして有効化しないといけないことに注意して下さい。
(参考:【Blender初心者向け】Cats Blender PluginをつかってVRoidモデルを軽量化する - Qiita


③CAT's Blender Pluginでの軽量化

さて、では本丸の軽量化作業に移ります。
初心者には荷が重いBoneの整理やメッシュの統合は、「Model:Fix Model」ボタンを押せばCAT'sプラグインが自動でやってくれます。
(ちなみにスパナマークから細かい設定もいじれます)

画像4

次におそらく一番手間のかかるマテリアルとテクスチャの統合作業です。
まず「最適化:Generate Material List」を押します。マテリアルの一覧が表示されます。これを8個以下まで減らすのが目標です。

○復習:clusterの制限
 ・ポリゴン数:32000以下
 ・マテリアル数:8個以下
 ・ボーン数:128以下
 ・サブメッシュ数:32以下

画像5

画像6

この最適化ツールがどういうものかというと、複数のマテリアル(モデルの各部位の素材:色、影、反射などの情報や、テクスチャ(画像)の貼り付け方などの情報を含んでいる:詳しくは後述で補足)を一つにまとめることでモデルを軽量化するというものです。

使い方は簡単で、統合したいマテリアルをチェック⇒Save Atlas to...をクリック⇒Atlas(マテリアルのテクスチャ)の保存先を選択⇒マテリアルとテクスチャが1つに統合される という流れになります。
つまりポイントはどのマテリアルを一つにまとめるかになります。例えばVRoidモデルだと、通常はおおよそ下記のようなまとめ方で良いと思います(どれが何のマテリアルかはファイル名で判別可能)。

・HAIR(髪関係)
・FACE(顔関係)+小物類
・EYE(目周り)
・BODY(統合しない)
・服関係(統合しない)

これで概ねマテリアルは8個以下まで統合できると思います。

画像8

注意点として、

VRoidモデルは髪や眉などの色をマテリアルの設定で調整している。色の設定が違うパーツは統合してはいけない
・Atlasファイルは2048*2048以下にする。このサイズを超えないように組み合わせを調整する
・統合したマテリアルはシェーダの設定が個別にできない(見栄えの調整がしづらくなる)ので設定を分けたい場合はマテリアルも分ける

この辺りを守れば、あとは制限のマテリアル数8以下になれば何でもOKです。ちなみにこの段階で、Blender上では髪や眉の色が真っ白になってしまいますが気にしなくてOKです(Unityで後ほど調整します)。


ちなみに、Atlasファイルが不必要に大きくなってしまう(スカスカなのに4096*2048とかになったりする)場合は下記の方法があります。

① まとめるのを諦めて2つのマテリアルにする(自信がない人でマテリアル数に余裕があるならこれを推奨)
② 画像を別ソフトで編集して2048*2048以下にしてからUVマップを再編集する
(画像をトリミング後、上メニューのUV Editing⇒編集⇒置き換えから画像を再読み込み。右欄マテリアルプロパティから該当マテリアルを選択⇒選択でUVマップを表示し、これを置き換え後の画像に合わせて編集(拡大縮小)することで調整)

②の方法はやや難易度高めですが、UVマッピングの仕方さえ理解すれば比較的簡単な部類の作業なので、「Blender UVマッピング」と検索してリファレンスを参照して下さい。


補足:マテリアルとテクスチャについて

※読み飛ばして大丈夫です。理解を深めるための脇の知識なので。

マテリアルの統合をする上で、理解しておいた方が楽なのがこのマテリアルとテクスチャの関係性です。詳しく説明しだすときりがないので、要点をかいつまんで書くと、

・モデルの大まかなデータ構造は オブジェクト - メッシュ - マテリアル - テクスチャ - UVマップ となっている(下記ツイも参照)
各オブジェクト(パーツ)にはそのマテリアル(素材)が割り当てられている(例えば腕のオブジェクト⇒Bodyのマテリアル、髪のオブジェクト⇒髪のマテリアルなど)

・同じマテリアルを複数のオブジェクトに割り当てできる(例えば足のオブジェクトに、腕と同じBodyのマテリアルを割り当てることが可能)
・マテリアルは1つのテクスチャファイル(オブジェクトの表面に表示する画像データ:例えば服の画像など)を持っている(つまり同じマテリアルを割り当てられたオブジェクトは、同じテクスチャを参照する
・各マテリアルのテクスチャに対して、そのオブジェクトの形状にどう貼り付けるかという情報(UVマップ)が設定されている

つまり、上記のマテリアルの統合処理というのは、

・マテリアルを統合するために、
・マテリアルに含まれるテクスチャ(画像)を統合し、
・それぞれのマテリアルに設定されているUVマップ(テクスチャの割当て)も統合する

という処理で成り立っているわけです。


④軽量化したモデルのエクスポート

お疲れさまでした。ここまでくればもう終わったようなものです。
CAT⇒エクスポートでfbx形式でモデルをエクスポートします。

画像9


⑤-⑥モデルをUnityに読み込む&設定の調整

Unityを起動し、新規プロジェクトを作成します。この辺はUniVRMのインポートも絡むので、①ソフトの準備も参照。
プロジェクトを作成④でエクスポートしたモデル(fbxファイル)を、Assetタブにドラッグ&ドロップしてUnityに読み込みます。インポートが完了したら、読み込んだモデルをHierarchyD&DしてUnityに配置します。

続いてモデルを選択⇒右欄Inspectorから「Rig⇒Animation Type」をHumanoidに変更。続けて「Materials⇒Location」をUse External Materialsに変更します。

画像10

画像11

次にマテリアルの設定をします。先程Blenderで統合したマテリアルそれぞれに、テクスチャを再割当てします。また髪や眉などのテクスチャカラーで色を付けているマテリアルについては色の設定をここでします。

① Asset⇒Materialsフォルダを開く
② 設定するマテリアルを選択
③ 右上Inspector欄からShader⇒VRM⇒MToonを選択 (出ない場合はUniVRMをアセットに追加して下さい)
④ Rendering TypeをCutoutに変更(透過が適用されるようになります)
⑤ 設定しているマテリアルに対応したテクスチャファイルをインポート(MaterialsフォルダにD&D)します。Blenderで作業していたフォルダにAtlasファイルやその他のテクスチャファイルがあるハズ
⑥ インポートしたテクスチャをTexture欄の四角いボックスにD&D(Lit Color, Shader Colorとも)
⑦ 髪や眉などのマテリアルはカラーボックスをクリックして、色合いを調整

画像12

これを全マテリアルに行えば作業は完了です。うまく作業ができていれば、Unity上でモデルが元通りの色合いになっているはずです。


⑦エクスポート&clusterへのアップロード

最後に、Hierarchyで調整したモデルを選択して、上欄【VRM】⇒【UniVRM】⇒【Export humanoid】でVRMファイルに出力します。

画像18

あとはVRMファイルをclusterのHPからアップロードして、成功すれば完了です!

画像19

これにて作業完了です。大変な作業、お疲れさまでした!https://twitter.com/omoi0kane/status/1205485100915314688


最後に

今回の作業にあたっては、下記の記事を大いに参考にさせて頂きました。こうしてWeb上に情報を残してくれる方がいるおかげで私のような素人でもこういう作業ができるわけで。本当にありがとうございます
【Blender初心者向け】Cats Blender PluginをつかってVRoidモデルを軽量化する - Qiita

またVRChat for Quest向けの軽量化については、もう少しマテリアル数・テクスチャ数の制限がきついようです。かなりをまとめた上で、画像についても圧縮が必要でしょうね。

【Quest向け推奨値】
 ・容量:5~8MB(上限10MB)
 ・ポリゴン数:5000
 ・マテリアル数:1-2
 ・ボーン数:最低限(髪、服などはDynamicBone無効なので不要)
https://vrcworld.wiki.fc2.com/wiki/Oculus%20Quest%E5%AF%BE%E5%BF%9C

またVRoidを軽量化してclusterで読めるようにするスクリプトであるVReducerは、'19/12時点では対応verが古く動作しませんでしたが、'20/11時点ではVRoid Studio ver0.9.5対応となっており、おそらく現行のver0.11.3でも動作するかも…?という感じです。ただVRoid Studioで軽量化が間に合うならそちらの方がベターかも。

なお以前のVRoidの対応バージョンが0.54で止まっていた時は、下記のようなエラーが出て変換はできませんでした。

  File "xxx\vreducer.py", line 66, in <module>
   main(sys.argv[1:])
 File "xxx\vreducer.py", line 42, in main
   vrm.gltf = reduce_vroid(vrm.gltf, opt.replace_shade_color, parse_texture_size(opt.texture_size), opt.emissive_color)
 File "xxx\vrm\reducer.py", line 633, in reduce_vroid
   }, '_Tops_', texture_size)
 File "xxx\vrm\reducer.py", line 451, in combine_material
   texture = vrm_material['textureProperties']['_MainTex']
TypeError: 'NoneType' object has no attribute '__getitem__'

VRoid Studioはまだ開発がハイペースで続いており、時折この手のツールでの後方互換性がなくなることはまだまだありそうですね。
(この記事記載のやり方であればバージョンに関係なく変換作業が可能です)

以上、蛇足でした。

---------------------------------------------------------
【Twitterでのシェアはこちら】

---------------------------------------------------------
この他にもVR・VTuberに関する考察記事やエッセイなどを投稿しています。
もしよければぜひnote、Twitterをフォローいただければ嬉しいです。

また次の記事でお会いしましょう!
---------------------------------------------------------
今回も長文にお付き合いいただきありがとうございました。
引用RT、リプライ等でのコメントも喜んでお待ちしています。

画像19

Twitterhttps://twitter.com/omoi0kane
Youtubehttps://www.youtube.com/channel/UCpPeO0NenRLndISjkRgRXvA
Medium: https://omoi0kane.medium.com/
Instagramhttps://www.instagram.com/omoi0kane/
Facebookhttps://www.facebook.com/omoi0kane/
マシュマロ(お便り): https://marshmallow-qa.com/omoi0kane

○引用RTでのコメント:コメント付のRTとしてご自由にどうぞ(基本的にはお返事しません)
○リプライでのコメント:遅くなるかもしれませんがなるべくお返事します

この記事が気に入ったらサポートをしてみませんか?