CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Holographic Academyの解説とTips紹介「Hologram 211 - Gesture」

前回に引き続き、Holographic Academyについてです。前回まではこちらです。

Holographic Academyの解説とTips紹介「Hologram 101」 - CrossRoad

Holographic Academyの解説とTips紹介「Hologram 210 - Gaze」 - CrossRoad

今回はHologram 211 Gesture について解説します。

0 準備

Hologram101」が未完の場合、先にChapter3のGesturesだけでも確認することをお勧めします。

また、今回のサンプルプロジェクト「Model Explorer」はHologram 210とベースが同じですので、先に210を試していると理解が早まります。こちらもご参考ください。

Holographic Academyの解説とTips紹介「Hologram 210 - Gaze」 - CrossRoad

1 Unity Setup

まずは、「Holograms 211」を開き、プロジェクトをダウンロードします。

210のときと異なり、今回はunitypackageではなくUnityプロジェクトの形で提供されています。Unityで開いて、これまで通りにビルド、実機転送をすればOKです。

2 Chapter 1 - Hand detected feedback

これは、手を検出したことを示す機能です。まず、Hierarchy ViewのManagersオブジェクトにHandsManager.csを追加します。
ManagersオブジェクトにHandsManager.csを追加する手順

次に、CursorオブジェクトにCursorFeedback.csを追加します。

CursorオブジェクトにCursorFeedback.csを追加する手順

Cursor Feedbacコンポーネントには、2つのオブジェクトを追加します。

Cursor Feedbacコンポーネントに、2つのオブジェクトを追加する手順

残り二つはNoneになっていますが、この時点ではこのままで問題ありません。この後、Unityでビルドして、HoloLens実機で試すと、手を認識した時だけアイコンが変化します。

この例ではAstromanをGazeしている時だけです。動画の最後でAstromanからGazeしていない時に手を出していますが、これはカーソル変化していません。


3 Chapter 2 - Navigation

これは、Chapter1で示したGazeによるアイコン変化の後、AirTapのドラッグによりオブジェクトを回転させる機能を紹介しています。CursorオブジェクトのInspectorを開き、HoloToolkit\Input\PrefabsのScrollFeedbackをドラッグします。

ScrollFeedbackをCursorオブジェクトにドラッグする手順

AstromanのInspectorを開き、Scripts/GestureAction.csをドラッグします。

AstromanオブジェクトにGestureAction.csを追加する手順

次にnavigation イベントを扱うためにGestureManager.csを修正します。

完成版をgistに置きました。

ここでは、冒頭の

public GestureRecognizer NavigationRecognizer { get; private set; }

が肝です。これはHologram101のChapter3の紹介でも解説した、UnityEngine.VR.WSA.Inputの中にあるUnity標準APIです。

GestureRecognizerのインスタンスを生成し、下記のManipulationRecognizer_ManipulationStartedEvenによって、IsNavigatingのbool変数を変更しています。


gista1ff8d010e1957b24d38e6ff50853be3

このIsNavigatingがsingletonでGestureAction.csに活用されます。次に、GestureAction.csを編集します。ここではAirTapでAstromanを回転させる処理を書いています。

回転の処理はPerformRotationメソッドで実施します。8行目のif文で各変数がtrueのときに中の処理が実行されます。


gist064c05a6e436eda532ac99ef4a5346a9

この後、Unityでビルドして、HoloLens実機で試してみます。

AstromanをGazeすると、カーソルアイコンが表示されます。GestureAction.csの処理によってAstromanを左右に回転させることができます。

4 Chapter 3 - Hand Guidance

これは、ユーザーが意図と異なる方向のジェスチャをしたときに、正しい方向のフィードバックを示してくれる機能です。まず、ManagersオブジェクトにHand Guidance.csを追加します。

anagersオブジェクトにHand Guidance.csを追加する手順

HoloToolkit\Input\Prefabsフォルダから、HandGuidanceを追加します。

HoloToolkit\Input\PrefabsからHandGuidanceコンポーネントを追加

続いて、Cursorオブジェクトの子であるCursorBillboardを追加します。

CursorBillboardの追加手順

