はじめに
今回はVRChatで一部のモデルが違う明るさになるときの対処法を紹介します。
これが起こるのは主に「顔」と「体」です。

VRChatにアバターをアップロードできるぐらいUnityが使えることを前提に進めます。
↓Unityの基本操作などはこちらをご覧ください。
結論:アンカーオーバーライドをChestで統一
結論だけ言うとShift+クリックで全てのモデルを選択。

Skinned Mesh RendererでAncoer Overrideを「Chest」に統一すると治ります。


これだけ言われても困る方へ、これから説明していきます。
LightProbe実験用シーンを作る(任意)
ライトプローブという概念があります。
これは計算負荷を下げるために空間に記録された光源情報です。
↓このような「球」として表示されます。

この先、記事を読むだけでも良いですが…
実験用にLightProbeが確認できる状態にして手元で動かした方が分かりやすいです。

LightProbe実験用シーンはこちらで配布しました。
これをDL。

このテスト用のシーンすら自作したい方は「こちら」をご覧ください。
ワールド作りで必要になるライトベイクの基礎が学べます。
プロジェクトに.unitypackageをドラッグ&ドロップ

インポートを選択。

Sig_LightTesterフォルダを開き中にシーン情報があることを確認。
(Sig_LightTesterという名のシーン情報)

VRChatアバターがある状態にしたら…
シーンを “ヒエラルキーにドラッグ&ドロップ” します。


追加したシーンをダブルクリックで開かないでください。注意。
するとヒエラルキーに2つのシーンが表示されます。
ここのCubeを押すとライトプローブの状況が確認できます。


ヒエラルキーに2つのシーンがある場合…
この2つが “混ざった” 状態で処理されます。
表示されない方はギズモ横の「▼」を選択。
Light Probe Groupを有効化。

元のシーンにあるDirectional Lightが明かるすぎるので非表示にします。

これでLightProbeの実験用シーン導入が完了です。
アバターでライトプローブの挙動を確認
デカすぎるCubeを非表示。
アバターを選択して移動。
すると光源の影響で色が変わることが分かります。

ただしアバターは選択してもライトプローブの球が出ません。

アバター内にある個別メッシュを選択。
するとライトプローブの球が出てきます。


つまり処理的にはパーツ分けされたモデル全てで…
違う「ライトプローブの球」情報を持ってることになります。
このライトプローブの球がすべてのモデルでそろっていれば何も問題が起こりません。

↓揃ってる場合はこのような挙動になります。

ライトプローブ球がズレてると起こる問題
アバターによってはライトプローブの球がズレてることがあります。
ズレてると表示上の問題が起こります。
↓こちらは過去に自分が手動で調整したのでズレたモデルの例。

↓オプジェクト切り替えで参照するライトプローブの球が変わるのが分かります。

ライトプローブ球とアバターとの距離がそれなりにあれば…
表示の問題が起こりません。

アバターの大きさを4倍。
1アバター内でライトプローブ球が切り替わるような制御点が近い位置にあると問題が起こります。

こちらでは、顔と体で色が違う問題が発生しました。

頭のライトプローブ球が参照してる部分は青いライト付近です。

一方の体は赤いライトのライトプローブ球を多く参照してます。

当たり前ですが、この参照先の球が違うと色が変わります。
↓この2つの立方体のような位置ズレのよる色変更が起こってると考えてください。

以上がライトプローブ球がズレてると起こる問題の解説です。
ライトプローブ球を揃える方法
ライトプローブ球を揃えるには「これが何で決まってるか?」を知る必要があります。

ライトプローブ球は「Skinned Mesh Renderer」の設定で決まってます。

ライトプローブ球の参照先設定は下記の通り。
①アンカーオーバーライドでオプジェクト指定
(指定すると最優先で決まる)
②Boundsの中点
(アンカーオーバーライド指定がない場合)

先ほどのモデルはアンカーオーバーライドを指定してませんでした。
なのでBoundsの中点が採用。
そしてこのBoundsの大きさにズレがあったのでライトプローブ球の参照位置が変わりました。

