Oculus Touchで綴るッ!ハンドジェスチャーでイベントを実行 Gesture Recognizer #アセットアドカレ

この記事は Unity Assets Advent Calendar 2015 7日目の記事になります。

平面の画面に対してマウスやタッチ操作のジェスチャー認識を行うアセットを改造してOculus Touchでジェスチャー入力ができるまでをやってみます。

Gesture Recognizer & Sample Game

https://www.assetstore.unity3d.com/jp/#!/content/14458

キャンバスにマウスや指で任意のジェスチャーを定義して認識させることができます。

もちろん認識したジェスチャー定義からイベントの実行も可能。また、PlayMakerとの連携もできるアドオンのアセットも公開されています。

PlayMaker Gesture Recognizer Add-on

https://www.assetstore.unity3d.com/jp/#!/content/34059

 

ジェスチャー認識の技術的な話

Oculus Rift x Leap Motion を使った指で空間に魔法を描いて発動できる Magic VR を作ってみた – 凹みTips
http://tips.hecomi.com/entry/2014/12/19/235052

ジェスチャー認識の技術的な話については@hecomi さんのこちらの記事が大変勉強になります。

 

開発環境

  • Unity 5.2.1p2

できること

ジェスチャーの入力は、一筆書きとマルチストロークの二筆以上のジェスチャーに対応。
PCでのマウス操作、スマホなどタッチパネルでのタッチ操作の軌道をジェスチャーとして認識させることができる。

認識するジェスチャーについては、同封されているジェスチャー認識の学習済みデータxmlのライブラリファイルを使うことにより、アルファベット、丸や三角や星などの形、数字の認識が簡単に行える。
また、ジェスチャーの定義も可能

デモシーン

\Gesture Recognizer2\Assets\GestureRecognizer\Scenes\

  • Gesture_Demo_Event.unity 一筆書きの定義済み辞書データ利用のサンプル
  • Gesture_Demo_Event_Limit_Drawing.unity 上のサンプルにジェスチャー認識エリアのキャンバスを制限したもの
  • Gesture_Demo_Script.unity 一筆書きのジェスチャー定義機能付き
  • MultiStroke_Demo_Event.unity 2筆以上の定義済み辞書データ利用のサンプル。MultiStroke_Demo_Event_Limit_Drawing.unityMultiStroke_Demo_Script.unityは一筆書きと同様

実装してみる

一筆書きで、用意されたジェスチャー認識の学習済みファイルを使う

学習済みデータの指定から、ジェスチャー入力の実装の流れを把握する。

  1. シーンを新規作成
  2. \GestureRecognizer\Prefabs\GestureRecognizer.prefabを配置。
    プレハブにアタッチされているGestureRecognizer.csスクリプトのLibrary to loadにて認識させたいジェスチャの種類を指定する。
    Resourcesフォルダ内のxmlファイル名を指定。拡張子不要
  3. 今回のキモ、独自イベントを定義するスクリプトを作成。GestureBehaviour.OnRecognitionにバインドするスクリプトを作成。シーンに空のオブジェクトを作りアタッチ。
  4. シーン再生して確認。左ボタンを押しながらドラッグでジェスチャー入力。Consoleに認識したジェスチャーの情報が表示される。

独自のジェスチャーを登録後に認識させてみる

学習データの書き込み必要最小限での実装。サンプルにあるマウスカーソルの軌道を描くTrailの実装はない。

  1. シーンを新規作成
  2. GestureRecognizerTest.csスクリプト作成して、適当なゲームオブジェクト(GestureREC)にアタッチ。
    GestureRecognizerTest.csスクリプトについて

    1. Start()
      GestureLibraryクラスxmlファイルを指定してglインスタンス作成
    2. Update()
      ・マウスボタン押し下げ
      カーソルの座標を保持するリストのpoints初期化
      ・マウスボタン押している最中
      常にマウスの座標をリストのpointsへ突っ込んでいく・マウスボタン押し上げ
      マウスが移動した座標のリストのpointsと、画面にあるInputTextに入力された定義名を取得して、xmlファイルに突っ込めるジェスチャー定義の学習データ、Gestureクラスのインスタンスを作る
    3. AddGesture()
      GestureLibraryをインスタンス化したglAddGesture。これでResourcesフォルダxmlファイルに追加される。
      残念なことにAssetDatabaseの再読み込みの実装がないようなので、Unityのウインドウのフォーカス切り替えでxmlファイルが更新されていることを確認できる。(自分で書いてもいいけど)
  3. 登録するジェスチャーの名前を入れるInputFieldを置いて先ほどのスクリプトのNewGestureNameに設定。
  4. Resourcesフォルダに次の内容で学習データを突っ込むxmlファイルを作成。作った名前を先ほどのスクリプトのLibrary To Loadに指定。
    <?xml version="1.0" encoding="utf-8"?>
    <gestures>
    
    </gestures>
  5. 保存ボタンを作る。On Click()に先ほどのスクリプトのAddGesture()を指定。

エディタを実行して確認。左クリックのドラッグでジェスチャーが描ける。

ジェスチャー定義を追加して保存する操作の流れは

  1.  入力ボックスに定義名を入れて
  2. 画面に左クリックでドラッグで書いて
  3. 保存ボタン

登録したジェスチャーを確認するには、 画面に右クリックでドラッグで描く。
Consoleに結果として、定義名と一致している度のスコアが出る。

実際に使う場合は、ゲームで使う定義に絞って学習済みデータを作成スコアが規定値を上回る場合のみ実行するように調整して使う感じがよい。

独自にジェスチャーを定義した学習済みデータのxmlファイルを作る

上記の手順でも独自に作ることができるが、学習済みデータファイルを作るのみであれば、マウスの軌道もでるのでサンプルシーンを使う。

  1. 無い場合は\Resourcesフォルダを作成
  2. サンプルシーンのGesture_Demo_Script.unityは一筆書き、MultiStroke_Demo_Script.unityで二筆以上のジェスチャーの登録ができる。
  3. 一筆書きと二筆以上とで、GestureRecognizer.prefabMultiStrokeRecognizer.prefabそれぞれあり、Library To Loadに学習させるデータファイルの名前を入力する。
  4.  シーン実行して登録後、Resourcesフォルダ以下にジェスチャー認識の学習済みデータの入ったxmlファイルが生成される。(らしいけど、されない場合は以下の内容で作っておく。)
    1. 一筆書き
      <?xml version="1.0" encoding="utf-8"?>
      <gestures>
      
      </gestures>
    2. 2筆以上
      <?xml version="1.0" encoding="utf-8"?>
      <multistrokes>
      
      </multistrokes>

 

Oculus Touchに対応する

Gesture Recognizerアセットのジェスチャー認識には、ジェスチャーの軌道を2次元の座標情報としてリストに保持した変数を用意するだけでOK

あとは、ジェスチャー入力中のトリガーをOculus Touchの任意のボタンに変えて、ジェスチャー入力の座標をトラッキングする対象をOculus Touchで操作する手へ変えて完成。(もちろんトラッキングした座標は3次元なので、カメラからの座標で変換して2次元にしてあげる)

 

Unity Assets Advent Calendar 2015 記事一覧へ