ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

HoloLens の空間音響を使う

HoloLensは左右にスピーカーがついており、耳元で音をだすことができます。

ソフトウェア的にも空間音響をサポートしており、カメラ(HoloLens)の位置に対して音源(GameObject)から音が出ているように聞こえます。

例えば、音源が右にあるときは右のスピーカーから、左にあるときは左のスピーカーからという感じです。

空間音響を使う

空間音響は、音源となるGameObjectにAndioSourceを追加し、設定を少しいじるだけです。AndioSourceの設定もスクリプトにしたので、コードなしで立体音響になります。

まず、カメラの周辺にGameObjectを配置し音を鳴らします。

f:id:kaorun55:20160623125527p:plain

それぞれのGameObjcetにAudioSourceを追加し、音声データを設定、「Play On Awake」のチェックを外します。

あと空間音響の設定用にSpatialSoundスクリプトを張り付けています。

f:id:kaorun55:20160623125511p:plain

SpatialSoundスクリプトはこんな感じで、AudioSourceのspatialize、spatialBlendを設定しているだけです。これだけで空間音響になります。

gistecc4c53bdeca5381e41dacf1bc7489c7

HoloLens の音声コマンドを使う

HoloLensには単語の音声認識機能があり、登録した単語を「英語で」発音すると、それを認識します。認識をトリガーにして処理を行うことで音声コマンドを実装できます。

サンプルの実行風景です。英語がアレなので、ちゃんと認識してくれませんが、こんな感じになります。英語の発音の学習には最適かもしれません。。。


HoloLens Voice Command Demo

プロジェクト全体はこちらにあります。

github.com

例によってHoloToolkitを追加します。導入方法についてはこちら。

www.naturalsoftware.jp

音声認識の方法

音声認識はKeywordRecognizerクラスで行います。これはUnityEngine.Windows.Speech名前空間にあります。

KeywordRecognizerに認識させたい単語を登録すると、それを認識したタイミングでイベントが発生します。そのイベントで関連付けた処理を実行すると音声コマンドになります。

Holograms 101を参考に、音声認識した結果によってSendMessageまたはBroadcastするコマンドを実装してみます。

SendMessageは音声認識した際に注視しているGameObjectにSendMessageを発行します。AirTap相当です。

Broadcastは該当GameObjectの子オブジェクトに対してメッセージを発行します。

Holograms 101ではコードで登録していますが、今回はInspectorビューから設定でききるようにしています。コマンドとメソッド名を設定し、コマンドの単語を認識したらメソッド名をSendMessageまたはBroadcastします。

f:id:kaorun55:20160622175634p:plain

Broadcastは子オブジェクトに対して発行するので、空のGameObjectをVoiceCommandとして、Cubeをその下に配置します。VoiceCommandにVoiceCommandManagerスクリプトを貼り付け、認識させたいコマンドと発行するメソッド名を設定します。スクリプトは次のようになっています。

HoloToolkitには音声認識後にイベント(UnityEvent)を発行する仕組みでの実装があります。

gist618a0c184be6f105ab518902afa927cc

音声認識後の処理

次はコマンドを受けた側です。メソッド名に設定した名称のメソッドを作成します。そこにコマンド処理を実行します。

gistc08017e37ad186a415fa2841e93fc25b

 

これで音声で色を変え、ブロードキャストで色を戻す処理ができました。

 

HoloLens の視線カーソル(Gaze)とAirTap(Gesture)を使う

HoloLens の視線カーソル(Gaze)とAirTap(Gesture)を使ってみます。

HoloLensの選択処理は現状これしかないので、なんらかのアプリを作る上では必須の機能となるでしょう。

プロジェクト全体はこちらにあります。

github.com

視線カーソルの種類

今回はHoloToolkitを使用します。HoloToolkitの視線カーソルにはいくつかあり、通常のカーソルや手の検出を見せるカーソルなどがあります。アプリによって使い分ければよいでしょう。

通常のカーソル

