UnityでHoloLensアプリケーション開発Tips

随時更新

目次

HoloLensとは

HoloLensで何ができるの?

狭いって言われている視野角は実際どんな感じ?

どんな方面での利用を期待されているの?

HoloLensのゲームってどんな感じ?

Windows Holographicプラットフォームで未来の働き方はこうなる

複合現実 (MR) の幕開け -Windows Holographicをパートナーに公開
https://blogs.windows.com/japan/2016/06/01/opening-windows-holographic-to-partners-for-a-new-era-of-mixed-reality/

開発環境の構築

動作環境

Windows 10 Pro(HomeはHoloLensエミュの動作にHyper-Vが必須のため不可)

  • 4コアのCPU
  • メモリ8GB以上
  • BIOSがHAV、SLAT、DEPをサポート
  • GPUがDirectX 11以上、WDDM 1.2 driver以上サポート(エミュレーターの動作に関係)
  • システムでHyper-Vを有効にできる

>> Install the tools
https://developer.microsoft.com/en-us/windows/holographic/install_the_tools

上のページの指示に従い次の3つをセットアップ(バージョン番号は上記ページにならってください)

  • Visual Studio
  • Unity
  • HoloLens Emulator

また、HoloLensアプリ開発で必須のツールキットであるHoloToolkit-Unityが推奨するバージョンでもOK。個人的にはHoloLensまわりは頻繁にアップデートがかかるので、betapatchの最新をリリースノートを確認して使ってます。

詳細については次のサイトをご参照ください:)

>> HoloLensのエミュレータを起動し、Unityでアプリを作るまでの手順メモ – Cross Road
http://magicbullet.hatenablog.jp/entry/HoloLensEmulator

>> HoloLens Emulator エミュレータの準備と DEP6100 エラーの対処 – tech.guitarrapc.cóm
http://tech.guitarrapc.com/entry/2016/04/11/070745#環境準備

開発

HoloLensドキュメント

https://developer.microsoft.com/en-us/windows/holographic/documentation

HoloLensハードウェア詳細

https://developer.microsoft.com/en-us/windows/holographic/hardware_details

https://en.wikipedia.org/wiki/Microsoft_HoloLens

OSはWindows 10でこれ自体がスタンドアローンなコンピュータ。
バッテリーは2-3時間。スタンバイモードで2週間。充電しながら使える。
CPUはIntel 32bit、Custom-built Microsoft Holographic Processing Unit (HPU 1.0)というもので詳細は不明。
容量は64GBにメモリは2GB。
重さは579g。

インターフェース

  • 内臓スピーカー
  • 3.5mmイヤフォンジャック
  • ボリューム調整、輝度調整、電源ボタン
  • Wi-Fi 802.11ac
  • Micro USB 2.0
  • Bluetooth 4.1 LE

HoloLens Clicker

Bluetooth接続のHoloLens用コントローラ [URL]

ジェスチャー操作のうち、clickとscroll操作ができる。
bloom、resize、moveジェスチャーは行えない。
指に通して使う。Micro USB接続で充電可能。バッテリーは通常の使用で2週間持つ。

Bluetooth キーボード

US配列のBluetoothキーボード。おススメはもちろんMicrosoft Designer Bluetooth® DesktopかMicrosoft Universal Foldable Keyboard

Bluetoothのプロファイルは HIDとGATTに対応。オーディオやファイル転送には対応していない。

Bluetoothのプロファイル的にはマウスには対応しているものの、現在のシェルではサポートされていない(クリックとか、注視カーソル(Gaze Tracking)をマウスカーソルちっくに動かすような感じにはなっていないということっぽい) [URL]

>> bluetooth®各プロファイル説明 | 製品案内 | 株式会社プリンストン
http://www.princeton.co.jp/product/bluetooth_profile.html

センサ

  • 1 IMU(慣性測定ユニット、モーションセンサ)
  • 4 environment understanding cameras(位置推定に使う多視点の環境理解カメラ)
  • 1 depth camera(Depthカメラ)
  • 1 2MP photo / HD video camera(2メガピクセルのHD(720p) 1280×720のカメラ)
  • Mixed reality capture(視界をキャプチャしてホログラフィックと合成して出力するもの?)
  • 4 microphones(マイク)
  • 1 ambient light sensor(環境光センサ)

入力について