ではどうすればいいか?
答えは簡単で全ての物体の「アンカーオーバーライド」を物体の中央に指定するだけです。

アンカーオーバーライドを統一する
アバターの中央位置は多くの場合で「Chestボーン」が採用されます。
Armatureを開きChestボーンを表示。

アバターの中にあるメッシュデータをShift+クリックで全て複数選択。

インスペクターに移動。
アンカーオーバーライドでアバターの「Chestボーン」を設定。

これでライトプローブ球の参照先が1つになりました。

↓メッシュ選択を動かすとこのようになります。


Bounds範囲は変わってますが…
ライトプローブ球の位置は変わらなくなりました。
これでアバターの一部モデルで色が違う問題がなくなりました。

一番最初に見たNemoちゃんも…
ちゃんとアンカーオーバーライドが設定されてます。

以上がVRChatアバターで一部のモデルが違う明るさになるの対処法です。
おまけ:VRChat向けモデルを作る方へ
Skinned Mesh Rendererは「Bounds範囲」と「アンカーオーバーライド」の2つが超重要と説明しました。

このうち、Boundsは拡張機能なしで製作者側が設定できます。

が… アンカーオーバーライドを「Chest」にする設定はユーザーにお任せする必要があります。

Skinneed Mesh Rendererのアンカーオーバーライド指定は “アバター名” まで記録されます。

こちらが持ってるアバターのChestを指定しても…
ユーザーが持ってるモデルのChestまでは指定できません。

そして元のモデルを消すとエラーになります。
なので、Skinned Mesh Rendererでの指定は使えません。

そこで重要になるのは「ユーザーへの教育活動」だと思います。


教育活動として、Booth販売ページにこのブログURLで引っ張っても大丈夫です。
一応MA Mesh Settingsを使えば、アバター名なしのパス指定ができます。
「Armature」部分から始まってることに注目。

“アバター名” は空白。

なので、モデルを入れたアバターの名前を自動で読み込んでパス指定してくれます。

これを使えば作者側が適切なアンカーオーバーライドを指定できます。
→ 理解あるユーザーが自力で「アンカーオーバーライド」を設定しなくて良くなります。

ただし…○○専用モデルにしか使わない方が良いというデメリットがあります。

アバター次第では、ボーン名や構造が違うことがあります。
このような場合に正しく動かない可能性があります。


極端な例ですが…
「Armature」の名前が「Armatu Nyan」になってたらこの時点で動きません。
またMesh Settingsの多重設定リスクなども考えると…
「○○専用」みたいな「元のアバターの状態を保証できる」モノにしか使えないです。

↓MA Mesh Settingsの詳細はこちらでまとめました。
でも結論アバター改変されることまで考えていくと…
結局最強の答えは「ユーザーへの教育活動」になる悲しいオチ。

なので、VRChat向けモデルを作る方は可能であれば…
アンカーオーバーライドの設定をユーザーにやってもらう説明文を作りましょう。
ユーザーの手間を減らすなら「MA Mesh Settings」を最上位に入れて下記のように設定。
・アンカーオーバーライドの設定モード → 設定
・アンカーオーバーライド → Chest設定
・Bounds設定 → 設定しない(3Dモデル制作者を信じる)

以上がVRChat向けモデルを作る方への追記です。
まとめ
今回はVRChatアバターで一部で色や明るさが変わる時の対処法を紹介しました。
・Unityで作った空間、ワールドにはライトプローブという光源情報が記録されてる
・ライトプローブの参照先がズレるとアバターの一部で色や明るさが変わる
・参照先は「アンカーオーバーライド」の設定で決まる
・アンカーオーバーライド設定がなければ「Bouds」の中点で決まる
・参照先ズレの原因はアンカーオーバーライドなしで「Bounds」の形が不一致なこと
・対処法はすべてのモデルでアンカーオーバーライドを「Chest」などに設定
また他にもVRChat向けUnityや3DCGについて解説してます。
ぜひ、こちらもご覧ください。
コメント