【VRChat】TDPTを用いてデスクトップモードで両手を動かそう
ThreeDPoseTracker(以下TDPT)でモーションキャプチャしたデータをVRChatに送信し、デスクトップモードでアバターの両手を動かすギミックを作ったのでざっくり解説します。
注意事項
Unity、VRChatともに初心者です。「よくわからんが、まぁ動いているからヨシ!」の状態なので誤っている点もあると思います。ご承知おきください。
文章を書くのが下手なので記事全体が読みづらいと思います。お許しください。
当記事の内容を利用したことにより生じるいかなる問題について、筆者は一切責任を負いません。
使用ソフト
Processing https://processing.org/
仕組み
このギミック全体の概要はこんな感じです。
① TDPTの上半身モードでトラッキング。体の位置情報がVMTプロトコルでProcessingに送信されます。
② Processingで受信したデータをアバターのギミックで使いやすいように加工し、VRChatにOSCで送信します。使われるパラメーターは両腕のX軸位置、Y軸位置、肘の曲げ具合の合計6つです。
③ アバターがOSCを受信し、腕を動かします。
②の手順はTDPTから直接VRChatにデータを送信することで省略できますが、私の場合はUnityの操作に慣れていないのでこのようにしました。
アバター側のギミック(VRChat)
それでは具体的にアバター側でどんな処理がされているのか見ていきましょう。
① 右腕を前上下左右の方向にそれぞれ伸ばしたアニメーション5個と、さらにそれらの肘を曲げた状態の合計10個のアニメーションを用意して、Processingから受信したOSCをもとに多重BlendTreeでいい感じに合成します。
② AvatarMaskで①のアニメーションの右腕部分のみを抽出してLocomotionLayerの右腕部分を上書きします。
こうすることで、デスクトップモードでも腕を動かしているように見えます。左手も同じように設定します。
OSC送信側(Processing)
次にOSCの送信について詳細です。
上記の通り、ProcessingからVRChatに送信するデータは、
①右腕の向きX軸(-1なら左、1なら右)
②右腕の向きY軸(-1なら下、1なら上)
③右肘の曲がり具合(0なら伸ばす、1なら曲げる)
これらに加え、左腕バージョンの合計6つです。
①~③のそれぞれの数値はTDPTから送信されたVMTプロトコルの信号を変換しています。TDPTはポート38900にOSC通信で信号を送っているので、ProcessingのoscP5ライブラリで受信できます。
例えば右腕に関する情報はVMTプロトコルでは、
アドレス "/VMC/Ext/Bone/Pos" に次のような信号で送信されています。
(実際には小数点以下がもっと長いですが省略しています)
('RightUpperArm', 0.08, -0.01, 0.0, -0.11, 0.04, 0.5, -0.8)
この中で右腕の向きを取得するのに必要なのは最後の3つの値です。
後ろから3番目の値(例だと0.04、以降ArmXと表記)は腕のX軸向き、2番目の値(例だと0.5、以降ArmY)は腕のY軸向きを表しています。
最後の値(例だと-0.8)の意味は理解してないんですが、この値が負のときArmXとArmYの値の正負が逆になります。なので、最後の値が負のときのみArmXとArmYの両方に-1を掛けて正しい(?)値に戻しています。
すると、腕を右にしたときにはArmXが0.6、左にすると0.0といった風になります。この0.6という数値は使用する人物や環境によって多少増減すると思うので、自分で調整が必要です。
このままVRChatに送っても良いのですが、値の上限、下限が中途半端で分かりにくいので私の場合は右は1、左は-1になるように数値を変換しています。Processingにはmap()関数があるので、これを使うと便利です。
同様に腕を上に向けるとArmYが0.6、下にすると0.0となるので数値をいい感じに変換します。
肘の曲げ具合に関しても同様にVMTプロトコルから値を受け取って変換します。
これで両腕のX軸向き、Y軸向き、肘の曲げ具合の値が用意できたので、oscP5ライブラリを使ってポート9000に送信します。
(参考: https://yoppa.org/geidai_media1_17/8312.html)
以上がOSC送信側の流れです。
おわりに
このギミックはあくまで腕を動かしているように見せているだけですので、VRモードのように実際にアバターのボーンを動かしている訳ではないことをご理解ください。
また、このギミックを作成するにあたってVRC合法チート研究会様のhttps://booth.pm/ja/items/3932850 こちらのシステムを大いに参考にさせていただきました。この場を借りてお礼申し上げます。
この記事が気に入ったらサポートをしてみませんか?