f:id:kaorun55:20160622173424p:plain

手の検出を示すカーソル

f:id:kaorun55:20160622173422p:plain

 

視線カーソル(Gaze)とAirTap(Gesture)の追加

HoloToolkitを追加します。導入方法についてはこちら。

www.naturalsoftware.jp

オブジェクトの配置

Hierarchyビューにあるものを削除して、UtilityのMain Camera Prefab、InputにあるCursor Prefab(通常のカーソル)、Cubeを二つ配置します。GestureManagerについては後述します。

f:id:kaorun55:20160622172539p:plain

Cubeはこのように配置します。

f:id:kaorun55:20160622172600p:plain

Transformの値はこんな感じで。もう片方はPositionのXが0.3になってます。

f:id:kaorun55:20160622172634p:plain

GestureManager

GestureManagerは空のGameObjectを追加し、InputのScriptsにある「GazeManager」、「GestureManager」、「HandsManager」を追加しています。

カーソルの使い分けでHandsManager」を入れていますが、Cursor Prefabであれば「GazeManager」と「GestureManager」だけで動作します。

f:id:kaorun55:20160622172913p:plain

以上で視線カーソルとジェスチャーの実装は完了です。この状態で実行すると、Cubeに当たるとドーナツ型になるカーソルができあがります。

クリックされた時の処理を実装する

クリックを検出したら、そのときの視線の先にあるGameObjectに対して「OnSelect」メッセージが発行されます。GameObjectにOnSelectメソッドが実装されているスクリプトを貼り付けます。

例えば今回はAirTapごとに色を変える実装の「CubeCommand」をCubeに貼り付けています。

f:id:kaorun55:20160622173652p:plain

スクリプトの実装は次の通りです。

gist6ef1b1e5fbd40407c8cb9e7683e1a7bb

これでAirTapごとに色が変わるようになります。


HoloLens AirTap Demo1

カーソルを「CursorWithFeedback」に変更すると、手を検出するとモデルが変わるカーソルになります。


HoloLens AirTap Demo2

HoloToolkit-Unity を使う

UntiyでHoloLensアプリを開発する場合、カメラ位置の変更や各機能の追加など、アプリ開発に入る前に結構やることがあります。

Academyに入っているPrefabを使ってもよいのですが「HoloToolkit-Unity」というツールキットがかなりよいので紹介します。

github.com

使い方

上記リポジトリはcloneなりダウンロードなりで手元に持ってきます。

Unityで新しいプロジェクトを作成します。

「HoloToolkit-Unity\Assets」にあるものすべてをProjectビューにコピーします(ここではGitHubからZIPでダウンロードしたのでmasterがついています)。拡張子がrspとmetaのものも入れてください。これらがない場合、コンパイルエラーになります。

f:id:kaorun55:20160622165143p:plain

HoloToolkitフォルダ以下に機能ごとのフォルダがあります。

  • CrossPlatform:内部で使用するクラスに関するもの
  • Input:視線、ジェスチャー、音声コマンドといった入力に関するもの
  • Sharing:共有に関するもの
  • SpatialMapping:空間マッピングに関するもの
  • SpatialSound:空間音響に関するもの
  • Utilities:カメラなどのユーティリティ

f:id:kaorun55:20160622165627p:plain

例えば、Hierarchyのものをすべて削除して、UtilityにあるMain Camera PrefabとSptialMappingにあるSptialMapping Prefabを配置します。Build SettingsからVR SupportとSptial Mappingの設定をすれば、空間マッピングをワイヤーフレームで表示してくれるアプリができあがります。

f:id:kaorun55:20160622165611p:plain

ほかにもジェスチャーもPrefabを配置するだけで、その機能を使えるようになります。

HoloLensアプリで共通で必要な機能についてはおおよそ網羅されているので、かなり便利に使えます。

プロジェクト設定

Utilities\Editorの下にプロジェクト設定に関するスクリプトがあります。

f:id:kaorun55:20160623103135p:plain

