【VRChat】OSC来たから心拍計とかデジタル時計をつける
追記:完成しました。前半はただの自分語りのため、実装方法が気になる人は途中まで読み飛ばしてください。
VRCのアバターにOSCが来たぞ
VRChatのアバターにOSCがきた。OSC自体はもともと2.0時代のワールドで利用できていたのでそんなに驚く話ではないんだが、まさかUDONではなくてアバター側に来るとは思っても見なかった。(2.0時代の話と大まかなOSCの解説についてはフレンドのじぇしかさんが書いた記事が参考になる。)
まぁできることはある意味無限大なので、自分にできる範囲で何やったら面白いかな~というのを考えたところ、以下のアプリを見つけた。
wearOSのセンサー情報をOSCで送信できるアプリだ。
お前ら!!!!mi bandの時代は終わりだ!!!!wearOSを買え!!!!!
(宗教上の理由でwearOSしか使えないが、いまいち国内での盛り上がりにかけるので皆さんよろしくおねがいします。)まぁ調べたら林檎時計にも似たようなアプリあったりmi bandから情報引っ張ってきてる人いたりしてるんだけども…公開されたの平日やぞ????
さっそくprotokolを用いて心拍数の送信内容を確認したところ、ちゃんとfloat値で心拍数が受信できた。
よっしゃこれでアニメータで適当にブレンドシェイプで心拍アニメの速度でも変えてやればそれっぽくなるやろ~~~
うん…?
floatで1以上はブレンドシェイプで扱えないやんけ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
とりあえず今日はここまでとして、土日でなんとかしようと思う。
方法としては、10の位でアニメーション遷移してごまかすか、VRChatとの間に一つアプリケーションをかませるか、wearOSのソフトを開発するか………もうここまでやるならAvatarParameterだけローカルでいじれるAvatar用UDONでも作ってそこで送受信させろや
飽きてなければ続き書きます。
デジタル時計はできた
とりあえずデジタル時計を仕込んだ。
ぶっちゃけ心拍数のほうがUnity側の作業は簡単なんだが、C#側の受信の実装がダルかったので後回し…
解説をしていいきます。
まず、どうやって数値を表示しているのかというと、数値表示シェーダーを利用しています。
以下の記事のコードを拝借し、独自に書き換えを行いました。
具体的には、整数部が時間、小数部が分となるようにしました。時分を一つのパラメータで扱いたかったためです。
そして、数値をアニメータを用いて変化させています。
で、肝心のアニメーションですが、こんな感じです。
Curvesがこう
まあわかる人ははわかると思うんですが、秒を時間、フレームを秒と置き換え、n秒ごとにn.0~n.59とすることで時間の数値をシェーダーに反映させています。
12時45分であれば12秒と45フレームのところでシェーダーの数値を12.45にする、といった感じです。
そして、これをアニメータのMotionTimeを用いてずらして表示させています。
ただ、MotionTime当てはめる数値は0~1のため、先程作ったアニメーションのフレームを対応させなければなりません。
なんとなく100で割れたほうがちゃんと計算されるかな~とおもい、先程の24*60=1440フレームに1秒足して1500フレームのアニメーションファイルを作成しました。
そして、時刻送信側ではどのフレームが必要か、それは1500フレーム分のなにか、というのを計算し、値を送信させています。
先程と同じ12時45分でいうと以下のような感じです。
12秒*60フレーム + 45フレーム = 765フレーム
765/1500 = 0.51
この計算で求められた0.51を、OSCを通してアバターに送信し、MotionTimeで再生位置をずらす。そうすると、時刻が表示される、という寸法です。
心拍数に関してはもっと簡単で、概ね60~160BPMで100で割れるように1秒と40フレームのアニメーションを作ってしまえば終わりです。
UDON使わせてくれない???????????
あと、これはVRC全然関係ないんですが…
一番使いこなせてる言語がC#なためC#でクライアントソフトを作っていた際にライブラリをどうするか、といったところで、調べるとすぐに出てくるNuGetの「Rug.Osc」を使ってみたところポートを開くところでVRChatとかち合ってエラーになるため使えませんでした。
ネットワーク絡みに明るくないのでよくわかってないんですけど…
そしていろいろ調べてみたところSharpOSCというライブラリで試したところうまくいきました。
もし同じことでつまずいてる人がいれば…
ひとまず今日はここまで…
あとはwearOSから心拍数を引っ張ってきたり、データなしのときに数値を表示にするアニメーションを作ったりかなぁ。
まぁ心拍数いる?って言われるとうーん。指輪の色も連動して変えてもいいかもしれない。
心拍計もできた
できました。
前述したとおり、現実的に有り得そうな心拍数60~160を表示できるようにし、それぞれ0~1で対応する用にしています。
以下のようなアニメーションです。
それを、一番最初に紹介したWearOS用のアプリケーションを使って色々やって表示させています。
とりあえずこれでやりたかったことはすべて自分でできたと思います。
なにかの参考になれば。
どうせ便利なツールが配られ出すんだろうけど仕組み上exeとか走らせないと行けないから信用できるところからしか受け取らないようにしようね…
公式でもgithub等でコードが公開されているところを信用しようっていってるし(超訳)。またしてもVRChat勢はネットリテラシーがないって言われちゃうぞ。
サポートいただいたら日々のエナドリ代としてありがたく使わせていただきます。 もしよろしかったら〜