C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

3D-Avatar: VRM を作って → detune して → cluster へアップロード成功するメモ; 2020-04-10版

経緯などはさておき、件について少し複雑ですので整理するメモです。時間がないけど結論だけ気になる人は最後のまとめだけどうぞ。

目次

  • (1) VRoid Studioセシル変身アプリVRM を作って
  • (2) cluster へアップロード -> 「アップロードに失敗しました。」
  • (3) Blender に add-on 群を導入
  • (E) 何かエラーが起きてしまった場合の対処療法メモ
    • (E-1) Blender + CATSFix Model しようとしたら "No mesh inside the armature found!" エラー
    • (E-2) Unity でいい感じの VRM 系シェーダーを設定しても髪の毛の内側が消えちゃう
    • (E-3) Unity で Rig を Humanoid にして Apply しようとしたら 'Error(s) found while importing rig in this animation file. Open "Import Messages" fold out below for more details' エラー
    • (E-4) cluster で "アップロードに失敗しました。ファイルサイズを25MB以下にして下さい。」エラー
    • (E-その後) cluster へ セシル変身アプリ で作成した un-h002; Atropos をアップロード -> 成功✨
  • まとめ: VRoid Studioセシル変身アプリ で作成した VRM を cluster へアップロードして使う方法

(1) VRoid Studioセシル変身アプリVRM を作って

今日までに著者が実際に VRM 作成に使用してみたツールと成果:

  1. VRoid Studio -> un-h001; Lachesis
  2. セシル変身アプリ ->un-h002; Atropos

どちらも近年のゲームにしばしば搭載されている高機能なプレイヤーキャラクターエディターのような使用感で VRM を作れるすぐれものです。標準搭載されているパーツの選択だけでも"ことはじめ"には十二分な見栄えのするキャラクターを造形できてしまいます。手間暇次第でテクスチャー、小物、衣装、素体を他の専用ツールで編集、作成もできます。使い方は使えばわかる、みたいないいツールです。

つまり、ここの部分の説明はメモないです😜 だいじょうぶです。使えばわかります…たぶん。

(2) cluster へアップロード -> 「アップロードに失敗しました。」

さて、↑のツールで作成した VRM を cluster へアップロードしてさっそく楽しもう!とするとつらい現実に叩きのめされます:

un-h001; Lachesisの場合:

f:id:USAGI-WRP:20200409061624p:plain

un-h002; Atroposの場合:

f:id:USAGI-WRP:20200409061718p:plain

つらい😭 (要件的にも、できたーからのオチ的なお気持ち的にも)

手作業でデータをごりごりいじって対処するのはわりと手間暇かかりそうな予感がするので、1ヶ月ほど cluster はほぼ棚上げ状態になっていました。今回は棚卸ししたのでメモを残しました💪

(3) VRM の detune (≃軽量化)

cluster の厳しい要件を満たすため、 VRoid Studioセシル変身アプリ で思いのままに作ったアバター VRM たちを cluster 用に detune する必要があります。素体のモデリングから完全にフルスクラッチで自作する場合も cluster の要件の範囲内で人型のかわいいモデルを作るのはなかなか難しいと思うので、それなりモデルを作ろうとするとフルスクラッチでも同様の工程を経る事になるかもしれません。

基本の手順:

VRoid Studio で出力した VRM はたぶんこの基本ばーじょんでほぼうまく cluster 対応できます✨ セシル変身アプリ で出力した VRM はいまのところ少し小細工が必要だったので、末尾の小細工必要ばーじょんに対処療法のメモを残します。

(3-1) モデルデータごとに作業用ディレクトリーを別けられるようにディレクトリーを1階層堀り、作業対象の VRM ファイルだけを入れておく

f:id:USAGI-WRP:20200409211810p:plain

はじめは VRM ファイル1個を放り込むだけですが、この後いろいろとファイルが増えます。複数のVRMを同じディレクトリーに置いて作業するとたいへんです。ケチって他のモデルデータと作業ディレクトリーやプロジェクトを共有するのは事故の元なので別けて管理できるディレクトリー構造を用意して作業をはじめます。

(3-2) Blender を導入

手操作または choco install blender など。

(3-3) Blender に add-on 群を導入

  1. VRM_IMPORTER_for_Blender2.8 ; 執筆時点では Testing 扱い
  2. Cats Blender Plugin ; Community 扱い
  3. material-combiner-addon ; Community 扱い

(3-4) BlenderVRM を読んで detune して FBX を出す

(3-4-1) File -> New -> General ( または起動初期状態 )

f:id:USAGI-WRP:20200409212545p:plain

(3-4-2) Cats Blender PluginVRM を Import

f:id:USAGI-WRP:20200409213054p:plain

↑引っ張り出したら↓縦タブから CATS を選び、 Import Model します。

f:id:USAGI-WRP:20200409213144p:plain

