この記事は 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.unity
とMultiStroke_Demo_Script.unity
は一筆書きと同様
実装してみる
一筆書きで、用意されたジェスチャー認識の学習済みファイルを使う
学習済みデータの指定から、ジェスチャー入力の実装の流れを把握する。
- シーンを新規作成
\GestureRecognizer\Prefabs\GestureRecognizer.prefab
を配置。
プレハブにアタッチされているGestureRecognizer.cs
スクリプトのLibrary to load
にて認識させたいジェスチャの種類を指定する。
Resourcesフォルダ
内のxmlファイル名
を指定。拡張子不要- 今回のキモ、独自イベントを定義するスクリプトを作成。
GestureBehaviour.OnRecognition
にバインドするスクリプトを作成。シーンに空のオブジェクトを作りアタッチ。 - シーン再生して確認。左ボタンを押しながらドラッグでジェスチャー入力。
Console
に認識したジェスチャーの情報が表示される。
独自のジェスチャーを登録後に認識させてみる
学習データの書き込み必要最小限での実装。サンプルにあるマウスカーソルの軌道を描くTrailの実装はない。
- シーンを新規作成
GestureRecognizerTest.cs
スクリプト作成して、適当なゲームオブジェクト(GestureREC
)にアタッチ。
GestureRecognizerTest.cs
スクリプトについてStart()
GestureLibraryクラス
をxmlファイル
を指定してglインスタンス作成
・マウスボタン押している最中Update()
・マウスボタン押し下げ
カーソルの座標を保持するリストのpoints初期化
常にマウスの座標をリストのpointsへ突っ込んでいく・マウスボタン押し上げ
マウスが移動した座標のリストのpointsと、画面にあるInputTextに入力された定義名を取得して、xmlファイルに突っ込めるジェスチャー定義の学習データ、Gestureクラスのインスタンスを作るAddGesture()
GestureLibrary
をインスタンス化したgl
にAddGesture
。これでResourcesフォルダ
のxmlファイル
に追加される。
残念なことにAssetDatabase
の再読み込みの実装がないようなので、Unityのウインドウのフォーカス切り替えでxmlファイル
が更新されていることを確認できる。(自分で書いてもいいけど)
- 登録するジェスチャーの名前を入れる
InputField
を置いて先ほどのスクリプトのNewGestureName
に設定。 Resourcesフォルダ
に次の内容で学習データを突っ込むxmlファイル
を作成。作った名前を先ほどのスクリプトのLibrary To Load
に指定。<?xml version="1.0" encoding="utf-8"?> <gestures> </gestures>
- 保存ボタンを作る。
On Click()
に先ほどのスクリプトのAddGesture()
を指定。
エディタを実行して確認。左クリックのドラッグでジェスチャーが描ける。
ジェスチャー定義を追加して保存する操作の流れは
- 入力ボックスに定義名を入れて
- 画面に左クリックでドラッグで書いて
- 保存ボタン
登録したジェスチャーを確認するには、 画面に右クリックでドラッグで描く。
Console
に結果として、定義名と一致している度のスコアが出る。
実際に使う場合は、ゲームで使う定義に絞って学習済みデータを作成。スコアが規定値を上回る場合のみ実行するように調整して使う感じがよい。
独自にジェスチャーを定義した学習済みデータのxmlファイルを作る
上記の手順でも独自に作ることができるが、学習済みデータファイルを作るのみであれば、マウスの軌道もでるのでサンプルシーンを使う。
- 無い場合は
\Resourcesフォルダ
を作成 - サンプルシーンの
Gesture_Demo_Script.unityは
一筆書き、MultiStroke_Demo_Script.unityで
二筆以上のジェスチャーの登録ができる。 - 一筆書きと二筆以上とで、
GestureRecognizer.prefab
とMultiStrokeRecognizer.prefab
それぞれあり、Library To Load
に学習させるデータファイルの名前を入力する。 - シーン実行して登録後、
Resourcesフォルダ
以下にジェスチャー認識の学習済みデータの入ったxmlファイル
が生成される。(らしいけど、されない場合は以下の内容で作っておく。)- 一筆書き
<?xml version="1.0" encoding="utf-8"?> <gestures> </gestures>
- 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 記事一覧へ