ユーザーからの入力として使用できるものとしては、向いている方向の中心を示す注視カーソルと、ハンドジェスチャー、音声入力、HoloLens Clickerからのクリックとスクロール操作、Bluetooth接続したキーボードでの文字入力が現状では使用できる。

  • Spatial sound(空間音響、3D音響)
  • Gaze tracking(視線追跡、向いている方向の中心を示す注視カーソル)
  • Gesture input(ハンドジェスチャー)
  • Voice support(音声入力)

注視カーソル

チュートリアル Chapter2 – Gaze

普通にUnityのPhysics.Raycastを使って、カメラの向きでRayを飛ばして取得。

ハンドジェスチャー

HoloLens前面のカメラのジェスチャーフレーム内にある手を認識。特定の手のポーズ、指の動きで入力ができる。
またHoloLens Clickerにより一部のクリックとスクロースの操作を行うことが可能。(ClickerはBluetooth接続なのでHoloLensのジェスチャーフレーム内になくてもOK)

>> Gestures
https://developer.microsoft.com/en-us/windows/holographic/gestures

ホログラフィックを選択、クリックする

手で認識されるポーズは、”the ready state” 準備完了状態(人差し指を上にして手の甲をHololensに向ける)と、”the pressed state” 押された状態(人差し指を曲げた状態)を認識。

注視カーソルで対象を選択して、ハンドジェスチャーで人差し指を曲げて選択はair-tap gesture

Image9

戻る操作

Androidアプリとかであるような戻る操作はBloom、咲く。
手のひらを上に向けてグーからパーに。花が咲くような感じのジェスチャー

Image10

ホログラフィックアプリで推奨されるハンドジェスチャーの実装について

https://developer.microsoft.com/pt-BR/windows/holographic/gestures#Gestures

Hold(ホールド)

Pressで長押し的な操作。

Manipulation(操作)

Pressでドラッグアンドドロップ的な操作。Pressしたまま手を動かして対象を移動したりスケールを変えて大きさを操作したり。

Navigation(ナビゲーション)

空間に浮かぶ操作パネルUI

>> Gesture design
https://developer.microsoft.com/en-us/windows/holographic/gesture_design

Unityでの実装方法

チュートリアル Chapter 3 – Gestures 

GestureRecognizer クラスを使う

>> Gestures in Unity
https://developer.microsoft.com/en-us/windows/holographic/gestures_in_unity

開発リソース

Holographicアプリ開発Unityパフォーマンスガイド

https://developer.microsoft.com/en-us/windows/holographic/performance_recommendations_for_unity

快適さや消費電力を抑えるためにFPS60。たとえ下回ったところでVRHMDのように酔うことはないが重要。

以下適当に抜粋

具体的な設定としてQuality SettingsでFastestを設定。合わせてPlayer SettingsでShader関係の設定。

実装ではGCを抑える。LINQやラムダ、foreachを避けて構造体やフラットな1次配列を使う。

表現上Idleアニメーションは負荷が高いため避ける。

スタートアップパフォーマンス

Unityで実装する際は最初に表示する軽いシーンを用意して、本体のシーンをSceneManager.LoadSceneAsyncでロードする。

 

HoloLensアプリケーション開発のチュートリアル

Holograms 100 UnityでHoloLensのホログラフィックアプリを作る超基本編

https://developer.microsoft.com/en-us/windows/holographic/holograms_100

0からUnityでホログラフィックアプリを作るチュートリアル。UnityでのProject Settingsの各種設定、シーンにカメラとキューブを配置した簡単なものをVisual Studioへエクスポート。実機へのWi-FiやUSBでのデプロイ手順、エミュレーターで実行するまでの一通りの手順についての説明。

Holograms 101 UnityでHoloLensのホログラフィックアプリを作る基本的な入力を使ってみよう編

用意されたOrigamiサンプルプロジェクトに手を入れていくStep by Stepチュートリアル。
Chapter1ではシーンへカメラや用意された3Dモデルオブジェクトのプレハブを配置し、Visual Studioへ転送して確認して、一通りのHolographicアプリ開発の流れがわかる。
Chapter2では向いた方向に注視カーソルが表示されるGaze trackingの使い方。Chapter3はGesture(ハンドジェスチャー)。Chapter4はVoice(音声入力)、Chapter5はSpatial sound(空間音響)、Chapter6はSpatial mapping(空間マッピング)

エミュレーターで動かす方はこちら
https://developer.microsoft.com/en-us/windows/holographic/holograms_101e

