Skip to content

Protocol V2

gpsnmeajp edited this page Nov 6, 2019 · 29 revisions

受信プロトコルについて

EasyVirtualMotionCaptureForUnityのExternalReceiverは以下のプロトコルで受信しています。

  • OSC Protocolによる単方向UDP通信
  • ポート番号は既定で39539
  • 各値は1パケットで完結しており、欠落していても大きな影響が出ない
  • 送信周期は送り手のフレームレート依存
  • 必要・不要にかかわらず送信側は送信し、受信側でフィルタする

現在のプロトコルバージョンはV2.3です。

ExternalReceiverは、不明なアドレス、多すぎる引数は単に無視します。
少なすぎる引数、型の違う引数は例外を引き起こします。

内容

/Address (Type){Value}  

の形で記述します。

利用可否(Available)

/VMC/Ext/OK (int){0 or 1}  

モデル読み込み前は0、読み込み後は1
後述のボーン情報等が送信されているか否かを示す

送信側相対時刻(Time)

/VMC/Ext/T (float){time}  

送信側の現在の相対時刻 通信できているかを確認するのに主に使用する

Root姿勢(Root Transform)

v2.0
/VMC/Ext/Root/Pos (string){name} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w}  

v2.1
/VMC/Ext/Root/Pos (string){name} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w} (float){s.x} (float){s.y} (float){s.z} (float){o.x} (float){o.y} (float){o.z}  

p=位置 q=回転(Quaternion) s=MR合成用スケール o=MR合成用オフセット

モデルのrootとなるオブジェクトの絶対姿勢
nameは"root"固定。(Boneと合わせるため)
前半がPosition、後半がQuaternion
受信側ではLoal姿勢として扱うことを推奨する

v2.1より、MR合成用のスケールが追加された。
これを使うことでアバターの位置やサイズを現実の身体のサイズに合わせることができる。

Bone姿勢(Bone Transform)

/VMC/Ext/Bone/Pos (string){name} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w}  

モデルのrootとなるオブジェクトのLocal姿勢
nameはUnityEngineのHumanBodyBonesに沿った型名
前半がPosition、後半がQuaternion

※HumanBodyBonesすべてが送信される。LastBoneも含む。
これにより指の動きやEyeボーンなども送信される。

VRM BlendShapeProxyValue

/VMC/Ext/Blend/Val (string){name} (float){value}  
/VMC/Ext/Blend/Apply

BlendShapeProxyの値。送信側のVRMモデルに含まれるものすべてが送信され、
一連の内容が送信された後、Applyが送信される。
UniVRMの仕様上、AccumulateValueで蓄えた後、Applyを行うためこのようになっている。
これにより、表情やリップシンクなども送信される。

Camera位置・FOV(Camrea Transform&FOV)

V2.1
/VMC/Ext/Cam (string){name} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w} (float){fov} 

VMCの選択中のカメラの絶対位置と回転、FOV
前半がPosition、後半がQuaternion
VMC側でFOVに合わせて位置が調整されている。

Controller Input

V2.1
/VMC/Ext/Con (int){active} (string){name} (int){IsLeft} (int){IsTouch} (int){IsAxis} (float){Axis.x} (float){Axis.y} (float){Axis.z} 

コントローラのボタン入力に関する情報
active=1で押下、0で開放、2でAxis変化

keyboard Input

V2.1
/VMC/Ext/Key (int){active} (string){name} (int){keycode}

キーボード入力に関する情報
active=1で押下、0で開放

MIDI Note Input

V2.2
/VMC/Ext/Midi/Note (int){active} (int){channel} (int){note} (float){velocity}

MIDIノート入力に関する情報
active=1でオン、0でオフ

MIDI CC Value Input

V2.2
/VMC/Ext/Midi/CC/Val (int){knob} (float){value}

MIDI CCアナログ値入力に関する情報
数値変化が連続的に送信される。

MIDI CC Button Input

V2.2
/VMC/Ext/Midi/CC/Bit (int){knob} (int){active}

MIDI CCデジタル値入力に関する情報
デジタル変化時のみ送信される。(アナログ値は0.5を閾値とする)
active=1でオン、0でオフ

Device Transform

V2.2
/VMC/Ext/Hmd/Pos (string){serial} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w}  
/VMC/Ext/Con/Pos (string){serial} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w}  
/VMC/Ext/Tra/Pos (string){serial} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w}  

HMD, コントローラ, トラッカーの姿勢情報
serialはOpenVRのシリアル番号
前半がPosition、後半がQuaternion

送信プロトコルについて

VirtualMotionCaptureは以下の以下のプロトコルで受信しています。

  • OSC Protocolによる単方向UDP通信
  • ポート番号は既定で39539

Virtual Device Transform

V2.3
/VMC/Ext/Hmd/Pos (string){serial} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w}  
/VMC/Ext/Con/Pos (string){serial} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w}  
/VMC/Ext/Tra/Pos (string){serial} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w}  

仮想HMD, コントローラ, トラッカーの姿勢情報
serialは仮想シリアル番号
前半がPosition、後半がQuaternion
HMDはトラッカーとして扱われる。

Frame Period

V2.3
/VMC/Ext/Set/Period (int){Status} (int){Root} (int){Bone} (int){BlendShape} (int){Camera} (int){Devices} 

バーチャルモーションキャプチャーからのデータ送信間隔を設定する。
1/x Frame間隔で送信される。

Virtual MIDI CC Value Input

V2.3
/VMC/Ext/Midi/CC/Val (int){knob} (float){value}

仮想MIDI CCアナログ値入力に関する情報

Virtual Camrea Transform&FOV

V2.3
/VMC/Ext/Cam (string){name} (float){p.x} (float){p.y} (float){p.z} (float){q.x} (float){q.y} (float){q.z} (float){q.w} (float){fov} 

カメラ位置制御
受信時、強制的にフリーカメラになる

VRM BlendShapeProxyValue

V2.3
/VMC/Ext/Blend/Val (string){name} (float){value}  
/VMC/Ext/Blend/Apply

BlendShapeProxyの値

Virtual Camrea Transform&FOV

V2.3
/VMC/Ext/Set/Eye (int){enable} (float){p.x} (float){p.y} (float){p.z}

アイトラッキング目標座標(ルーム内絶対座標)

Clone this wiki locally