HoloToolkit-Unityを追加すると、Unityのメニューに「HoloToolkit」が追加されます。

f:id:kaorun55:20160623103244p:plain

この中ではScene Settings(シーン設定:カメラの設定)、Project Settings(プロジェクト設定:VRモードやクオリティ設定、UWP出力の設定)、共有サーバーの起動などがあります。

Scene Settingsを実行するとカメラ設定がHoloLens用に変更されます。

f:id:kaorun55:20160623103428p:plain

Project Settingsでは、出力設定やVRモードのチェックなどを行ってくれます。

f:id:kaorun55:20160623103525p:plain

シーンの追加やCapabilityの設定は別途必要ですが、最初の忘れやすい設定を自動で行ってくれるので、非常に助かります。

 動画とってみました


Introduction to HoloLens developed in Unity

 

「I/O 2016年 07 月号」にHoloLensの記事を書きました

 

3ページでざっと概要を書いています。

IO 2016年 07 月号 [雑誌]

IO 2016年 07 月号 [雑誌]

 

初音さんの記事も昨日公開されていました。少しずつHoloLensの記事が出てきましたね。

www.buildinsider.net

HoloLensが認識した空間から、床や壁、天井などの平面を検出する

f:id:kaorun55:20160614103748j:plain

HoloLensのToolkitに、HoloLensが認識した空間を元に平面を検出する機能があります。

上の画像は部屋の隅をキャプチャしたものです。壁2枚と天井を検出しています。

動きは次の動画を見てください。平面検出によって、床、壁、天井、テーブルの検出ができます(手持ちのテーブルは小さいためか、検出できませんでした)。平面および種別床や壁など)はそれぞれアプリで取り出すことができ、壁を使ったアプリケーションに応用できます。

HoloLensが認識した空間から、床や壁、天井などの平面を検出する

平面検出のコードはこちらにあります。C++/CXでビルドされていますが、コード自体はほぼ普通のC++です。

github.com

PlaneFinding

最初に平面検出を試す際は、AcademyのHolograms 230を動かすとよいです。

動画のサンプルプロジェクトはこちらに置いてあります。

このサンプルプロジェクトは、Holograms 230からいくつかのスクリプト、マテリアル、シェーダーを持ってきています。 HoloToolkit-Unity にある平面検出のスクリプトと合わせて「SurfaceMeshesToPlanesプレファブ」を作りました。「SurfaceMeshesToPlanesフォルダ」以下にまとめてあるので、これを別プロジェクトにコピーすればOKです。先の動画のサンプルは、このSurfaceMeshesToPlanesプレファブ」と、HoloToolkit-Unityに入っている「SpatialMappingプレファブ」をシーンに置いただけです。特にコードなどは必要ありません(Player SettingsでSpatialPerceptionにチェックするのを忘れずに)

f:id:kaorun55:20160614105133p:plain

平面検出後の処理

PlaySpaceManagerスクリプトにSurfaceMeshesToPlanes_MakePlanesComplete()があり、平面を検出するとこのメソッドが呼ばれます。これはもともとHolograms 230にあったもので、壁や床に対する処理の例が載っていますので参考にできるでしょう。

これを使うとRoboRaidのような壁から敵が出てくるようなゲームの開発が可能となります。


Microsoft HoloLens: RoboRaid

プロジェクト内で使用しているHoloToolkitについてはこちら

www.naturalsoftware.jp

「Intel RealSense SDK 2016 R2」がリリースされています

「Intel RealSense SDK 2016 R2」がリリースされています

SDKバージョンは10になりました。前回8だったので9はスキップでしょうか。

今回はAPIの追加変更だけのようです。これまでが新しいデバイス対応、新しい環境対応があったので、落ち着いた感じがします。

とはいえ、Person Tracking、EnhancedPhoto、ScenePerception、3DScanあたりの更新が目立つので、環境センシング、スキャンが強化されそうな感じです。

 

Person Trackingについてはこちらが詳しいです。

www.systemfriend.co.jp