HoloLens用のHello Worldの作成

Zengaltの HoloLens LeadであるGleb Zakharovがブログ用に特別に用意したユニークな資料を急いで共有します。MicrosoftHoloLens用のアプリケーションを開発し、エミュレータで起動するための段階的な手順です。 この記事では、デバイス自体の概要を確認し、アプリケーションの種類について学習します。




HoloLensは、スキーグラスに似たデバイスの形式のWindows 10 PC(2GB RAM、64GB SSD、x86 CPU、GPU、HPU、BT、WiFi、 仕様はここにあります )です。 メガネを通して周囲のすべてを見ることができますが、写真は少し暗くなります。



Habrは、会議// Buildでこのデバイスの概要を既に持っていました。 この記事では、HoloLens用のアプリケーションを作成し、エミュレーターで実行することをお勧めします。



デバイスの概要



バイザーには2つの透明なスクリーンが組み込まれています-各目の前に1つあります。 いくつかのカメラは前方と側面を向いており、2つの小さなスピーカーが耳の上にあり、その音が環境の音に重畳されています。



写真は立体視です。 したがって、焦点距離について考える必要があります。 たとえば、最初は30センチの焦点距離を使用してデバッグテキストを印刷しました。 彼の目が痛い。 Bluetoothを介して接続できますが、キーボードとマウスはありません。 デバイスを制御する主な方法は、頭を回しながら移動するカーソル(「注視」)と、ピンチのように見えるジェスチャーで、通常のタップ(「エアタップ」)を置き換えます。 音声制御はうまく機能します。 ただし、これまでのところ英語のみが利用可能です。



デバイスはカメラを使用して周囲の空間をスキャンし、3Dモデルに変換します。Unity(デバイスの開発には特別なバージョンが使用されます)またはWindows APIから直接アクセスできます。 この機能の最も一般的な使用法の1つは、床を検索し、そこにホログラムをインストールすることです。







将来的には、そのようなデバイスは、画面と音声を備えたすべてのものに取って代わります。 現実の世界を見たり聞いたりする方法をリアルタイムで編集できると想像してください。 たとえば、隣人はあなたが好きではない音楽を再生します。 あなたはそれを取り除くか、好きなものに置き換えることができます。 ドリルを使わずに、好きなだけポスターやホワイトボードを掛けることができます。 1つのジェスチャーで(仮想)テレビを再配置します。 スマートフォン、テレビ、看板、道路標識、電球、家電製品のディスプレイ-これらはすべて、HoloLensのようなデバイスがスマートフォンと同じくらい高価になり、普通のメガネのように見えるとすぐに過去のものになります。 これらは最も明白な例に過ぎず、変更はよりグローバルになると確信しています。 たとえば、将来は次のようになります(希望しない)。







つまり、このテクノロジーは、純粋なVRとは異なり、あらゆるものの次のプラットフォームです。



銀行、石油産業、教育、エンジニアリング、建築家からの溶剤需要が既にあるため、HoloLensの開発を今すぐ開始するのは理にかなっています。 そして、あなたは最初になるチャンスがあります。 デバイスは、予想よりはるかに早く利用可能になりつつあります。 数か月前、それらはまれでしたが、今では誰もが米国Microsoft Storeで5個を注文できます。







HoloLensはWindows 10で実行されるため、そのアプリケーションはユニバーサルWindowsプラットフォーム(UWP)で開発されます。 これは、モバイルデバイス、デスクトップ、およびUWPベースのXbox用に以前に開発されたアプリケーションをHoloLensで起動できることを意味します。







HoloLensアプリケーションの種類



開発者ツールキットは、作成するアプリケーションのタイプに大きく依存しています。 現在、HoloLensアプリケーションは、2Dビューとホログラフィックビューの2種類のビューをサポートしています。



2Dビューは、シェルHoloLens内のプレートの形で通常の2Dコンテンツを表示します。 (上のスクリーンショットを参照)同時に、多くのアプリケーションを2Dビューでレンダリングできるため、メール、ブラウザー、スカイプを同時に実行して自分の周りのワークスペースを整理することは難しくありません。



