こんにちは、インターン生の平島です!
以前「【Hi5 VR Glove】指の動きを追ってみる!」で
指のマーカーを実装した後、色々と動かしてみました。
ただ、一つ問題点が発覚。
1PCで1セット(左右のグローブ)しか使えない
2人でグローブを使おうとすると2台のPCが必要で
4人なら4台、、、とこれではあまり使いやすくありません。
なんとか1PCで2セット以上のグローブが使えないか、奮闘してみました。
1.はじめに
Hi5 VR Gloveは以下のように接続します。
(https://hi5vrglove.com/instructionsのUser Guideより引用)
左がグローブ、右がレシーバーです。
レシーバーをPCに挿入し、レシーバーとグローブはBluetoothによって接続されるとペアリング状態となり、座標等がやり取りされます。
2.実験
(以下、グローブのセットのうち片方をセット①、もう片方をセット②としてます。)
【案1:1レシーバーに2セット接続してみる】
まずレシーバーとセット①をペアリングした後、セット②をペアリングしてみます。
右手が左手のトラッカーに表示されたり、そもそも表示されていなかったり
上手く行ってないことがわかると思います。
受け取った座標をどのトラッカーに表示したら良いかわからなくなっているようです。
【案2:2レシーバーに2セット接続してみる】
レシーバーをPCに2つ挿入して、それぞれとグローブセットをペアリングしました。
ペアリングの成否はレシーバーランプの点灯パターンで判断できますが、
どうやらペアリングは問題なく出来ているようです。
表示を確認してみると
今回はセット②の方にだけ手が表示されました。
セット①→セット②の順にペアリングしたので、
「接続グローブが上書きされてしまった」ようです。(Logをとって確認済)
デバイスをいじって問題解決するのはどうやら難しいようなので、
ソースコードを辿ってみることにします。
3.ソースコードを辿る
各手のオブジェクトに貼られているスクリプト、HI5_VIVEInstance.cs内で定義されている
以下2つの関数に注目します。
〈SetRotation〉
private void SetRotation(Transform[] bones, int bone, Vector3 rotation) { Transform t = bones[(int)bone]; if (t != null) { Quaternion rot = Quaternion.Euler(rotation); if (!float.IsNaN(rot.x) && !float.IsNaN(rot.y) && !float.IsNaN(rot.z) && !float.IsNaN(rot.w)) { t.localRotation = rot; } } }
第3引数のrotation(座標)をbones配列に格納します。
(bones配列については下のHandBones配列で説明します。)
〈ApplyFingerMotion〉
private void ApplyFingerMotion(HI5_Source source) { for (int i = (m_INDEX_Hand +1 ); i < (int)Bones.NumOfHI5Bones && i < HandBones.Length; i++) { if (HandBones[i] != null) { SetRotation(HandBones, i, source.GetReceivedRotation(i, HandType)); } } }
SetRotation関数を用いて、実際に各指関節の座標が格納されていきます。
なおHandBones[i]は各指関節を表し、例えば親指の先端はHandBones[2]、
人差し指の付け根はHandBones[8]と予め決められています。
では、肝心の座標を与える第3引数、source.GetReceivedRotation(i, HandType)は、
というとHi5Plugins.dll内で定義されていてそれ以上読むことができませんでした。
また、APIには以下のような記述がありました。
指定された手の種類(左右)の指定されたインデックス(親指の先端、人差し指の付け根等)
の座標を取得する関数です。
boneIndexもhandTypeも予めデバイスで設定されているものなので、コードの書き換えで
対処はできないと判断し、当初の目的であった「1PCで2セット以上のグローブを使う」
ことは不可能であると結論付けました。
4.さいごに
デバイスのソフトウェア部分だけを操作して、理想の挙動をさせることの難しさを
痛感しました。そもそもデバイスの提供側がその「理想の挙動」を想定していないので
当たり前と言えば当たり前ですが、、
Hi5 VR Gloveの技術調査はひとまずここで区切りにする予定です。