↓ファイルオープンダイアログが出たら、モデルデータのある場所へ初回は頑張って辿り着いて下さい。辿り着いたら、ファイルを選ぶ前に、Favorites に現在のディレクトリーを + で覚えさせて置くと、これからファイルオープンダイアログが出るたびに疲弊せずに使えるようになります💪 不要になったら - で消せばよいのでよく使う場所は気軽に Favorites へ入れるといいです。

f:id:USAGI-WRP:20200409213304p:plain

↑から .vrm ファイルを選択して開くとしばらく Blenderプチフリーズ状態になりますが生暖かい目で待ちます。たぶん今どきの3DCGやろうとする人が使っているPCなら10秒か20秒くらい待っていれば読み込みが終わります💪

f:id:USAGI-WRP:20200409213958p:plain

↑こんな感じ。画面中央はカメラが遠いだけなので、近づけてみたい時は操作方法いろいろありますが、マウスでハンドルを操作する方法がいちばん直感的に見ればワカル方法です。

f:id:USAGI-WRP:20200409214646p:plain

XYZがRGBの棒とぽんぽんでつながっているハンドルを Drag&Drop すると原点中心で視点をオービタルに回転。同様に、+印のルーペっぽい🔎ハンドルは同様に拡縮、てのひら印✋のハンドルは同様に視線系での平行移動です。基本の視点操作のほか透視投影と正射影の切り替えも↑の縦に並んだツールの最下にあります。お好みの使い勝手の良い、作業しやすそうな視界に調整します↓

f:id:USAGI-WRP:20200409215207p:plain

↑はマテリアル(材質の色や質感など)が乗っていないので3DCG入門者はやや警戒してしまうかと思います。シェーディング技術の一般的な表現分離の段階として表示設定上マテリアルが乗っていないだけなので作業中はお好みで↓を切り替えてマテリアルを乗せた絵にもできます。

f:id:USAGI-WRP:20200409220344p:plain

↑から Rendered の玉を選ぶと空間のライティングを考慮した仕上げの色味を確認できます。 VRM の detune 作業のようにマテリアルの発色を確認できれば十分な場合は Material Preview の玉を選択するのがよいかもしれません。↓のようになります

f:id:USAGI-WRP:20200409221412p:plain

(3-4-3) Cats Blender PluginFix Model して Mesh, Bone, Material を軽量化

CATS でのお手軽全自動 detune 作業を続ける前に Import したモデルの Object 群 (≃3DCG一般としての扱い上はほぼ Mesh 群の事ですが、 Blender の中では Blender 独自の階層構造と用語として橙の▽の 'Object' という単位で扱わる部分です) の名前の末尾が .baked または .baked0 になっている事を確認します↓

f:id:USAGI-WRP:20200409222030p:plain

VRoid Studio で作成した un-h001; LachesisVRM は↑の様にすべての Object の名前は .baked になっているのでこのまま進めました。 セシル変身アプリ で作成した un-h002; Atropos はそうなっていなかったのでこのままでは進めません。なぜ進めないのか、応急措置できるかは対処療法メモへどうぞ。( VRoid Studio でも素体選択その他の状況次第で対応が必要な事もあるかもしれません。)

.baked/.baked0 の確認ができたら CATS での detune 作業を進めます。次は Fix Model で Mesh, Bone, Material を最適化します。ざくっとお手軽全自動ですが、具体的に Fix Model が何をするのか、あるいは一部最適化を on/off したい場合はスパナー🔧印のところからにゃんにゃんできます↓

f:id:USAGI-WRP:20200409222830p:plain

Fix Model を押すとマウスカーソルが怪しくバグった感になりつつ例によって Blenderプチフリーズしている感じになりますが仕事してくれています💪 そっと見守りましょう。今回も10秒か20秒くらいで終わると思います。終わると↓

f:id:USAGI-WRP:20200409223113p:plain

↑すっきりざっくり detune されています。もし、Fix Model でエラーが出た場合はスケルタルアニメーション関連の設定値がどこかしらよくないかもしれません。その時は諦めて対処療法メモへ。

(3-4-4) material-combiner-addon でマテリアルを Atlas 化して軽量化

次に3DCGモデルデータとしてのテクスチャーの次元(個別割り当てされる画像の枚数の意図)と空間(1枚の画像の中でUV座標を詰め込んでデータの疎部分を少なくしたりの意図)を圧縮します。主に商業用ゲーム向けのレンダリングリソースの制限が厳しい3DCG業界で頻繁に使われるテクスチャーの工夫技術の1つで Atlas と呼ばれています。

CATS -> Optimization -> Atlas を開きます↓ または、 CATS 縦タブではなく MatCombiner 縦タブで操作しても同様です。(CATSMatCombinerの機能を取り込んでUIを出しているだけなので)

f:id:USAGI-WRP:20200409224256p:plain

↑ "If this saved you time:" とパトロンの案内が出ている通り、これを手でやるのも面倒だにゃー億劫だにゃーと思い1ヶ月くらい調査時間も取れないまま放置してました。アバターで何か楽しむ実用に繋がった際にはお気持ちパトロンまたは Commit しようかな、と思います。

