OSC 心拍計アバターセットアップガイド

OSC HeartRateSenderに連動して動くアバターのセットアップ方法のガイドです。VRChat SDK Avatar3.0規格でセットアップ済みのアバターを前提にしています。

 

基本的にはAvatar3.0のExpressionParameterを使ったアバターギミックとセットアップ方法はおなじになります。ラジアルでのシェイプキー操作方法|みかんねここ|noteのような、RadialPuppetとExpressionParameterのFloatを使うAvatar3.0カスタマイズ記事は参考になるでしょう

 

ここでは、具体例として火事屋さんのアバターU10素体版を例にセットアップをしていきます。なお、完成したアバターについてもpackageに含んでますので、参考にしてみてください

booth.pm

基本の仕組み

OSCとVRChatのAvatar3.0は概ね以下の流れで動きます。

  1. OSC HeartRateSenderはOSCで心拍数をVRChatに送ります
  2. VRChatは受け取った値を、アバターのExpressionParameterに格納します(ExpressionParameterはVRChat内同一インスタンスの相手にも同期されます)
  3. ExpressionParameterに基づいてアバターのFX layerがアニメーションを実行します
  4. アニメーションが適用されて、心拍数表示やドキドキする動きがアバターに反映されます

このステップ、あなたがアバターに組み込む必要な作業は、2.ExpressionParameterの設定と、3.FX layerのアニメーション設定、4.アバター見た目の設定です。*1

 

アバターの見た目のセットアップ

まずアバターをアップロード前or後の状態まで持っていきましょう。そこから心拍数表示を追加していきます。

 

アバターの心拍数表示対応化キットのunity.packageはここに用意しましたので、プロジェクトにインポートしてください。

omega.booth.pm

f:id:o_mega:20220324230402p:plain

OSCHeartRate_AvatarKit.packageにはすぐ使えるよう

  • 数値表示シェーダー
  • 数値表示モデル/テクスチャ
  • 数値表示アニメーション
  • ハートマークモデル
  • ハートマークアニメーション
  • セットアップ済みのU10素体版のサンプルScene*2

などが入っています。とはいえアバターセットアップはみなさんがする必要があります。早速やっていきます。

IndicatorsのprefabをD&Dして

f:id:o_mega:20220324010126p:plain

アバターの配下へD&Dします。

f:id:o_mega:20220324021351p:plain

unpack prefabもして編集可能にしておきましょう

f:id:o_mega:20220324225320p:plain

出来ました

f:id:o_mega:20220324033242p:plain

prefabのIndicatorsには、ハートアイコン(HeartIcon)と心拍数表示(Indicator1~4)4つが入ってます。初めての人はそのまま先へ行きましょう。

 

要らない表示パネルやハートマークはtransformのscaleを0にして見えなくします。より万全を期すなら、アバターの身体の中に埋め込んでも良いです

f:id:o_mega:20220324032923p:plain

見た目の整理が完了しました。この例では、足元にあったIndicator3,4のscaleを0にして見えなくしています。見た目はこれでいいでしょう

f:id:o_mega:20220324032536p:plain

 

こだわりたい人へ

Indicators/RootからIndicator1~4、HeartIconをアバターのArmatureに乗せて、位置やサイズ調整すると良いでしょう。このあたりはアバターの着せ替え、帽子やアクセサリーを付けるのと要領は同じです。

頭上に乗せたいときは頭(Head)ボーンに乗せてもいいですが、頭の動きに敏感に反応しすぎてやかましいかもしれません。そういう時は位置は頭上にしながら、ボーンは腰(Hips)や胸(Chest)に乗せるのもいいでしょう。サンプルアバターAはまさにこの作りになっていて、心拍数は頭上に設定していますがボーン上は腰(Hips)に乗っています。

下の例ではIndicator1を顔(Head)に、HeartIconとIndicator4を胸(Chest)に乗せています

f:id:o_mega:20220326012251p:plain

アニメーションの見た目確認

アニメーションが適用された時の挙動を確認します。

f:id:o_mega:20220324034029p:plain

Animationフォルダに入ってるアニメーション3つを選択し、アバターへD&Dします。こうするとアニメーションをプレビューできるようになります

f:id:o_mega:20220324034544p:plain

アバターを選択(1)して、Animationウインドウ(2)から確認したいアニメーションを選びます。タイムラインをドラッグしたり(3)、再生ボタンを押して見て、動きを確認してみましょう。

  • HR_IconBeat、HR_IconBeat2はハートアイコン2パターン
  • HR_Indicatorアニメーションは心拍数のデジタル表示