ホログラフィックビュー-このモードでは、アプリケーションは周囲にホログラムを作成できます。 同時に、他のアプリケーションとシェルOSのホログラムは表示されず、システム通知はCortanaを使用して音声で発音されます。





Land of Dinosaursは、HoloLensストアでの最初のアプリです。



2つのタイプを切り替えることができます。 1つのアプリケーションで複数のビューを組み合わせる一般的なシナリオの1つは、オンスクリーンキーボードを使用して入力フィールドにテキストを入力するためのホログラフィックビューから2Dビューへ​​の移行です。



2Dビューを開発するための主なツールは、Visual Studioと、XAMLおよび/またはDirectXを備えたUWP APIです。 ホログラフィックビューの開発には、Visual StudioとDirectXまたはUnity3Dを使用した開発の2つのアプローチを使用することが提案されています。

この記事では、Unity3Dで1つのホログラフィックビューを持つアプリケーションを作成することを検討します。



ステップ0:ツールをインストールする



システム要件







お使いのPCがこれらの要件を満たし、テストにHoloLens Emulatorを使用する予定がある場合は、BIOSで上記の設定を有効にする必要があります。

その後、WindowsコントロールパネルでHyper-Vサポートを有効にする必要があります。 これを行うには、[コントロールパネル]-> [プログラム]-> [プログラムと機能]-> [Windowsの機能の有効化または無効化]に移動します。 Hyper-Vセクションを見つけて選択します。 インストールが完了したら、再起動します。



ツール







アプリケーションのアセンブリ中のエラーを回避するために、指定された順序でツールを順番にインストールすることをお勧めします。



ステップ1:プロジェクトを作成する



作業に必要なものがすべて揃ったので、hello worldアプリケーションの作成を始めましょう。 Unity Hololens Technical Preview(HTP)を起動し、空のプロジェクトを作成します。 ディスク上の名前と場所を選択します。 プロジェクトタイプとして、[3D]を選択し、[ プロジェクトの作成 ]をクリックします







メインカメラのセットアップ



プロジェクトを作成した後、Unityはカメラと光源で空のシーンを作成し、自動的に開きます。 次のパネルに注意してください。



  1. シーン-3Dの世界に配置する要素。 今では光源とカメラのみです。
  2. ゲームモードのゲームビューアプリケーション
  3. 階層にはシーンのすべての要素が含まれます
  4. インスペクターには、選択したアイテムのプロパティが表示されます。
  5. 現在のプロジェクトに追加されたすべての再実行ファイルを投影します。


カメラをセットアップすることから始めましょう。 ホログラフィックビューモードでは、メインカメラは人間の目の間の位置です。 したがって、デフォルトのオフセット(0,0,0)をリセットします。 アプリケーションがエミュレーターまたはデバイスで実行されている間のカメラの位置と回転は、ユーザーの頭の位置と傾きに応じて変化します。







必要に応じてタブのレイアウトを調整できます。



HoloLensを使用すると、実世界で3Dオブジェクトを投影できます。 これを行うには、カメラの背景が透明である必要があります。 設定するには、カメラのフラグクリア値を無地に設定します背景を[0,0,0,0]または#00000000に設定した後。 Unityでデバイスのより正確なシミュレーションを行うには、カメラの視野を16〜20に設定します。



ステップ2:3Dオブジェクトをシーンに追加する



この記事では、 Hello worldの 3Dモデルを準備しました .fbxモデルファイルをダウンロードして、プロジェクトのAssetsフォルダーに追加します。 または、ファイルをプロジェクトパネルのアセット領域にドラッグします。 モデルを正常にインポートした後、シーンに追加します。



これを行うには、HelloWorldモデルを[プロジェクト]パネルから[階層]ウィンドウにドラッグします。 位置をZ = 3に設定し、碑文を180に回転して、デフォルトでカメラを覗くようにします。 元のモデルは非常に大きいため、 Scaleを0.25に設定し、任意の名前でシーンを保存して、少し縮小してみましょう。