実機で動かす方はこちら
https://developer.microsoft.com/en-us/windows/holographic/holograms_101

Holograms 210 視線入力の発展

https://developer.microsoft.com/en-us/windows/holographic/holograms_210

Holograms 211 Gestures(ジェスチャー)

https://developer.microsoft.com/en-us/windows/holographic/holograms_211

Air-TapのPressedのみのサンプル

Holograms 212 Voice input(音声入力)

https://developer.microsoft.com/en-us/windows/holographic/holograms_212

Holograms 220 Spatial sound(空間音響)

https://developer.microsoft.com/en-us/windows/holographic/holograms_220

Holograms 230 Spatial mapping(空間マッピング)

https://developer.microsoft.com/en-us/windows/holographic/holograms_230

Unityでholographicアプリ作成の基本設定

>> Holograms 100
https://developer.microsoft.com/en-us/windows/holographic/holograms_100

Unityのプロジェクトを3Dで作る

Main Cameraの設定を変更する

  • Position Reset
  • Clear FlagsSkyboxからSolid Color
  • Background真っ黒(RGBA 0,0,0,0)
  • Clipping PlanesのNear0.3から0.85へ(カメラから30cm→85cmの距離のオブジェクトは描画しない)

ちなみにClipping PlanesのNearを0.01に変えると近づいてもオブジェクトが消えなくなります。が、HoloLensの視野角やトラッキング性能から、人が快適と感じる距離を外れるので、ここを変える場合はアプリのデザインを変えるなどをまずは検討しましょう。

ちなみにホログラムのオブジェクトは2メートルの距離に置くのが一番快適で、1.25mから5mの範囲が最適と紹介されています。URL

2016-05-14_01h10_10

Build SettingsPlatformWindows Storeへ切り替える

  • SDKUniversal10
  • UWP Build TypeD3D
  • Unity C# ProjectsON

Player SettingsVirtual Reality SupportedWindows Holographic SDKを追加

2016-05-14_01h06_53

(オプション) 適宜アプリから使用を許可する機能を選択。ミュージックライブラリとか写真・動画フォルダとか、WebカメラとかBluetoothとか

2016-05-14_01h07_48

Holographicアプリでパフォーマンスを稼ぐために必須な設定

Quality SettingsでWindows StoreアプリをリアルタイムなライトOFF、影OFF、アンチエイリアスOFFな徹底的に簡易表示化するFastest設定をデフォルトにする。
+αで、Fastest以外を削除するのが何かプロジェクトがバグった際に問題が起こりにくくオススメ。

ちなみにFastestだとモデルデータが1 Boneとなるため、モーションが崩れる場合がある。適宜その部分だけ戻す等行いましょう。

2016-05-14_01h11_15

Visual Studioのソリューションをエクスポート

Buildを押してプロジェクトルートにAppフォルダを作ってフォルダを選択

エクスポートが終わったらAppフォルダが開くので、プロジェクト名.slnを叩いてVS起動

ちなみにUnityプロジェクトルートの.slnではない。出力時に指定したAppフォルダ直下の.sln。間違えてUnityプロジェクトのslnを開くと、Package.appxmanifestが見当たらないし、Visual Studio上でHoloLensシミュレーターが選べない。

アプリをWindows.Holographicにターゲット設定する

Package.appxmanifestを開いて

  • TargetDeviceFamily を Windows.Universal からWindows.Holographic 

※もしPackage.appxmanifestが見当たらない場合は、誤ってUnityプロジェクトのソリューションファイル(sln)を開いているので、先ほどの手順でAppフォルダ以下にエクスポートしたVisual Studioのソリューションファイルを開く。

 

エミュレーターで実行して確認する

ビルドターゲット設定を、Release、x86、HoloLens Emulatorを選択して実行

Retry

2016-05-14_02h10_20

しばらく待っているとHoloLensエミュレーターが起動。

またしばらくすると先ほど実行したUnityのプロジェクトが自動的に起動

HoloLens EmulatorのHelpについてはこちら[URL]

  • WASDかXboxコントローラーの左スティックで前後左右のFPS移動
  • マウスドラッグか矢印キー、またはXboxコントローラーの右スティックで向き変更
  • Air-tapジェスチャーは右クリックかEnterかXboxコントローラーのAボタン
  • BloomジェスチャーはWindowsキーかF2キーかXboxコントローラーのBボタン
  • 掴んで移動とかスクロールは、Altキーか右クリック押しっぱなしで上下ドラッグ。XboxコントローラーではAボタン押しっぱなし

 