もし、画面が↑のように Generate Material List, Save Atlas to.. が出ていない場合は、代わりに機能を使うために不足の add-on が案内されていると思います。その場合は導入すると Blender の再起動を促される事になるので、特に慣れないうちは作業途中の状態を File メニューから事前に名前をつけて保存しておくと安心かもしれません。

Generate Material List を押すと個別に作られているマテリアルが列挙されます。マテリアルの発色は主に diffuse color (=拡散反射光の色) で決まります。マテリアルが最終的に発色する色は最も単純には単色のベタ塗り、次いでテクスチャーマッピングによる画像のベタ貼り(≃現代では一般的にUVマッピング)、あるいはその組み合わせ(=シェーダーで乗算合成したり加算合成したり)が基本になります。

後の Unity 工程で登場する VRM 規格向けの推奨シェーダー群でもマテリアルの対応としては単色でベタ塗り、テクスチャーでベタ塗り、テクスチャーに単色ベタを乗算合成、そんなような表現が基本になっています。工程を進めて色が抜けてしまったり、あるいは期待していない色が塗られてしまっている事に気づいたら、この工程へ戻り(古典的な対処方法ですが念の為 .blend を別名で保存しておくと楽です) マテリアルごとの歯車⚙で Multiply image with diffuse color (≃乗算合成結果の焼き込み設定)を調整するだけで解決するかもしれません↓

f:id:USAGI-WRP:20200409230827p:plain

最終的にはこの工程で Atlas にしたテクスチャーを2D画像編集アプリで直接ごりごりと塗り替えてしまうという方法もあります。細かい事を考えるよりその方が"はやい"こともあります😅 わりと柔軟にどうとでもできるのでわからんかったらとりあえず進みましょう。

Save Atlas to.. を押下するとマテリアル最適化によって結合された1枚のテクスチャー画像ファイル(≃Atlas)の保存先ディレクトリーを聞かれます。この工程を進めるとインポートしているモデルデータそのもののマテリアル構造がある意味でぐちゃっと、ある意味ではすっきりと変更されます。最適化前の状態へ戻りたくなる予感がする場合は進める前に Blender の作業状態を .blend へ保存しておくと安心です。問題なければ進めましょう↓

f:id:USAGI-WRP:20200409232157p:plain

↑ぽちると一瞬マテリアルが全て剥がれた後、数秒待っていると Atlas 化されたマテリアル&テクスチャーが読み込まれて色が戻ります…が…ここで現行オリジナル版の 色が…↓

f:id:USAGI-WRP:20200409232332p:plain

↑と、こんな感じで diffuse color が抜けます。塗りが複雑なテクスチャー部分は Atlas に合成成功しているので、この程度の微調整なら先に触れたように出力された Atlas テクスチャー画像ファイルを画像編集アプリで編集し、透明部分を選択 -> 選択反転 -> レイヤー追加 -> diffuse color でベタ塗り -> レイヤーを乗算合成 -> 統合して手修正版 Atlas 画像を出力、とかすれば大丈夫です。

あるいは、 add-on の導入の項で書いたように、暫定的に VRM の diffuse の全自動合成に対応する機能を追加した実験版の add-on を導入しておけば↓のように texture に diffuse color も合成した Atlas を出せるかもしれません↓

f:id:USAGI-WRP:20200410071326p:plain

実験版を作るまでに原因、BlenderAPI、CATS で Import したデータの内部構造…などの調査に数時間かかっています。脳筋対応なら3分でできるし、実験版も結果的な diff は実はたったの2行なのだけど。ahaha... 😅

ともかく、無事に Atlas 化もできてマテリアルも detune というか軽量化できたら、.fbx に Export します。 CATSExport Model をぽち↓

f:id:USAGI-WRP:20200410082912p:plain

(3-5) Unity で FBX を読んで detune 版の VRM を出す

(3-5-1) Unity Hub を導入

https://unity3d.com/get-unity/download または https://chocolatey.org/packages/unity-hub あたりで入れます。

(3-5-2) Unity (特定リリースのエンジン本体) を導入

  • Unity Hub を起動し、 Installs 縦タブの ADD から Unity を導入
    • もし、 cluster SDK を使いたい用途がありそうな場合は cluster SDK の現行版で指定されている特定リリースの Unity を導入します
    • Note: FBX から VRM を出力するだけの場合は動けばなんでもいいです(たぶん)

(3-5-3) Unity の作業用プロジェクトを作成

Unity Hub の縦タブを Projects へ切り替えて NEW -> VRM 作業用ディレクトリーまたはお好みのどこかに Unity プロジェクトを作成

(3-5-4) UniVRM で軽量化版の VRM を書き出し

