Hi5 グローブのセットアップから Unity への組み込みまで


Manus VR から、界隈で人気と噂の Hi5 グローブに乗り換え。

単三電池を左右に一本ずつ入れるだけで数時間動く。充電式バッテリーがへたる心配もないし、電池が切れたら買ってくればすぐに撮影再開できる。
購入直後に Noitom 社来日、新製品発表へ、とのメールを受けてちょっと焦る。

目次

Unity 用アセットのダウンロード

Hi5 Glove Unity SDK

とりあえず Unity Plugin があれば動く。

Unity Interaction SDK は名前の通り、手を使って Unity 内の 3D オブジェクトに触りたいときに使う。

Hi5 グローブの準備(ペアリング)

Hi5 Glove を使うには、最初にドングルを PC に刺してから、グローブの電源を入れる。ドングル(アンテナ)とグローブの LED の点滅が始まればペアリング成功。

※ LED インジケーターが点滅していると正常で、点滅していない時はエラー。点灯状態の場合は消磁処理(後述)が必要なので注意。

--

意図的に再ペアリングしたい時は、まずアンテナのボタンを3秒おして LED がゆっくり明滅し始めるのを待つ。その後に Hi5 グローブのボタンを3秒押す。あとは LED が点滅状態になるまで待つ。

Unity への組み込み

ダウンロードした Unity Plugin の Assets/NoitomHi5/Scenes にある、Example_Inertia.unity に、肘・手首の動きと指の動きを取り込むセットアップがされた GameObject が入ってる。

Inertia とは
慣性、惰性、惰力、不活発、ものぐさ、遅鈍、無力(症)、緩慢

Example_Inertia.unity はグローブに HTC Vive トラッカーを付けない運用に合わせたセットアップがされている。
※ トラッカーをつけなくても手首の向きは取れる。

上記シーンから、これらの GameObject をコピーすればオッケー。

  • HI5_Left_Human
  • HI5_Right_Human

Manus VR のようにグローブの状態を示すミドルウェア、みたいなものは無いので Unity で動かして確認する。

手のスケルトン・ボーンの回転軸方向

手のボーンの回転軸方向は、回転がゼロのときに指が X 軸に沿ってピンと伸びた状態にする、という良くあるやつ。

※ 座標系の違いを吸収する奴を噛ましているのでちゃんと見てない。

デマグネタイゼーション(Demagnetization)

磁気除去、消磁は、LED が点滅してないときに実行する必要がある。

  • 磁気を発するものから離れたところで実行する。
  • キャリブレーション用のシーンに、磁気の影響を示す磁石のアイコンがあり、赤い場合は磁気の影響が強いので環境を見直す。

スタジオ内の磁気の影響の確認は、方位磁石を使うと便利。

消磁のやりかた

以下 Noitom 社公式動画より。

  1. 動画の 1:10 からデマグネタイゼーション運動のやりかたが見れる。
    • 手のひらをくるくる回し(手を返す・曲げる)ながら自分自身もぐるぐる回る。を20秒続ける。
  2. LED が点滅状態になったら成功。

開封後とりあえず最初にやっておく。

Hi5 Glove キャリブレーション用シーンとスクリプトの編集

Hi5 グローブは HMD を被らないとキャリブレーションが出来ない。電池残量や磁気の影響具合の表示もすべて HMD を被って確認する必要があって、ちょっと不便。
※ HMD は置物になっていて使うことはなく、演者も VR 未経験者が多い。

PC からマウスで操作できるようにシーンをカスタマイズ。

--

まずは Main CameraTarget EyeNone にする。

次に Assets/NoitomHi5/Scripts/Example/VRInteraction にある、VREyeRaycaster.cs を以下のように書き換えて、マウスの左クリックでダイアログ操作が出来るようにする。

※ オリジナルの、EyeRaycast() の中の Ray ray = new...... の一行を書き換え。

private void EyeRaycast()
{
   // Show the debug ray if required
   if (m_ShowDebugRay)
   {
         //Debug.DrawRay(m_Camera.position, m_Camera.forward * m_DebugRayLength, Color.blue, m_DebugRayDuration);
         Debug.DrawRay(m_Camera.position, Quaternion.AngleAxis(5f, m_Camera.right) * m_Camera.forward * m_DebugRayLength, Color.blue, m_DebugRayDuration);
   }

   // Create a ray that points forwards from the camera.
   //Ray ray = new Ray(m_Camera.position, m_Camera.forward);


   // ↓ この一行を書き換える
   Ray ray = new Ray(m_Camera.position, Quaternion.AngleAxis(5f, m_Camera.right) * m_Camera.forward);
   // ↑ この一行を書き換える


   RaycastHit hit;

以下に差し替え。

   //Ray ray = new Ray(m_Camera.position, Quaternion.AngleAxis(5f, m_Camera.right) * m_Camera.forward);
   Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width * 0.5f, Screen.height, 0f));
   if (Input.GetButton("Fire1"))
   {
      ray = Camera.main.ScreenPointToRay(Input.mousePosition);
   }

Hi5 グローブのキャリブレーション

スクリプトの編集が終わったら、Assets/NoitomHi5/Scenes にある Calibration.unity を実行する。

マウスの左クリックでダイアログのボタンが反応するようになっているので、画面に従ってキャリブレーションを行う。

※ 画面上のボタンを操作するときは、リング状のメーターが溜まるまでマウスの左ボタンを押しっぱなしにしている必要がある。

※ Hi5 Glove を接続した状態だと、右の L/R の下にバッテリー残量と磁石アイコンが表示される。

磁石アイコンは磁気の影響を示していて、赤い場合は磁気の影響が強いので消磁処理が必要。

キャリブレーションポーズ

キャリブレーション用のシーンに説明が表示されてはいるが、細かい注意点があるので事前に確認しておく。

  • B(仏陀ポーズ)= 胸の前で手を合わせて、指先までしっかり伸ばす
  • P(Pinchポーズ)= 親指は曲げずに伸ばした状態で、人差し指の先を親指の先に付ける

※ Images courtesy of Noitom International Inc.

--

その他詳細は公式サイトにある User Guide(PDF)を確認。

動作結果

各種キャプチャー装置からの入力をコントロールするモジュールを整備したおかげもあるけど、セットアップから動作まで1日で終わる。

動作も非常に良好。(動画はそのうちアップ)

--

5本の指すべてに IMU が付いているので、親指以外も指の開きが技術的には撮れる(ハズ?)

何かしら理由があって5本すべてが難しいなら、親指・人差し指・中指の三本だけでも構わないから、アップデートで対応してほしい。

代理店の方に相談したら、無線なのでおそらくレイテンシーの問題でオミットしてるのだろうと。
60fps が出るかどうかより 30fps で指の開きが取れる方が表現力高い。Noitom 頼む。

IMU リセット機構?

Hi5 グローブでも激しく腕を振る動きの直後に一度、手首の向きがおかしくなった。

ただ、Manus VR のように1フレームで補正、という感じではないし、おかしくなる頻度も非常に低い。数時間の撮影中に1度だけだった。

今のところローパスフィルターみたいな処理は組み込んでない。

↓ Manus VR ↓ のリセット動作

--

こちらもどうぞ