です。ハートアイコンのアニメは後でAnimationControllerに設定するとき、好きな方を選択してください

 

ExpressionParameterの設定

OSC HeartRateSenderアプリから送られる心拍数を格納するExpressionParameterを設定します。ExpressionParameterの名前は、OSC HeartRateSendersドキュメントページにあるように

  • HeartRate, Int 
  • HeartRateFloat01(ゼロイチ), Float
  • HeartRateZone, Float

の3つがあります。これを受け取れるようにアバターに設定をしましょう。

アバターを選択し、VRC AvatarDescriptorコンポーネントのExpressions枠を見ます。すでに独自のParamtersが設定してあれば、それをダブルクリックしてParameter設定を開きます

f:id:o_mega:20220324035407p:plain

U10素体版の場合は、Parameterが予め設定されていましたので、それに上記のParameterを書き足します。

f:id:o_mega:20220324035614p:plain

書き足しました。Int,Floatのtype指定を忘れずに、Savedのチェックは外しておきます。

f:id:o_mega:20220324035911p:plain

これでExpressionParameterの設定は完了です

 

ExpressionParameterが初期状態で空のアバターの場合

ExpressionParameterが設定されてないとこう

f:id:o_mega:20220324040125p:plain

この場合はCustomizeボタンをポチっとな

f:id:o_mega:20220324040621p:plain

 

では、ExpressionParameterを新規に作りましょう。右クリックからCreate - VRChat - Avatar - ExpressionParameters

f:id:o_mega:20220324040236p:plain

出来たExpressionParametersをアバターへD&DすればOK。あとは、上のParameter追加を行ってください

f:id:o_mega:20220324040409p:plain

FX layerの設定

FX layerにアニメーションの設定をし、ExpressionParameterの数値を元にアバターへ反映させる設定を組み込みます。

アバターのVRC AvatarDescriptorコンポーネントのPlayerable LayersのFXをダブルクリックして

f:id:o_mega:20220324043005p:plain

AnimationControllerを開きます

f:id:o_mega:20220324043129p:plain

Parameterの追加

Parametersタブをクリック。次に右の+ボタンを押して、先のExpressionParameter同様にIntで「HeartRate」、Floatで「HeartRateFloat01」「HeartRateZone」を追加します。

f:id:o_mega:20220324043331p:plain

追加しました

f:id:o_mega:20220324045439p:plain

アニメーションを組み込む

Layersタブをクリック。+ボタンを押してレイヤーを追加します。

f:id:o_mega:20220324043822p:plain

歯車マークをクリックして、Weightを必ず1にします(忘れがち)

レイヤー名はHeartRateIndicatorとでもしましょう。Animationsから作り置きのアニメーション、HR_Indicator.animをControllerへD&Dします。

f:id:o_mega:20220324044027p:plain

D&DしたHR_Indicator Stateをインスペクタで見ます。

MotionTimeのParameterをチェックし、ドロップダウンからHeartRate01を選びます。これで、ExpressionParameterのHeartRateFloat01の値に応じて、HR_Indicatorアニメーションを動かすことで、心拍数がデジタル表示されるようになりました。

ついでに、WriteDefaultは外しておきましょう

f:id:o_mega:20220324045533p:plain

 

もう一つ、ハートアイコンのアニメも組み込みましょう。レイヤーを追加しWeightを1に。名前はHeartIconBeatとしました

f:id:o_mega:20220324044916p:plain

HR_IconBeatかHR_IconBeat2、好きな方をControllerへD&D

f:id:o_mega:20220324044812p:plain

同じくHR_IconBeat(2)のStateをインスペクタで見ます。

SpeedMultiplierのParameterをチェック。Speedを4.25*3にする。multiplierはHeartRateFloat01を指定します

これでHeartRateFloat01の値に応じて、HR_IconBeatのアニメーション速度が早くなったり遅くなったりします

f:id:o_mega:20220324045734p:plain

以上で完了です。

普段同様にアバターをアップロードしてVRChat内で確認しましょう

テスト機能を使って、VRC内で動作を確認する

VRChatとOSCHeartRateSenderを起動します。

アバターを着替え、アクションメニュー設定でOSC Enableになっていることを確認します。HeartRateSenderの「OSC接続ボタン」を押した後、「(テスト)ランダムな心拍を送る」をぽちぽち押してみましょう。押すたびにランダムな心拍数が送られ、アバターの挙動チェックが出来ます