作成した作業用 Unity プロジェクトを起動し:

  1. プロジェクトへ UniVRM パッケージを導入
    • 適当に Explorer からファイルを Drag & Drop してファイルリストを確認して Import ぽち
  2. プロジェクトの Assets へ Atlas 化して保存しておいた .png と Expoert した .fbx を Import
    • 適当に Explorer からファイル群を Drag & Drop で大丈夫
    • Note: Assets へ取り込む=ファイルを複製です。もし取り込んだファイルを外部から編集したくなった場合は取り込み元ではなく、Unityのプロジェクトを配置したディレクトリーの中の Assets ディレクトリーの中に取り込まれた複製を編集します。
  3. Create -> Material -> 名前はなんでもよいので適当につける
    • 画面下側の Project タブの直下にあります
  4. インポートしたモデルデータの Animation Type を Humanoid へ変更して Apply
    • モデルを選択すると画面右側の Inspector の Rig タブの上部に Animation Type が出ます
    • Note: ここで Apply を押した時に Error(s) found ... などエラーが出たら画面下側の Console タブを確認して対処し始める必要があります。残念ながら小細工必要ばーじょん対処療法へどうぞ。
  5. インポートしたモデルデータを原点へ配置
    • Drag & Drop -> Inspector で座標を 0,0,0 にします
  6. 配置したモデルデータに先に作成した Material を設定
    • Drag & Drop で Assets のマテリアルを画面中央上部のプレビューに配置されたキャラクターへ
  7. Material の Shader を VRM 系のどれかもっともそれっぽくなるものへ設定
    • Material を選択 -> Inspector の Shader をぽち
    • UnlitCutout または、 MToon で Rendering Type を Cutout にして Cull Mode を Off にすると期待に近い再現になるかもしれません
  8. 画面左側のシーンのツリー表示から VRM 出力したいキャラクターのオブジェクトを選択した状態で、メニュー: VRM -> UniVRM-xx.x -> Export Humanoid
    • 諸元を書いて Export -> 出力先ファイルを設定して完了!

↓ファイルを取り込んだ程度の状態。やや怖い。

f:id:USAGI-WRP:20200410091246p:plain

↑の状態にマテリアルを適用(Drag&Drop)した状態↓

f:id:USAGI-WRP:20200410091347p:plain

よい具合👍

f:id:USAGI-WRP:20200410091533p:plain

Export Humanoidぽち

f:id:USAGI-WRP:20200410092124p:plain

↑書き出す VRM の諸元を書いて Export

(6) cluster へアップロード -> 成功✨

Atlasの最適化が甘いか余計な構造が入り込んでしまっているのかファイルサイズは太りましたが…↓

f:id:USAGI-WRP:20200410092521p:plain

f:id:USAGI-WRP:20200410092726p:plain

↑ここまでは失敗する場合でも進みます…

↓こうなったら全ての構成が完了し成功です!!

f:id:USAGI-WRP:20200410092826p:plain

💪🎉💪🎉💪🎉💪🎉

(3-おまけ)

アバターのアップロードに成功した状態で cluster を起動すると↓

f:id:USAGI-WRP:20200410093215p:plain

アバターを選択して cluster のワールドへ入ってみます↓

f:id:USAGI-WRP:20200410093341p:plain

↓detuned ばーじょんと言ってもさほど劣化した感じもなく、綺麗です👍

f:id:USAGI-WRP:20200410093533p:plain

アバターを使えると気分的な没入感がとても高まって嬉しい&楽しいですね🎉

(E) 何かエラーが起きてしまった場合の対処療法メモ

セシル変身アプリ で作成した un-h002; Atropos で↑の基本ばーじょんをやろうとすると幾つかの問題が発生しました。本項ではそのトラブルシューティングを例に、何かエラーが起きてしまった場合の対処療法としてメモを残します。

(E-1) Blender + CATSFix Model しようとしたら "No mesh inside the armature found!" エラー

f:id:USAGI-WRP:20200409070350p:plain

↑これが出て Fix Model できない VRM データがあります。"armature" はスケルタルアニメーションのボーン群の事です。 VRM にボーンはきちんと入っていても出ます。VRM の規格的には問題無くても、 CATS の実装がまだ甘い部分があり弾かれてしまうのが原因でした。原因はどうでもいいので対処療法をすぐに確認したい場合は少し読み飛ばして下さい:

↓ここから原因について↓

Cats Blender Plugin のソースを確認すると:

直前に VRM フォーマットの確認機構が実装されていて、その確認が false に終わるとこのエラーへ繋がります。確認機構では:

mode=2 で呼び、すべての mesh を走査して、名前の末尾が .baked または .baked0mesh があれば true と判定しています。この確認機構には詳細不明ながら TODO のコメントもあり、

など VRM, gltf, Unity/humanoid など関連の規格で定義されている確実な方法でも無さそうな事から、 Cats Blender Plugin の Author による暫定仕様の判定方法なのだろうと思います。

とりあえず Issue は立ててみました。

↑ここまで原因について↑

この問題が起きた場合は応急措置として、BlenderObject と認識される頂点データの入った部品すべての名前の末尾に .baked を追加します。すべてです↓

f:id:USAGI-WRP:20200409191700p:plain

↑名前の変更は、変更したい Object をぽちって F2 キー押下です。

こうすると Cats Blender Plugin の現状の暫定 VRM 判定をクリアーして Fix Model できるようになります💪

