WSLgをArchWSL環境で使えるようにする

wslではsystemdが工夫しないと動かないとかで、今回のwslgも工夫しないと動かないのかと思いきや、割と適当でなんとかなる。やることはこれだけ:

  1. Windows 11にしろ
  2. wsl2系へ更新しろ
  3. xorg-xeyesとか入れてテストして

が、微妙な点もあるのでメモ。

iPadの音声をWindows 10で聴く

最近メモ書きをしていないので更新がサボり気味だけど、本当はしたほうがいいんだよな....

前置き

スマホゲームの類は前までPixel 3aでやっていたけど、ウマ娘を始めるあたりで流石にスペック的にしんどくなってきたので、今年4月に購入したiPad Air(4th Gen.)に任せるようになった。

当時の写真
https://miwkey.miwpayou0808.info/notes/8kx9ttjtb7
https://twitter.com/miwpayou0808/status/1385635128743927808

Pixelのときからそうだったけど、地味に気になるのが音声で、普段はWindows PCのヘッドホンを使っているのでそちら側で音声を聴きたい(身体は一つしかない)。

方法としては

  1. Windows PCをiPadのワイヤレススピーカーとして認識させる
  2. VB-Audio VBANでWi-Fi経由で転送する

があって、なんとなく1を選んだ。

WindowsでBluetoothを用意する

ハード面

ここでいうWindows PCがラップトップを指すなら、おそらくBluetoothはbuilt-inだろうけど、デスクトップ、こと自作PCではWi-Fi付きマザーボードを選んでない限りは内蔵されていないことが多いと思う。

そういうわけで拡張カードもしくはドングルを用意する。

で、買ったのがIntel AX210。IntelのWi-FiカードにはBluetoothが付いているものがあり、将来的にWi-Fi 6Eネットワークを組むことを想定して、Wi-Fiカードを更新するついでにBluetoothも増設しようというお気持ち。

TD-AX210H WiFi 6E PCI-E Intel AX210 3000Mbps Bluetooth 5.2WifiアダプターワイヤレスPCI Express Wi-fiカード802.11ax / ac 2.4Ghz / 5Ghz / 6Ghz MU-MIMO OFDMA for Windows 10 Linux

Primeデーセールのときに買い物金額10000円を埋めるために買った。当時(2021/6/22)はAX200の方がメーカの選択肢が広かったけど、AX210はこの中華カードしかぱっと出てこなかった。Yanwenで発送されて、届くまで1週間?掛かった気がする。

で、こいつのUSBコネクタ(普通のUSB-A端子ではなく、マザーボードのUSBソケットに刺さるコネクタ)とPCIカードを刺せばOKだけど、うちの環境ではGPUと同じx16/x8に刺すと起動できなくなって口座残高みたいに虚無画面を見つめるはめになったので、カードのサイズ通りx1に落ち着けておいた。

ソフト面

AX210のドライバは、Bluetoothに関しては自動取得されるけど、Wi-Fiに関しては取得されなかったので、両方をIntelのサイトから取り直した。

WindowsではBluetooth A2DP Sinkによるオーディオサポートが出たり入ったりして暴れてるけど、Windows 10 2004から今の記事を書いているときまで搭載されているので、3rd partyのドライバを用意する必要はない。

Enable and Use A2DP Sink for Bluetooth in Windows 10

が、なぜかA2DPオーディオの設定をするGUIは存在しないらしく、そこだけを3rd partyに頼って用意する必要がある。上記の記事でも紹介されているが、その手のMicrosoft Storeアプリがいくつかある。

  1. Get Bluzic - Microsoft Store
  2. Get Bluetooth Audio Receiver - Microsoft Store
  3. ysc3839/AudioPlaybackConnector: Bluetooth audio playback (A2DP Sink) connector for Windows 10 2004+

で、オープンソースで(ソースコードを読めば)挙動がわかる3を選ぶことにした。リリースバイナリを実行するだけでタスクトレイに出現し、ペアリングしたBluetooth機器をつなげるものになる。

接続ができるとiPad側でもBluetoothオーディオが認識される。

少し気になるのは、音量があまり大きくないことで、iPad側の音量は最大にしてしまってもよいかもしれない。

これで終わり。

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で雑に合成できる。

手順