この後、Unityでビルドして、HoloLens実機で試してみます。

見づらいですが、左右ではなくわざと上に手を動かすと、下方向の矢印が表示されています。

5 Chapter 4 - Manipulation

これは、Gazeしたオブジェクトを指でつまむようにして動かす機能です。まず、Managersオブジェクトに、AstronautManager.csを追加します。

Managersオブジェクトに、AstronautManager.csを追加する手順

AstronautManageクラスでは、UnityEngine.Windows.Speechの機能を使って、音声認識の単語登録を行います。単語登録と、音声認識機能の「KeywordRecognizer」クラスの開始までは下記の通りです。


gistead4990d4c497494fdf9d0f4cb5ed540

Hologram101のChapter4ではLINQを使っていましたが、内容的には同じです。続いて、Cursor オブジェクトのInspectorに、PathingFeedback Prefabを追加します。

Cursor オブジェクトのInspectorに、PathingFeedback Prefabを追加する手順

さらにGestureAction.cs に、Manipulationの処理を追記します。この後、Unityでビルドして、HoloLens実機で試してみます。

音を入れてませんが、"Move"と発声することで、カーソルが左右矢印のものから、四方矢印に変化します。

サンプルコードでは、"Move Astronaut"と発声するように書いてありましたが、Cortanaで"Astronaut"を認識してくれなかったため、"Move"に変更しました。この状態でAirTapしたまま手を動かすと、オブジェクトを移動させることができます。

6 Chapter 5 - Model expansion

これは、音声で"Expand Model"、"Reset Model"と発声することでAstromanをバラバラに分解、あるいは分解前の状態に戻すデモです。手順はシンプルで、AstronautManager.csを指定通りに修正して、音声認識をできるようにし、対応する関数を追加するだけです。

チュートリアルには書いていませんでしたが、AstroManのInspectorにAstroMan_Expandedを追加しておく必要があります。

AstroManのInspectorにAstroMan_Expandedを追加する手順

AstroManをバラバラにするExpandModelCommandメソッドの処理を解説します。


gist07d94f49836e8325e2d359a9ae0441df

AstroMan オブジェクトには、ExpandModel.csがアタッチされています。まず、最初の

GameObject currentModel = ExpandModel.Instance.gameObject;

によって、AstroMan オブジェクトを取得し、次の三行でposition、rotation、localScaleを取得し、

currentModel.SetActive(false);

によって、これまでのAstroManを一旦非表示にします。次のExpandModel.Instance.ExpandedModel.SetActive(true);によって、バラバラになった場合のAstroManを表示し、同時に放射状に広がるアニメーションを再生します。

バラバラになるAstroManは、AstroMan_Expandedと入れ替え表示することで実現しています。

本来はHierarchy Viewには出さず、AstroManのInspectorでpublic Gameobjectの一つとして指定するだけなのですが、コンポーネントを見たかったので、Hierarchy Viewに出してみました。

f:id:Takyu:20180714222809j:plain

このように、AstroMan_Expandedの子であるAN_RIG_ExplodeX にアニメーション用のコンポーネントが付いています。Animator Controllerを見ると、開始とともに、astro_explode_anim_clipの状態に遷移するようになっており、ここで下記のexplode_clipが再生されます。

続いて、expandAnimationCompletionTimeによって、これからバラバラになる時のアニメーションの時間間隔を指定し、isModelExpandingをtrueに変更します。

Updateの中では、isModelExpandingをif文の基準の一つとし、trueであればforeachで、アニメーションを無効化します。"Reset Model"と発声すると、AstroMan_Expandedを非表示にして、元のAstroManの表示を戻します。

この後、Unityでビルドして、HoloLens実機で試してみます。


7. 終わりに

このチュートリアルで一番重要なのはManipulation(PCの場合、マウスのドラッグ操作相当)だと思います。Manipulationがあることで、これまでの視線方向で決定する以外に、空間に自在にオブジェクトを配置、移動できることになるからです。

ここまで調べて整理したことで、HoloLensアプリ開発の方法がだいぶわかってきました。引き続き、残りのAcademyについても調べたいと思います。