f:id:USAGI-WRP:20200409191933p:plain

(E-2) Unity でいい感じの VRM 系シェーダーを設定しても髪の毛の内側が消えちゃう

Blender では期待表示されていたのに…

f:id:USAGI-WRP:20200410105143p:plain

↓Unityでは髪の毛を内側から見ると完全に見えない場合

f:id:USAGI-WRP:20200410104712p:plain

f:id:USAGI-WRP:20200410104956p:plain

Unity のマテリアルの Shader を VRM/MToon に設定して、 Cull Mode を Off にします:

f:id:USAGI-WRP:20200410105414p:plain

↑こうすると内側からも髪の毛が見えるようになります↓

f:id:USAGI-WRP:20200410105515p:plain

より根本的に修正したい場合は一般論としては FBX またはその手前の .blend の編集段階でこの部分の面の向きを反転…=頂点データのインデックス群をいじる必要があるかもしれません。

(E-3) Unity で Rig を Humanoid にして Apply しようとしたら 'Error(s) found while importing rig in this animation file. Open "Import Messages" fold out below for more details' エラー

f:id:USAGI-WRP:20200410110041p:plain

↑つらい。これが出たら先ずエラー表示(='この下の方の"Import Message"を展開して詳細を確認してね')に従い "details" を確認します。

f:id:USAGI-WRP:20200410110923p:plain

Invalid Avatar Rig Configuration. Missing or invalid transform: Required human bone 'LeftLowerLeg' not found

今回の例では Unity さん的にはあってほしかった LeftLowerLeg が無かったようです。Leftが無い場合はたいていRightも無いので一緒にどうにかします。

先ず、 Blender で、この部分については問題のなかった un-h001; LachesisArmature の構造を展開して期待動作系のボーンの状態を確認すると:

f:id:USAGI-WRP:20200410112708p:plain

↑期待動作系: Hips -> Left leg -> Left knee -> Left ankle -> Left toe

次に、問題が発生してしまった un-h002; AtroposArmature の構造を同様に確認すると:

f:id:USAGI-WRP:20200410113145p:plain

LeftLowerLegエラー系: Hips -> Left leg -> Left ankle -> Left toe

Hip から Left toe までの間にジョイント部分が3箇所欲しいのが Unity の Humanoid の要件ですが、エラー系では1つ足りなかったようです。Armature のツリー構造をよく見ると:

f:id:USAGI-WRP:20200410113559p:plain

今回ケースでは UpLeg_L_001Left leg の先、 Left ankle と同じ階層に浮いている事に気付きました。Animationタブへ切り替えてどのボーンがどの部分なのかもっとよく確認してみます↓

f:id:USAGI-WRP:20200410114304p:plain

↑の確認の結果:

  • ふとももの辺りにある随分と小さなボーン = UpLeg_L_001
  • 膝から脛の辺りにあるボーン = Left leg
  • 踵から指の付け根にあるボーン = Left ankle
  • 爪先のボーン = Left toe

↓ここから(2020-04-11 追記)↓

昨日の時点ではこのあとボーンを手修正へ流れましたが、あらためて「もしかして」と思い CATSFix Model する「前」の状態を Import して統合処理前のボーンの構造と Pose Mode での動きを確認したところ、元VRMデータに問題はないので「 Fix のオプションを見直したら手間暇かからず重要なボーンの消失と再構築を免れるかも」と思い、試してみました💪

f:id:USAGI-WRP:20200411154604p:plain

結果、Fix Model しても脚を構成する Humanoid 用のボーンに欠陥が生じないようにできました✨ これで解決する場合はこの↓↓は不要になります。以下は一応この追記後も「やむを得ない場合は」用の対処メモと残しておきます💪💪

↑ここまで(2020-04-11 追記)↑

期待動作系との比較から、おそらく…:

  • UpLeg_L_001 ボーンが本来は Left leg 相当になるボーン
  • Left leg になっているボーンが本来は Left knee 相当になるボーン
  • Left ankle ボーンと Left toe ボーンはそのまま

となるところ、CATS の Importer か Fix Model で大雑把に作業し過ぎたために狂ってしまったか、あるいは元になった素体データのボーンの実装に Importer を誤動作させてしまう微妙な値が設定されていたのかもしれません。↑の推定に基づいたボーンの階層構造の修正を行います。修正は Left も Right も同じ様に必要そうなので、左右セットで同様に編集します:

f:id:USAGI-WRP:20200410115721p:plain

↑左右の同等パーツをCTRL+クリックでセットで選択し↓

f:id:USAGI-WRP:20200410115816p:plain

↓ボーンの親が期待しないところへ繋がっている場合は Armature -> Parent -> Clear Parent で親への接続を解除し、

f:id:USAGI-WRP:20200410120803p:plain

↓ボーンに期待する親を繋ぎたい場合は子ボーンと親ボーンになる予定のボーン2つを選択して Armature -> Parent -> Make -> Keep Offset (親子の距離を維持) or Connected (子の根本を親の先端まで移動)