実行時に自前の空間マッピングデータ(spatial mapping)を使う

自前のルームキャプチャデータはWindows Device Portalからアップロードして使用することができる。

音声認識結果のテキストを使う

>> How do I record speech and display it as text please? — Hololens Developer Community
http://forums.hololens.com/discussion/1187/how-do-i-record-speech-and-display-it-as-text-please

英語のみ。将来HoloLensに搭載されているWindows10に日本語が入れば日本語も行けるかもしれない。

>> Holograms 212
https://developer.microsoft.com/en-us/windows/holographic/holograms_212#chapter_3_-_understanding

MicrophoneManager.csのDictationRecognizer_DictationHypothesis(string text)

HoloLensアプリをデバッグする方法

>> How to debug HoloLens apps? — Hololens Developer Community
http://forums.hololens.com/discussion/1418/how-to-debug-hololens-apps

1. Visual Studioでいつも通り release/x86/Emulatorを選択(実機はOS build 10.0.14342.1016ではダメっぽい)

2. マイコードのみを有効にする のチェックをOFF

2016-07-09_21h23_08

3. デバッガーの種類で混合を選ぶ(Universal Windowsのプロジェクトのプロパティから)

4. デバッグの開始

uGUIをGazeとAir-TapやNavigation Gestureで使う

Gazeで選択してAir-Tapクリック、スライダーをNavigation Gestureでドラッグもできる。

>> Unity UI on the HoloLens – Unity3d Community
https://community.unity.com/t5/Hololens/Unity-UI-on-the-HoloLens/td-p/2597979

1.  シーンにあるEventSystemオブジェクトにHoloLensInputModuleをアタッチ(HoloTookit-Unity)
※シーンにUIを配置しておらず、EventSystemゲームオブジェクトがない場合はあらかじめ適当にボタンやトグルやスライダーなど置いておく。

2016-07-09_22h51_19

2. Canvasを選び、Render ModeをWorld Spaceへ、Event CameraにMain Cameraを設定。

2016-07-09_22h52_23

3. このままではGUIが超デカいのでスケールを調整する。

  • 文字くっきりのためにCanvas ScalerのDynamic Pixels Per Unitを10へ
  • CanvasのRect Transformを上のSSのようにPos XYを0にしたりZをToggleやSlider、Buttonのサイズに合わせて3-5に設定(ボタンとかは適宜小さく。1/32(0.03125)や1/16(0.0625)とあるけど0.02にしている)

4. HoloToolkitからカーソルのPrefabを突っ込むとGood

HoloLens向けに3Dモデルデータを最適化するUnityの設定

>> Adding 3d models of Jet Engine and other complex stuff degrades hololens Performance. — Hololens Developer Community
http://forums.hololens.com/discussion/1372/adding-3d-models-of-jet-engine-and-other-complex-stuff-degrades-hololens-performance

Unityのプロジェクト設定

Player Settings: 16-bit Depth Buffersの使用

Quality Settings: Fastest

3Dモデルについて

HoloLens向けに最適化された、HoloToolkitのshaderを利用

その他最適化について

>> Performance recommendations
https://developer.microsoft.com/en-us/windows/holographic/performance_recommendations

>> Performance recommendations for Unity
https://developer.microsoft.com/en-us/windows/holographic/performance_recommendations_for_unity

最適化事例

3:45、40万ポリゴンから4000に最適化

>> BONUS: Designing for Spatial Variation | //build Canada: LIVE from Toronto | Channel 9 https://channel9.msdn.com/events/Build/Build-Tour-2016-Toronto/Designing-for-Spatial-Variation

ポリゴンを最適化するUnityのアセット

Simplygon by Simplygon http://u3d.as/5hD #unity3d

またはUnite2016でも紹介したKrabl Mesh Processorsもおすすめ

VRは寿司 Krabl Mesh Processors #アセットアドカレ

Windows Device Portal

Wi-FiやUSBで接続したHoloLensの実機やエミュレータのWebブラウザでアクセスできる管理ツール。
各種設定やログ、パフォーマンスモニタ、Virtual Inputを行うコンソールなどが用意されている。

>> Using the Windows Device Portal
https://developer.microsoft.com/en-us/windows/holographic/using_the_windows_device_portal

また、Windows Device PortalのWeb画面で操作できる内容についてはRESTのAPIが用意されている。

