Avatar3.0のBase Layerで遊ぶ(コライダージャンプ)

最初は普通に色変えしてUTSのマニュアル読みながらうなってたんだけどやっぱ動くと嬉しいおもちゃがほしくなってしまってた。

VRChat(というかUnity?)ではコライダージャンプなるものがあって、空中のコライダーに一旦着地することによって連続ジャンプする飛行めそっどがある。実際一部のパブリックアバターやワールド環境で飛ぶことができる。

で、これを自アバターでもやってみたいなあと思って、Googleしたら何か一発で記事見つかったのでこれを突っ込んだりいろいろして遊んだ。

コライダージャンプ搭載

参考記事 : そうだ、空を飛ぼう。VRChatで空を飛ぶもっとも簡単な方法|ブルージー|note

ほんとにこれの通り。

基本的にはコライダーをアバターにアタッチして前の記事みたいにオブジェクト出し入れを実装するだけなんだけど、現行VRCSDKはBoolパラメータが使用可能なのと、今回は衣装のように必ず何か着てないと困る状況ではないのでIntでスイッチせずにBoolでスイッチする。

ステートマシン

Write Defaultsオンなのでアイテムオフの挙動は素のアバターの状態を使ってくれる分アニメーションクリップは一つ少なくなる(手抜きですいません...)けど、ここでは参考記事通り図のようなステートマシンにする。

モーションを付ける

飛行(跳躍か?)機能自体は上記でokなんだけど、参考記事にもあるとおり飛行中にムーンウォークするのは見た目的に微妙かもしれない。

そこでVRC想定移動モーション(無料配布) - 半沢のモーション部 - BOOTHを使って飛行中のモーションを切り替えられるようにする。

サンプルからvrc_AvatarV3LocomotionLayerをコピって図のようにStandingかつIsColliderJumpActiveがtrueだったらFlyingって名前のBlendTree状態に遷移するようにする。

遷移

いろいろ遷移条件を公式のAnimator Parametersをみて試したけど、コライダージャンプ中はコライダーに乗っ掛かってる分Groundedは使えなくて、結局上図のようになった。

そして、この状態で使用するBlendTreeは自作する必要があって少しめんどくさい(適用具合を確認して適宜修正しないといけないので。今回はやらなかったけど...)。

vrc_StandingLocomotionをサンプルからコピペしてきて(かなり値が違うので普通に空っぽから作った方がいいかも)、先にDLしたモーションを次のように割り当てる(ゼロポジションが抜けてるので、これは要修正かも)。

BlendTree割当

ここまでできたらビルド(とアップロード)して確認できる。

TODO できたら動画をここに追記する

おまけ:デスクトップ時の立ちモーションを変える

デスクトップで直立してると腕が真下にぶら下がってて衣装や素体によっては貫通して見た目が微妙になってしまう。これもStandingのBlendTreeを一部変更することで改善できる。

モーションはVRChat向けIDLEアニメーション - Imaginary Caravan by Coquelicotz - BOOTHが身長的にも近かったのでこれを使ってみた。

具体的には(もう一回)コピーしてきたvrc_StandingLocomotionproxy_stand_stillを任意のもので置き換える。

置き換え

実際に立ってみるとこんな感じ。

図

ちなみに今回使ったものとは別に持ってるオリジナル3Dモデル 『Izul -イズール-』 - bikiTadpole - BOOTHは立ちモーションも入っていて直立にならなかったので、アバター作者さんがどれだけ実装してたかによると思います(当たり前体操)。

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を使って自分で撮ったものが下の写真。

撮影サンプル

雑な仕事でBeat Saberを配信っぽくする

YouTubeでよくみるアレをやりたかったけど、Custom Avatarを用意するのはめんどくさいと噂にきいていて、中々手を付けていなかった。

※多分めんどくさい? : Custom Avatars Guide | BSMG WikiのようにAvatarをUnityからExportして、ModelSabarに上げるか、直接ModelSabarから購入が必要そう。

が、しかし、VRChat等で廃人プレイをしていてVRMを所持しているなら、VirtualMotionCapture(以下VMC)とOBSで雑に合成できる。

手順

Logicool F710が認識されないとき

Windows 10 20H2以降よく起こっているのでサポート的にも早く買い替えたほうがよさそう(Xbox Series Xコンか?)。

1. XBox 360 Controller for windowsでごまかす

Logicool F710が認識されない | さざなみさんのメモ帳!の通り

  1. Xbox 360 Controller for WindowsをWindows 7 (64ビットのみ)日本語でMicrosoftからDLしてきてインストール
    1.1. 2回目以降に再度やるときはここをスキップ
  2. デバイスマネージャでほかのデバイス>Wireless Gamepad F710で>ドライバーの更新>コンピュータを参照してドライバー ソフトウェアを検索>コンピュータ上の利用可能なドライバーの一覧から選択します>Xbox 360 周辺機器>Xbox 360 Controller For Windowsを選択

2. レジストリを使ってごまかす

先述の1.は必要(多分)。

参考 : Teg Revy 日記「Windows 10 May 2020 Update後にF710が認識しない解決法」 | FINAL FANTASY XIV, The Lodestone

  1. F710ConnectUtilityをDL・インストール
  2. F710のドングルを外す
    2.1. 確かここで外さなくてもF710ConnectUtilityが外すように言ってくる気がする
  3. F710ConnectUtilityを使う
    3.1. これで無理なら4へ
  4. レジストリを編集
    4.1. \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\046DC21F030に移動
    4.2. osvc (REG BINARY型)を01 90にする
    4.3. SkipContainerIdQuery (REG BINARY型)を01 00にする
  5. もう一度F710ConnectUtilityを使う

おわりに

私はこれでFH4のデイリーを逃しました(1敗)