f:id:USAGI-WRP:20200410121236p:plain

↓ボーンを選択して Armature -> Transform -> Move (移動) and Scale (拡縮)して綺麗に再配置します。必要に応じて回転ほか適当にそれらしく配置されるようにします。

f:id:USAGI-WRP:20200410121056p:plain

↓名前の変更はぽちって F2 キー押下でできます。

f:id:USAGI-WRP:20200410122409p:plain

今回の場合のようにボーンを大きく編集した際には、ウェイトも調整が必要になります。現状アニメーションするとどうなるかは CATS から Start Pose Mode を押下してボーンごとに回しておかしな挙動がないか確認します↓

f:id:USAGI-WRP:20200410143002p:plain

f:id:USAGI-WRP:20200410143250p:plain

↑どのように実験的にポージングさせても、Stop Pose Mode すれば T姿勢に戻ります↓

f:id:USAGI-WRP:20200410143344p:plain

ウェイトの調整がどの辺りにどういった具合に必要そうか Pose Mode でおおよそ把握できたら、緑の頂点3つが繋がった印のメッシュデータをぽちり、 Weight Paint にモードを切り替えます↓

f:id:USAGI-WRP:20200410143734p:plain

↓Vertex Group からウェイト編集したい頂点群を選択すると、

f:id:USAGI-WRP:20200410144006p:plain

↓選択した頂点群のウェイトが青=0→緑→赤=1で色分けされます。

f:id:USAGI-WRP:20200410143926p:plain

↓画面上部の Weight, Radius, Falloff ほかを塗りやすいブラシに設定し、視界も塗りやすいように回しながらぽちぽちウェイトを塗り絵します。

f:id:USAGI-WRP:20200410144334p:plain

↓パーツごと、あるいはある程度塗ったら Pose Mode で妙な事が起こらないか確認します。肉(ポリゴンはサーフェスなので皮だけど)がボーンの動きに付いてこなかったり、逆に余計なところまで付いてきたり、そうした妙な事が起こらなければボーンの修正は完了です💪

f:id:USAGI-WRP:20200410144512p:plain

この修正を施した状態から改めて CATS から Expoert Model したところ、 Unity の作業用プロジェクトでも .fbx をインポートしたモデルに Humanoid を設定できました🎉

(E-4) cluster で "アップロードに失敗しました。ファイルサイズを25MB以下にして下さい。」エラー

f:id:USAGI-WRP:20200410142215p:plain

↑無慈悲なエラー。さすがにひとり50MBのアバターを使ったら20人集まっただけで1GBショックになります。これは寧ろエラーにしてくれないとワールドがつらくなるかも。

一般的に3DCGデータのファイルサイズを縮めるための対処方法は、

  1. テクスチャーを圧縮(内部保持形式を高圧縮率のフォーマットへ変更する、解像度を半減する、色情報のビット表現をケチる…など)
  2. 頂点数を削る(頂点数を削るとインデックス数も削れるのでハイポリ→ローポリくらい削れる場合には大きく削れます)
  3. スケルタルアニメーション用の頂点ブレンディング、アニメーションのキーフレームを削る
  4. プロシージャルにして実行時(描画時)にごりごり計算して絵を作らせる; 今回はたぶん使えません

f:id:USAGI-WRP:20200410150258p:plain

f:id:USAGI-WRP:20200410150952p:plain

.fbx の段階では膨れていません。 .fbx には Atlas 化したテクスチャーが含まれていないので別途、確認:

f:id:USAGI-WRP:20200410151247p:plain

5MBしかない。48MB -> 25MB のためには最小でも 23MB 削る必要がありますし、テクスチャーを0にはできないのでもっとずっしりと VRM のファイルサイズに効いている何かを発見する必要があります。

un-h002; Atroposセシル変身アプリ で cluster 用など気にせず思いのまま作成したので、アニメーションが多めでマテリアルの Atlas 化の副作用でスケルタルアニメーションの頂点ブレンディングが最終的な VRM のファイルサイズに強く響いている…かもしれません。または、単純に髪の毛と猫しっぽにボーンが多すぎるのかもしれません。

↓当たりを付けるため、髪の毛のボーンをいったん削除してみます。悲しい😭

f:id:USAGI-WRP:20200410154147p:plain

↓ .fbx の段階でもそこそこ減りました。

f:id:USAGI-WRP:20200410154313p:plain

Unity で .vrm にします。T姿勢では違いはでません。

f:id:USAGI-WRP:20200410154554p:plain

f:id:USAGI-WRP:20200410154834p:plain

↑DT1がボーン削除前、DT2がボーン削除後です。82ボーン削除しているのでそれなりに効果があるかと思いましたが、ほぼ無意味でした☠

UniVRM には Import 機能も付いているのでボーン削除していない状態の un-h002; AtroposVRM (UniVRMで Export したもの) を Import して prefab を作って貰いました。どこにどれくらいファイルサイズ爆発の要因があるか powershellGet-DirTotalFileSize . してみました↓

f:id:USAGI-WRP:20200410155955p:plain

