Avatar3.0の着せ替えギミックとかを入れる

Avatar3.0(以下AV3)対応アバターの着せ替え+VirtualLens2を購入したので、AV3の機能を使って着せ替えてみよう!というやつ。UnityのAnimatorを素直に(?)使えるのはAV3の魅力って感じがする。

AV3復習とか

以下のものがすごく参考になる。というか参考にした。

VRC公式のやついまいち分かりにくくないですか?

基本的な処理の流れとしては、

  1. Action MenuでExMenuを操作
  2. Menuに対応するParameterが変化
  3. AnimatorがParameter変化に従ってStateを変更
  4. State遷移によって(VRCが許容する)任意のアニメーションが駆動

って感じ...のはず。

なおWrite DefaultsVRC公式ではOFF推奨らしい。
すべてのアニメーションプロパティにDefaultを書き込む挙動らしいけどこれが謎でよくわからない(公式もなんかおかしいみたいな旨が書いてるっぽい)。またこの影響で、Write DefaultsがONのものとOFFのものが混ざるとギミック全体がぶっ壊れる。ONでもOFFでもいいけど統一した方が無難っぽい。

着せ替え

基本的な(AV3の機能を使わない)着せ替え方法はVRChat 衣装変更方法 | テトラログで、Radial Inventory System V2を使う方法では【VRChat】Avatar3.0 アクションメニューからワンタッチで衣装などの着せ替えを楽しむ方法! | こはろぐでできる。

この手の外部で用途を管理して実際には1つか少しのParameterを使うAV3ギミックシステムを使ったほうが、Expression Parametersの使用数を節約できるので制限に収まりやすくなってお得...
なんだけど、何故かデフォルトの状態が全裸のアニメーションになってしまったので勉強も兼ねて今回は手動ですることに。

今回の環境

作業

BlueSummerの導入手順を参考にしてかつ、Skinned Mesh RendererがあるオブジェクトをまとめてRadial Inventory Sysytemに入れてやってみると腕だけが追従しなかった。原因はボーンオブジェクトを全部対応させそこねてたこと。

失敗

原因

ちゃんと全部対応させるとしっかり動いた。

成功

もう片方の着せ替えに関しては、マテリアル(とアクセサリー)のみだったので、マテリアル入れ替えするアニメーションクリップを参考通り作成して手動で入れたらできた。

そもそもUnity上でのアバターの扱いどうなってんの

単にFBX上のオブジェクト構造をUnityのGameObjectにインスタンス化して、そのPrefabを生成しているっぽい。知りたいのは標準的なHumanoidの作り方だったかもしれない。

ただ、HumanoidはUnityが解釈できるボーン構造になってないと自動でRigが合わないので、手動で合わせるかモデルを変更する必要がある。

Skinned Mesh Renderはボーンオブジェクトの姿勢を参考にメッシュを変形させてレンダリングするっぽく、服のようなボーンに追従する必要があるオブジェクトは何かしらのボーンをRoot Boneとして設定しないといけない。

また、Anchor Overrideはリフレクションプローブやライトプローブで補完される位置って書いてるけど、スクリーンスペース・リフレクション(SSR) - Qiitaの衝突判定みたいなものなのかな。VRだとスクリーンスペース系のものは使えなさそうだけど...
参考画像

たぶん[Unity] Box Projectionで屋内シーンの反射による映り込みの品質を向上する - Qiitaの方がそれっぽそう。

リフレクションプローブ - Unity マニュアル : よくわかんねー

VirtualLens2の導入

セットアップガイド | VirtualLens2通り入れる。手ブレ補正(stabilizer)は最初指定していたけど下記画像みたいにカメラ本体の位置がぶっ飛んでしまったので一旦なしにした。

カメラ本体がぶっ飛んだやつ

カメラのワールド固定(drop)とかはconstraintを使って実現しているっぽく、このconstraintのoffsetがおかしかったみたいで、CameraMeshに入ってるParent ConstraintをActivateし直してLockを外したら解決してしまった。

ConstraintはTransform.LookAtみたいなC#スクリプトでできることをコンポーネントポチポチで実現できるので、アニメーションでカスタム遷移を書くことが多いVRChatと相性がいいのかも。実際みんな使ってるらしい 使ってないの私だけ。

試しにDropを使って自分で撮ったものが下の写真。

撮影サンプル