>> Device portal API reference
https://developer.microsoft.com/en-us/windows/holographic/device_portal_api_reference

Device Portalへのアクセス方法

>> Using the Windows Device Portal
https://developer.microsoft.com/en-us/windows/holographic/using_the_windows_device_portal

USB接続

PCとHoloLensを接続して、http://127.0.0.1:10080 に接続する

Wi-Fi接続

同一ネットワーク内にあるPCから、HoloLensのSettings > Network & Internet > Wi-Fi > Advanced Options にある http://HoloLensのローカルIP を指定して接続

 

Unity向けのHolographicアプリ用のホロツールキット HoloToolkit

>> Microsoft/HoloToolkit-Unity: This is effectively part of the existing HoloToolkit, but is the repo that will contain all Unity specific components.
https://github.com/Microsoft/HoloToolkit-Unity/

>> HoloToolkitのWiki
https://github.com/Microsoft/HoloToolkit-Unity/wiki

ツールキットが持つ機能は次の通り

  • 入力
    視線(Gaze Tracking)とジェスチャーと音声
  • シェアリング
    ネットワークマルチプレイ機能
  • 空間マッピング(SpatialMapping)
    PlaneFindingアドオン 空間マッピングによって返されたメッシュデータの面を使用できる。
  • 空間音響
  • ユーティリティ

コミュニティで選出されたアイデアから作られたUnity製オープンソースのHoloLensアプリケーション

>> GitHub – Microsoft/GalaxyExplorer: Galaxy Explorer is the application Microsoft is building as part of the Share Your Idea campaign.
https://github.com/Microsoft/GalaxyExplorer

ついてくるGUI

MainSceneのIntroductionFlow/Slateにアタッチされている

GalaxyExplorer\Assets\HoloToolkit\Utilities\Tagalong.cs で追従

GalaxyExplorer\Assets\Scripts\Utilities\FaceCamera.cs でLookAt

CoreSystemシーンのVolumeにアタッチされているTightTagalong.csでも可能

GalaxyExplorer\Assets\Scripts\Utilities\TightTagalong.cs

 

Snippet集

Navigation(Drag) Gestureで対象を掴んで移動

肝はInteractionSourceState の state.properties.location.TryGetPosition(out handPosition)

gist

使い方は、適当なオブジェクトを作り、HandMove.csをアタッチ。

これで注視カーソルに当たったオブジェクトをドラッグして操作できるようになる。(HandMove.csのTargetLayerMaskで指定したレイヤーと同じレイヤーに属するオブジェクト)

また、デバッグ用にいろいろ確認したい場合は下の絵のようにゲームオブジェクトを置いてTransformやらを合わせる。

合わせ技で、HoloTookit-Unityに含まれるCursorWithFeedbackプレハブを突っ込むと注視カーソルの表示と、手が認識されているかどうかがわかってGood

あと、注視カーソルのHold状態の可視化や、掴みながら首を左右方向に回転した時の移動量が足りてないので、Cameraの方向を見る、TransformDirectionで良しなにやってあげるとよさそう。

ちなみにSpatialMappingが生成するメッシュのLayer32はPhysicsManager.LayerCollisionMatrixの設定にもでない、すべてに衝突判定がでるレイヤーが設定されているので、Physics.RaycastのlayerMask設定を無視するため、(((1<<hitInfo.collider.gameObject.layer) & targetLayerMask) != 0)の判定ではじいている。

開発に便利なDebug用コード

Unity上だけである程度デバッグできるようになるスクリプト。

シーンの再生でゲームビューのカメラを、シーンビューと似た感じで操作することができるようになる。
このスクリプトをMain Cameraにアタッチすることで、注視カーソルの操作がUnityのシーン再生で賄えるため、何か変更して確認するたびに、UnityでプロジェクトをエクスポートしてVisual Studioでプロジェクト再読み込み、ビルドしてHoloLens Emulator上で動作確認をしなくても良くなる。(注視カーソル関係のみの場合)

gist

または\HoloToolkit\Utilities\Scripts\ManualCameraControl.csを使う。

謝辞

HoloLens体験の機会を頂いた中村薫さん@kaorun55に特大の感謝を!

合わせて読みたい

HoloLensまとめ – Natural Software
http://www.naturalsoftware.jp/entry/2016/05/14/183430

 

最新情報や小ネタはTwitterで配信中 @yuujii