↑Meshes が 300MB 弱もあるようです😂 Textures + BlendShapes + その他は porefab 段階では全体の 1% にも満たない事がわかりましたが、恐らく頂点ブレンディングに起因したスケルタルアニメーションの頂点データが大爆発している、が答えかもしれません。

ここで UniVRMExport 機能には Export -> Import -> Export として prefab がある状態からのみ使用可能なオプション Reduce Blendshape Size 機能が付いている事を思い出しました。試してみます:

f:id:USAGI-WRP:20200410160748p:plain

f:id:USAGI-WRP:20200410161352p:plain

  • DT1 = 思うままに作った VRM を detune してみたつもりだったけどファイルサイズは爆発していた detune-1
  • DT2 = 試しに .blend に戻り髪の毛のボーンを82個削除してみたけどほぼ無意味だった detune-2
  • DT3 = UniVRMExport した DT1 を Import して prefab を生成して再度 ExportReduce Blendshape Size 付きで行った detune-3

解決しました。こんなに今回があるとは思っていなかったので驚きました🎉

…まだ un-h002; Atropos の cluster 登録まではもうひと頑張り、必要だったけどね😅

f:id:USAGI-WRP:20200410161917p:plain

↑このくらいだと希望が見えます。

(E-その後) cluster へ セシル変身アプリ で作成した un-h002; Atropos をアップロード -> 成功✨

目標、残り:

  • node 数: 290 -> 256 ; ⊿node = +34 💪
  • joint 数: 287 -> 128 ; ⊿joint = +159 💪💪💪

https://clustervr.gitbook.io/sdk/guide/avatar_customization/avatar_limit を確認すると、アップロード時のエラーメッセージの "joint" は "bone" の事、 "node" は "GameObject" の事のようです。"GameObject"は Unity用語の"GameObject" のようです。

今回のゴールが見えてきたため、ヤルキを醸し出して Blender でごりごり削ろうかと思いました…が、 "GameObject" の削減効果の要因を探る意味でも、ここまでの過程で作成していた DT2 ( 試しに .blend に戻り髪の毛のボーンを82個削除してみたけどほぼ無意味だった detune-2 ) を UniVRMImport -> Export with Reduce Blendshape Size してどの程度 joint と node が cluster のアップロードシステムで低下するか確認してみることにしました。

↓まだ削らないと joint の判定もダメなはず…

f:id:USAGI-WRP:20200410164413p:plain

↑と、思っていたので意表を突かれてしまいましたが、アップロードに成功してしまいました🎉🎉🎉

clusterアバターは現時点では同時に複数登録しておけない仕組みみたいですね。 VRoid Hub から使用可能なアバターを一覧表示、選ぶと全自動で↑↑↑でしてきたような detune をしたデータを cluster のアクティブなアバターとして取り込んでくれる、とか機能要望したいですね。案外、いろいろと仕組みが分かった今ではそれほど無茶な要望でもないような気がしてきました。

f:id:USAGI-WRP:20200410164903p:plain

cluster にログインして歩いてみました↓

f:id:USAGI-WRP:20200410165319p:plain

大丈夫そうです💪…と、言いたいところでしたが、

f:id:USAGI-WRP:20200410165501p:plain

頭パーツのボーンかウェイトが甘いみたいで、上下に首をふると怪しげな事になってしまいました😂 でも、ここまで来ていれば、ボーンのウェイト調整くらいどうという事は無いですね💪 これでようやく cluster も楽しめそうです🎉🎉

f:id:USAGI-WRP:20200410214546p:plain

↑あらまあ😂 こういう状態(髪のボーンを削減した際に髪の頂点ブレンディングのウェイトの再設定を忘れている!)でした。髪の毛を構成する頂点群にウェイトがまったく入っていない状態になってしまっていたんですねー。入れましょう💪

↓ここから(2020-04-11追記)↓

↑はMatCombiner で「マテリアルを Atlas 化した後」だと、髪の毛とヘア・アクセサリー、メガネ、顔、服、肩などなどが重なっている造形状態で頂点ウェイトをペイントで再設定するのはかなり"気難しい"作業になります。ポージングでやや無理やり髪の毛だけペイントしやすいようにボーンを回したり移動したりして作業するのはかなり大変です😂

入り組んだパーツ単位での編集作業を施したい元VRMを扱う場合には、 Blender で 元VRMImport して Fix Model した後、マテリアルをアトラス化する「前」の状態で編集するとその後で行うよりもとても楽です✨

"楽"のなかにも Blender では方法がたくさんあると思いますが、1つの"楽"の例として「髪の毛だけ編集しやすい選択と表示の状態」にする方法をメモに残します:

(x-1) 「選択」機能の対象を「面」に↓

f:id:USAGI-WRP:20200411163440p:plain

(x-2) 髪の毛の「面」を1つ、どれでもよいので選択しやすいところを「選択」↓

f:id:USAGI-WRP:20200411163902p:plain

(x-3) SHIFT + G (または F3 -> "Select Similar" など) で "Material" ↓