HoloToolkitの紹介



Microsoftとコミュニティは、HoloLensでのアプリケーション開発を加速するための一連のコンポーネントを開発しました。



現在、 githubリポジトリには、APIを操作するコンポーネントと例が含まれています。





HoloToolkitをプロジェクトにインポートして、いくつかのコンポーネントを見てみましょう。 これを行うには、HoloToolkitリポジトリをディスクにクローンし、Unityで開きます。 [ プロジェクト ]パネルの[ アセット ]ルートフォルダーのコンテキストメニューで、[ パッケージのエクスポート ]を選択します。 エクスポートするファイルのリストがロードされるのを待ち、「エクスポート」をクリックして、パッケージを保存するパスを指定します。







エクスポートが完了したら、 Assetsルートフォルダーのコンテキストメニューを呼び出して、このパッケージをプロジェクトにインポートします。 [ パッケージのインポート]-> [カスタムパッケージ]を選択します。



完了すると、HoloToolkitのアセットがプロジェクトに追加されます。 Unityメニューに新しいメニューグループが表示されます。これにより、プロジェクトの一般設定をすばやく適用し、すばやく展開できます。 記事の一部として、トレーニングの目的でこれらのオプションを使用しません。



HoloToolkitをプロジェクトにインポートするための詳細な設定は、githubのプロジェクトwikiにあります: HoloToolkit入門



Unityでデバッグするためのコンポーネントを追加する



まず、Unityエディターでカメラコントロールを追加しましょう。 階層パネルでカメラオブジェクトを選択します。 Inspectorパネルで、 Add Componentをクリックし、開いたウィンドウでManualと入力します。 リストから手動カメラ制御コンポーネントを選択します。 次に、Ctrlキーを押しながらPキーを押すか、上部のバーにある[再生]ボタンを押します。 アプリケーションが起動し、WASDを使用してナビゲートし、Shiftで見回すことができます。



手動カメラ制御スクリプトの設定では、コントロールキー、マウスの感度、動きの軸などを好みに合わせて構成できます。



Unityおよびエミュレーターでのルームマッピング



HoloLensのアプリケーションを開発している場合、周囲の空間を参照してホログラムを配置する必要が必ずあります。



例は引用しやすいです:





このため、HoloLensにはリアルタイムで表面を取得するための特別なAPIがあります。 UnityとHoloToolkitには、それを操作するための既製のコンポーネントがいくつかあり、これらのケースのほとんどを実装するのに十分です。



開始するには、完成したルームモデルを読み込んで、Unityで表示しましょう。 これを行うには、[プロジェクト]タブのプロジェクトリソースで完成したSpatialMappingコンポーネントを見つけて、シーンに追加します。 このコンポーネントは3つの部分で構成されています。









インポートされたHoloToolkitパッケージには、すでに既製のルームモデルが含まれています。 ObjectSurfaceObserverにロードしましょう。 InspectorパネルでRoom Modelフィールドを選択し、検索でSRMeshオブジェクトを見つけてダブルクリックします。 アプリケーションを起動すると、白いグリッドで描画された部屋モデルが必要です。 この場合、表面オブジェクトは、起動時にSpatialMappingオブジェクトに動的に追加されます。







スクリーンショットでわかるように、以前に追加された碑文は、部屋モデルによってほぼ完全に隠されています。 これは、HoloLensのスペースと統合する素晴らしい可能性の1つです。ホログラムから影を追加したり、周囲の世界とホログラムを重ねたりすることができます。



視力、ジェスチャー、表面の付着



この問題を解決するにはいくつかの方法があります。 この記事のフレームワークでは、ユーザーが目とジェスチャーを使用してこの碑文を周囲の表面にインストールできるようにします。