f:id:o_mega:20220324050927p:plain

デスクトップモードでアクションメニューを開くにはRキーを使います。OSCが送られて来ていれば、こんなOSC Debug画面が見れるはず

f:id:o_mega:20220324050807p:plain

Parameterが伝わっていれば、Debug画面ではここでExpressionParameterが書き換わるのが見えるはずです。

f:id:o_mega:20220324051304p:plain

もしOSCはVRCまで送信できているのに、アニメーションが動かない場合は、アクションメニューのOSC ResetConfigを一回操作してから、心拍送信をもう一度やってみましょう。それでもダメならUnityへ戻ってアバターの確認を。

問題なければ、心拍数表示とハートアイコンがそれらしく動くはずです。

 

その他

セットアップサンプル

f:id:o_mega:20220326012006p:plain

パッケージ同梱のU10HeartRate.sceneには心拍OSCアニメーションがセットアップ済みのU10素体が2体入っています。

  • サンプルA(画像右)、頭上にでかでかと心拍数とアイコン、左手手首に心拍数表示が入ってます。ハートアイコンはドクンドクンとした動き(HR_IconBeat)
  • サンプルB(画像左)、目の下と背中に心拍数、胸にアイコン、左手手首に心拍数表示が入ってます。ハートアイコンは点滅(HR_IconBeat2)

セットアップの参考やアイデア出しにどうぞ

これらは検証アバターワールドにも置いてあります

数字シェーダー(Unlit/numbertex)

ブタジエンさんの数字表示シェーダーをベースに改変したものになります。

f:id:o_mega:20220326123701p:plain

  • Valueの数値が3桁表示になる
  • Value5以下の時「???」表示になる

あたりが主な改変ポイントです。

f:id:o_mega:20220326124044p:plain

数字テクスチャに手を入れる場合は、下から並んでいることに注意してください。WrapModeはclamp、FilterはPoint(No filter)にするとパキッとハッキリした絵になり、オススメです

f:id:o_mega:20220326124208p:plain

FAQ

Q.アバター更新して、OSCは受信できてるのに、アニメーションが動かない

ExpressionParameterを変更した場合、VRChatのアバターOSC設定が更新されないことがあるようです。アクションメニューからConfig - OSC - ResetConfigをしてみてください*4

f:id:o_mega:20220326235705p:plain

Q.心拍数が少し(±2ぐらい)ズレる

A.残念ながら、現在の0~1のFloatアニメーションを使う方式では仕様です

Q.心拍数で条件分岐を書いたが、数値調整や他の人の心拍数に合わせるとアバター上げ直しが大変〜

A.心拍数は個人差があります。その対策として、HeartRateZoneパラメータを用意してありますので、このパラメータを元に条件分岐を書きましょう。HeartRateZone値は、OSCHeartRateSenderアプリ側で最大/最小心拍数の調整が効きます

Q.他の心拍数OSCツールでもこのアバターやpackageを使いたい

A.どうぞどうぞ、使えます。

現状のセットアップのままでも、mkc1370さんのmiband-heartrate-oscとパラメータ互換性があります*5。サンプルアバター含め、miband-heartrate-oscアプリでも同様に使えるはずです

github.com

vard88508さんのvrc-osc-miband-hrmとはパラメータ名が異なっていますが、仕組み的には同じです。アバター側でパラメータ名を揃えれば*6同じようにセットアップできます

github.com

*1:参考に、RadialPuppetを使うギミックの場合は、1.OSC送信の変わりにExpressionMenuを作る必要があります。逆を言うと、ExpressionMenuの操作をOSC送信が代行している、とも言えますね

*2:別途packageを入手してください

*3:なんで中途半端な数値なのかというと、HR_IconBeatアニメは1サイクル1秒 = BPM60なため。HeartRateFloat01は0.0f~1.0fが心拍0~255に当てているので、1.0f再生時にBPM255になるようにする = 255/60 = 4.25

*4:おそらく、C:\Users\ユーザ名\AppData\LocalLow\VRChat\VRChat\OSC\usr_xxxx\Avatars\avtr_xxxx.json ファイルが残っている様子?最近VRC内からReset操作ができるようになって助かりました

*5:同じHeartRateFloat01パラメータを使っています

*6:パラメータ名HeartRateFloat01の代わりにHeratRate2を指定する