f:id:USAGI-WRP:20200411164256p:plain

↑こうすると実質的に髪のパーツだけ選択できます↓

f:id:USAGI-WRP:20200411164517p:plain

(x-4) SHIFT + H (または F3 -> Hide Selected など) ↓

f:id:USAGI-WRP:20200411164818p:plain

↑こうすると実質的に髪のパーツだけ編集しやすい状態になります💪

対象部位の編集がおわり表示状態を戻したくなったら ALT + H で隠していたメッシュ群を表示状態に戻します。

(x-応用) マテリアル的には複数部位に跨る部分を同時に選択したい場合

f:id:USAGI-WRP:20200411174146p:plain

↑複数マテリアルに分かれている部位の最低1つ以上の面について、2箇所目以降は SHIFT + CLICK で選択し、あとは同様に SHIFT + G -> "Material" -> SHIFT + H すると↓

f:id:USAGI-WRP:20200411174327p:plain

こうなります💪

ボーン節約のために髪とヘア・アクセサリーとネコミミを同じボーンでスケルタルアニメーションの頂点ブレンディングをしたい場合に便利です。

↑ここまで(2020-04-11追記)↑

まとめ: VRoid Studioセシル変身アプリ で作成した VRM を cluster へアップロードして使う方法

  1. VRoid Studioセシル変身アプリ で「元VRM」を作成 (他のアプリ、フルスクラッチでも以下は応用できます✨)
  2. BlenderBlender 用の以下の add-on を導入
    1. VRM_IMPORTER_for_Blender2.8 ; 執筆時点では Testing 扱い
    2. Cats Blender Plugin ; Community 扱い
    3. material-combiner-addon
  3. BlenderCATS を基点に「元VRM」を Import Model
  4. Blender で Import した Object の名前の末尾が .baked または .baked0 でなければ F2 ぽちぽちして全ての Object の名前の末尾に .baked を付ける
  5. BlenderCATSFix Model で軽量化
  6. Blendermaterial-combiner-addon でマテリアルを Atlas 化して軽量化 -> Atlas_12345.png 的な「(A)Atlasテクスチャー」ファイルができる
  7. BlenderExport Model して .fbx な「(B)FBX」ファイルを出力する
  8. Unity を導入
  9. Unity で作業用のプロジェクトを作成し UniVRM パッケージを導入
  10. Unity の作業用プロジェクトの Assets へ「(A)Atlasテクスチャー」と「(B)FBX」を放り込む
  11. Unity の作業用プロジェクトの Assets へ
    1. マテリアルを1つ新規作成し、
    2. Shader を VRM/MToon, VRM/UnlitCutout など VRM 系の良さげな表示になりそうなものに設定
    3. Texture に Assets へ追加しておいた Atlas テクスチャーを設定
  12. Unity の作業用プロジェクトの Asset へ追加しておいたFBXを
    1. Rig を Humanoid に設定して Apply -> ダメだったら Blender へ戻ってボーン見直し(このメモのE-3参考)
    2. ワールドへ配置、扱いがよいので原点に置くとGOOD
    3. 先に新規作成しておいたマテリアルをワールドへ配置したアバターへ適用(Drag&Drop)
  13. Unity の作業用プロジェクトで画面左側のシーンツリーで配置したアバターを選択した状態で UniVRM の機能でメニューから VRM -> UniVRM-xx.x -> Export Humanoid で「(P)軽量化版仕上げ直前VRM」を出力
    • ここで 25MB 以下ならそのままでも cluster へアップロードできる可能性が高いです。重い場合は以下スキップせずもう一息。
  14. Unity の作業用プロジェクトの UniVRM の機能でメニューから VRM -> UniVRM-xx.x -> Import で「(P)軽量化版仕上げ直前VRM」をプロジェクトへインポートし 「(Q) prefab なアバター」をプロジェクト内へ生成
  15. 「(Q) prefab なアバター」をワールドへ配置
  16. Unity の作業用プロジェクトで画面左側のシーンツリーで配置した「(Q) prefab なアバター」の方を選択した状態で UniVRM の機能でメニューから VRM -> UniVRM-xx.x -> Export HumanoidReduce Blendshape Size オプション付きで行い「(R)軽量化完成してるはず版VRM」を出力
  17. cluster へ「(R)軽量化完成してるはず版VRM」をアップロードできたら完成確定✨
    • できなかったら Blender に戻って cluster 用には削れる部分を削り、このまとめの工程12から16までを同様にリトライします💪 (このメモの E-その後 参考)

Happy avatar life.

参考

  1. [初心者向け]VRoid Studioで作った3Dモデルをclusterへアップロードする
  2. マイアバターを持つ方法まとめ|FaL / ShunYoshida|note
  3. [2.8]ベイクしたい|MITSUDA Tetsuo|note
  4. 【Blender2.8】ボーンとウェイトペイント【初心者用】 | ゲームの作り方!
  5. VRMデータの容量が大きくて困ったときの対処方法(初心者向け) | 南条@東方のブログ