これを行うには、目とジェスチャーを制御する2つのスクリプトをGazeManagerGestureManagerのメインカメラに追加ますTap To PlaceおよびBox Colliderスクリプトをラベルオブジェクトに追加します。 SpatialMappingManagerコンポーネントのDraw Visual Meshesプロパティを使用して、部屋のデフォルト表示をオフにして、アプリケーションを実行します。



ゲームモードでは、碑文を見てスペースバーを押します。 これで碑文は私たちと一緒に移動し、表面を見ると、自動的に表面に「付着」します。



GazeManagerフレームは、ユーザーが見ているオブジェクトをチェックし、標準のUnity Physics.Raycast APIを使用してそれを記憶します。 碑文にBox Colliderを追加したことを覚えていますか? このオブジェクトは、物理エンジンによって衝突を計算するためのオブジェクトの形状を記述します。これにより、人がオブジェクトを見ているかどうかを簡単に確認できます。



さらに、タップ(Unityのスペースバー)によって、人が何らかのオブジェクトを見ているかどうかが確認され、見ている場合は、メッセージがオブジェクトOnSelectに送信され、同じ名前のメソッドがTapToPlaceスクリプトの碑文に対して呼び出され、それによって移動プロセスが開始または終了します。



この場合、移動プロセスの最後にあるTapToPlaceスクリプトは、空間内のオブジェクトの位置を保存し、いわゆる空間アンカー (ワールドアンカー)に結び付けます。 同時に、アンカー自体がデバイスのメモリに保存され、次にアプリケーションが起動されると、スクリプトがそれをロードし、ユーザーが置いた場所に碑文が表示されます。



標準のTapToPlaceスクリプトの実装には、解決する必要がある2つの問題があります。





VisualStudio / MonoDevelop / Notepad /などでTapToPlaceスクリプトを開きます。 表面にオブジェクトをインストールするコードを変更します。



