【Hi5 VR Glove】使いやすさを求めて

こんにちは、インターン生の平島です!

以前「【Hi5 VR Glove】指の動きを追ってみる!」で

指のマーカーを実装した後、色々と動かしてみました。

ただ、一つ問題点が発覚。

1PCで1セット(左右のグローブ)しか使えない

2人でグローブを使おうとすると2台のPCが必要で

4人なら4台、、、とこれではあまり使いやすくありません。

なんとか1PCで2セット以上のグローブが使えないか、奮闘してみました。

1.はじめに

Hi5 VR Gloveは以下のように接続します。

.png

(https://hi5vrglove.com/instructionsのUser Guideより引用)

左がグローブ、右がレシーバーです。

レシーバーをPCに挿入し、レシーバーとグローブはBluetoothによって接続されるとペアリング状態となり、座標等がやり取りされます。

2.実験

(以下、グローブのセットのうち片方をセット①、もう片方をセット②としてます。)

【案1:1レシーバーに2セット接続してみる】

まずレシーバーとセット①をペアリングした後、セット②をペアリングしてみます。

pastedImage0

右手が左手のトラッカーに表示されたり、そもそも表示されていなかったり

上手く行ってないことがわかると思います。

受け取った座標をどのトラッカーに表示したら良いかわからなくなっているようです。

【案2:2レシーバーに2セット接続してみる】

レシーバーをPCに2つ挿入して、それぞれとグローブセットをペアリングしました。

ペアリングの成否はレシーバーランプの点灯パターンで判断できますが、

どうやらペアリングは問題なく出来ているようです。

表示を確認してみると

.png

今回はセット②の方にだけ手が表示されました。

セット①→セット②の順にペアリングしたので、

「接続グローブが上書きされてしまった」ようです。(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には以下のような記述がありました。

pastedImage0 (4)

指定された手の種類(左右)の指定されたインデックス(親指の先端、人差し指の付け根等)

の座標を取得する関数です。

boneIndexもhandTypeも予めデバイスで設定されているものなので、コードの書き換えで

対処はできないと判断し、当初の目的であった「1PCで2セット以上のグローブを使う」

ことは不可能であると結論付けました。

4.さいごに

デバイスのソフトウェア部分だけを操作して、理想の挙動をさせることの難しさを

痛感しました。そもそもデバイスの提供側がその「理想の挙動」を想定していないので

当たり前と言えば当たり前ですが、、

Hi5 VR Gloveの技術調査はひとまずここで区切りにする予定です。

コメントを残す