Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HoloLensで空中お絵描き~ハンドトラッキング&音声入力~

 HoloLensで空中お絵描き~ハンドトラッキング&音声入力~

TakashiYoshinaga

July 19, 2018
Tweet

More Decks by TakashiYoshinaga

Other Decks in Technology

Transcript

  1. スクリプトの記述 using HoloToolkit.Unity.InputModule; public class Receiver : MonoBehaviour { //

    Start関数は初期化のために一度だけ実行される void Start () { } // Update関数は毎フレーム実行される void Update () { } } InputModuleの読み込みとISourceStateHandler, IInputHandlerを実装 , ISourceStateHandler, IInputHandler ISourceStateHandlerとIInputHandlerにカーソルを 合わせ、ヒントからInplement interfaceをそれぞれ選択
  2. 不要コードの削除 public class Receiver : MonoBehaviour, ISourceStateHandler, IInputHandler { public

    void OnInputDown(InputEventData eventData) { throw new NotImplementedException(); } public void OnInputUp(InputEventData eventData) { throw new NotImplementedException(); } public void OnSourceDetected(SourceStateEventData eventData) { throw new NotImplementedException(); } public void OnSourceLost(SourceStateEventData eventData) { throw new NotImplementedException(); } throw new NotImplementedException(); throw new NotImplementedException(); throw new NotImplementedException(); throw new NotImplementedException();
  3. ジェスチャの受信設定と手の検出 //手を検出した時に呼ばれる関数 public void OnSourceDetected(SourceStateEventData eventData) { Debug.Log("手を検出"); } //手を見失った時に呼ばれる関数

    public void OnSourceLost(SourceStateEventData eventData) { Debug.Log("手をロスト"); } void Start () { InputManager.Instance.PushFallbackInputHandler(gameObject); } void Update () { } このスクリプトが貼り付けられている オブジェクト(gameObject)に ジェスチャの通知が来るように登録
  4. 指の状態の取得 //人差指をおろした時に呼ばれる public void OnInputDown(InputEventData eventData) { Debug.Log("Down"); } //人差指を上げた時に呼ばれる

    public void OnInputUp(InputEventData eventData) { Debug.Log("Up"); } public void OnSourceDetected(SourceStateEventData eventData) { Debug.Log("手を検出"); } public void OnSourceLost(SourceStateEventData eventData) { Debug.Log("手をロスト"); }
  5. 手の状態を保持する bool drag = false; //ドラッグor開放の状態を保持する変数 public void OnInputDown(InputEventData eventData)

    { drag = true; Debug.Log("Down"); } public void OnInputUp(InputEventData eventData) { drag = false; Debug.Log("Up"); } public void OnSourceDetected(SourceStateEventData eventData) { Debug.Log("手を検出"); } public void OnSourceLost(SourceStateEventData eventData) { drag = false; Debug.Log("手をロスト"); }
  6. 手の位置を取得する準備 IInputSource currentInputSource; //入力情報 uint id; //入力情報のID bool drag =

    false; public void OnInputDown(InputEventData eventData) { InteractionSourceInfo sourceKind; eventData.InputSource.TryGetSourceKind( eventData.SourceId, out sourceKind); if (sourceKind == InteractionSourceInfo.Hand) { currentInputSource = eventData.InputSource; id = eventData.SourceId; drag = true; Debug.Log("Down"); } }
  7. 手の位置にオブジェクトを追従させる IInputSource currentInputSource; //入力情報 uint id; //入力情報のID bool drag =

    false; public GameObject obj; //Cubeの情報を覚えておく変数 public void OnInputDown(InputEventData eventData) { /*関数の中身を省略*/ } /*各関数(省略)*/ void Update () { if (drag) { Vector3 pos; currentInputSource.TryGetGripPosition(id, out pos); obj.transform.position = pos; } }
  8. 複数の線を描画しよう public GameObject obj; //線の描画に使用するGameObject public GameObject original; //テンプレートとなるCubeを保持 public

    void OnInputDown(InputEventData eventData) { InteractionSourceInfo sourceKind; eventData.InputSource.TryGetSourceKind( eventData.SourceId, out sourceKind); if (sourceKind == InteractionSourceInfo.Hand) { currentInputSource = eventData.InputSource; id = eventData.SourceId; Vector3 pos; currentInputSource.TryGetGripPosition(id, out pos); GameObject tmp = GameObject.Instantiate( original, pos, Quaternion.identity); obj = tmp; drag = true; Debug.Log("Down"); } }
  9. 線を一括削除する準備 public GameObject original; //テンプレートとなるCubeを保持 List<GameObject> lines = new List<GameObject>();

    public void OnInputDown(InputEventData eventData) { InteractionSourceInfo sourceKind; eventData.InputSource.TryGetSourceKind( eventData.SourceId, out sourceKind); if (sourceKind == InteractionSourceInfo.Hand) { currentInputSource = eventData.InputSource; id = eventData.SourceId; Vector3 pos; currentInputSource.TryGetGripPosition(id, out pos); GameObject tmp = GameObject.Instantiate( original, pos, Quaternion.identity); obj = tmp; lines.Add(tmp); drag = true; Debug.Log("Down"); } }
  10. 線を一括削除する関数を作成 void Update () { if (drag) { Vector3 pos;

    currentInputSource.TryGetPosition(id, out pos); obj.transform.position = pos; } } public void ResetLines() { for(int i = 0; i < lines.Count; i++) { Destroy(lines[i]); lines[i] = null; } lines.Clear(); }
  11. 音声入力で線を削除 ① Speechと入力 【Speech Input Source】 ▪Keywords +ボタン ▪Keyword reset

    ※認識させたい単語 ▪KeyShortCut R ※UnityEditor上で 仮想入力するため のKey ② Speech Input Source