TapToPlaceでのオブジェクトの設定
RaycastHit hitInfo; if (Physics.Raycast(headPosition, gazeDirection, out hitInfo, 30.0f, SpatialMappingManager.Instance.LayerMask)) { // Move this object to where the raycast // hit the Spatial Mapping mesh. // Here is where you might consider adding intelligence // to how the object is placed. For example, consider // placing based on the bottom of the object's // collider so it sits properly on surfaces. Vector3 surfacePoint = hitInfo.point; surfacePoint.y += GetComponent<Renderer>().bounds.extents.y/2; this.transform.position = surfacePoint; // Rotate this object to face the user. Quaternion toQuat = Camera.main.transform.localRotation; toQuat.x = 0; toQuat.z = 0; this.transform.rotation = toQuat * Quaternion.AngleAxis(180, Vector3.up); }
      
      





この作品では、ユーザーの視線と周囲の表面との交点の位置を取得します。



 Vector3 surfacePoint
      
      





垂直軸に沿って碑文の半分のサイズに上げます。 彼女が床の上にいるように。



 surfacePoint.y += GetComponent<Renderer>().bounds.extents.y/2; this.transform.position = surfacePoint;
      
      





次に、カメラの回転を考慮して、碑文を垂直軸の周りに180度回転させます。 碑文をバインドすると、常にユーザーに対して1つの軸上で有効になります。

以上で、ロジックを配置するためのタップの準備ができました。



音声コマンド



Windows 10 APIには、 音声認識と音声生成を操作するための非常に強力なAPIがあります 。 HoloLensには4つのマイクが搭載されており、音声を完全に認識します。 したがって、アプリケーションの音声制御は、ジェスチャーでの作業を非常にうまく補完します。

このようなロジックの実装例として、「色の変更」というフレーズに応答し、碑文のをランダムに変更する簡単なスクリプトを作成します。 ご注意 作成者:スクリプトコードはできるだけ単純なままにして、例として示します。

これを行うには、プロジェクトにC#スクリプトを追加し、Change Color Commandという名前を付けます。 これを行うには、Unityメニューで、 Assets-> Create-> C#Scriptを選択します。 Unityでそれをダブルクリックしてエディターを開きます。



スクリプトテンプレート
 using UnityEngine; using System.Collections; public class ChangeColorCommand : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
      
      





usingセクションに次の行を追加します。



 using UnityEngine.Windows.Speech;
      
      





これにより、ボイスコマンドを操作するためにUnityに組み込まれたラッパーを使用できます。 KeywordRecognizerタイプのオブジェクトにリンクフィールドと、色を変更するRendererコンポーネントへのリンクを追加します。



 private KeywordRecognizer keywordRecognizer; public Renderer target;
      
      





Startメソッド内でこのコンポーネントを初期化しましょう。 このスクリプトをシーンに追加すると、Startメソッドが1回呼び出されます。



 void Start() { var commands = new[] { "Change color" }; keywordRecognizer = new KeywordRecognizer(commands); }
      
      





Startメソッドでは、システムがリッスンするコマンドの配列を定義します。 認識に成功すると、keywordRecognizerはOnPhraseRecognizedイベントをトリガーします。このイベントでは、色の変更を行います。 メソッドの最後にイベントサブスクリプションと音声認識の開始を追加します。



 keywordRecognizer.OnPhraseRecognized += KeywordRecognizerOnOnPhraseRecognized; keywordRecognizer.Start();
      
      





および単純なハンドラー関数:



 private void KeywordRecognizerOnOnPhraseRecognized(PhraseRecognizedEventArgs args) { if (args.text == "Change color") GetComponent<Renderer>().material.color = new Color(Random.value, Random.value, Random.value); }
      
      





関数内で、「色の変更」というフレーズが認識されていることを確認し、このスクリプトがバインドされるオブジェクトのマテリアルの色をランダムなものに変更します。



ChangeColorCommand.cs
 using UnityEngine; using UnityEngine.Windows.Speech; public class ChangeColorCommand : MonoBehaviour { private KeywordRecognizer keywordRecognizer; // Use this for initialization void Start() { var commands = new[] { "Change color" }; keywordRecognizer = new KeywordRecognizer(commands); keywordRecognizer.OnPhraseRecognized += KeywordRecognizerOnOnPhraseRecognized; keywordRecognizer.Start(); } private void KeywordRecognizerOnOnPhraseRecognized(PhraseRecognizedEventArgs args) { if (args.text == "Change color") GetComponent<Renderer>().material.color = new Color(Random.value, Random.value, Random.value); } // Update is called once per frame void Update() { } }
      
      





ChangeColorCommandスクリプトをラベルオブジェクトに追加し、Unityでアプリケーションを実行して結果を確認します。 確認するには、「色を変更」と発声し、碑文の色がどのように変化するかを確認します。

グラフィックスの最適化



現時点では、レーベルは低速の標準Unityシェーダーを使用しています。これは、ウェアラブルデバイスやHoloLensよりも高性能プラットフォームに適しています。



さらに、グラフィックスの観点からHoloLensに固有の最適化がいくつかあります。たとえば、シェーダーを実装するときにmin16floatを使用します。



この記事では、HoloLensのシェーダーの記述について詳しく検討しません。 さらに、HoloToolkitには、ほとんどのニーズをカバーするカスタマイズ可能な最適化された標準シェーダーのセットがあります。



ラベルのシェーダーをStandardFastに置き換えましょう。 シーン階層でラベルを選択し、 インスペクターパネルでマテリアルのあるセクションを見つけます。 内部のドロップダウンリストで、HoloToolkit-> StandardFastを選択します。

碑文が1つだけの場合でも、アプリケーションは60未満のFPSで動作し、ホログラムの安定性に悪影響を及ぼします。



ステップ3:ビルド設定を構成する



HoloLensでアプリケーションを実行するには、Unityで適切なビルドパラメーター(Windowsプロジェクトの種類、名前、アプリケーションのCapabilitesパッケージ)を構成する必要があります。







  1. [ファイル]-> [ビルド設定]に移動します
  2. ウィンドウのリストから[ビルド設定] Windowsストアを選択し、[ プラットフォーム切り替え ]ボタンをクリックします
  3. [ Windowsストア]セクションで [SDK-Universal 10、UWP Build Type-D3D]を選択し、Unity C#Projects for debuggingを確認します。
  4. [ビルド設定]ウィンドウの[ プレーヤー設定... ]ボタンをクリックします。 インスペクターで、会社名とアプリケーション名を入力します。 Windowsストアの設定セクションをすぐに選択します(スクリーンショットの項目7)
  5. インスペクターパネルの[その他の設定]セクションに移動し、 [ サポートされているバーチャルリアリティ]のボックスをオンにします。下のSDKリストに「Windows Holographic」と表示されます。
  6. 次に、インスペクタパネルの最後までスクロールし、 [公開設定]-> [機能]セクションで、次の項目を確認します



    • インターネットクライアント
    • マイク
    • SpatialPerception


セットアッププロセスの最後のステップは、リソースの最適化と品質です。



メニュー編集->品質を開きます。 [ インスペクター ]ウィンドウで、各列の三角形をクリックして[ 最速 ]を選択します。 多かれ少なかれ関連性のある画像をあちこちで見るために、UnityとHoloLensの両方に対してこれらの設定を選択することが重要です。 このプロファイルではアンチエイリアスが無効になり、インポートされたテクスチャは解像度の半分に圧縮され、シャドウは無効になります。これらのプロファイルはすべて必要に応じてカスタマイズできます。この段階では、このパフォーマンスプロファイルのデフォルト設定で十分です。







ステップ4:Visual Studioでプロジェクトをビルドし、HoloLens Emulatorで起動します



したがって、HoloLensの最初の完成したプロジェクトがあります。 デバイスまたはエミュレーターで実行するには、Visual Studio用のプロジェクトを生成し、エミュレーターまたはデバイスにアセンブリをビルドして入力する必要があります。



プロジェクト構築



ここで、すべてがUnityの標準ビルドプロセスと大差ありません。



[ ビルド設定]ウィンドウを開き 、[ 開いているシーン追加 ] 、[ ビルド]の順にクリックします。 Unityは、Visual Studioのソリューションを生成するフォルダーを選択するよう求めます。 プロジェクトでは、プロジェクトのルートにあるビルドフォルダーを使用します。 ビルドプロセスが完了したら、Visual Studioで生成されたソリューションを開きます。



エミュレーターで実行するには、デバッグパネルで次のパラメーターを設定します。Release、x86、HoloLens Emulator 10.0.14342.1018







Ctrl + F5キーを押すか、メニューの[デバッグ]-> [デバッグなしで開始]をクリックします。



このプロセス中、Visual Studioは次のことを行います。





アプリケーションをエミュレーターにロードすると、次のようなものが表示されます。







エミュレータで移動するには、WASD、注視制御-LMB +マウス、タップ-RMB、ブルーム(シェルへの終了)-Escを使用できます。



すべての入力管理機能については、エミュレータのドキュメントを参照してください。 このテクノロジーがマイクロソフトによってリリースされたことには大きなボーナスがあります。デバイス、その使用法、およびAPIのドキュメントは非常に豊富で完全です。



エミュレーターまたはHoloLens自体で使用される主要なツールの1つは、Device Portalです。 見るのは簡単で便利です:







統合されたGPU(Intel 5500)は、エミュレータでかなり控えめなフレームレートを生成します



デバイスの1つでデモアプリケーションからビデオを作成しました。





デバイスのビデオ録画モードでは、すべてが実際よりも悪く見えます。 ビデオは30 fpsで記録されます。 艶出しされていない線が見え、小さな遅れの感覚があります。 通常の起動では、これはそうではないため、実際のデバイスでアプリケーションを最終的に確認することが重要です。



これは、HoloLensの開発に関する基本的な記事です。他にも何か書いていただければ幸いです。 興味のあることをコメントに書いてください。 また、会議を計画します。会議では、デバイスを見て、私たちと話すことができます- ここでサインアップしてください



学習リソース






All Articles