Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Unityを使わずHoloLensアプリを作ってみた

1,076 views

Published on

Tokyo HoloLens Meetup vol.7での資料

https://hololens.connpass.com/event/76212/

Published in: Software
  • Be the first to comment

Unityを使わずHoloLensアプリを作ってみた

  1. 1. Unityを使わずHoloLensアプリを 作ってみた 株式会社ハニカムラボ 河原田 清和
  2. 2. アジェンダ • 自己紹介 • このセッションの目的 • UE4 • Direct X • まとめ 2
  3. 3. 自己紹介 • 株式会社ハニカムラボ 代表取締役 • 昔ゲーム作ってました • PS2/Xbox/PSP/Xbox 360世代 • マイクロソフトにもいました • Xbox事業部 アドバンストテクノロジーグループ(通称ATG) • ハニカムラボでは、デジタルプロモーションのイベントとか、スマホ アプリとか、メーカープロトタイプ開発とか、ゲーム開発とかいろん なものを日々作ってます 河原田 清和(かわはらだ きよかず) 3
  4. 4. こんなんとか 4 渋谷109前のスペースにAndroid 203台を同期させたインタラクティ ブなクリスマスツリーを設置。 通行人は自分のスマホで飾り付け ができます。
  5. 5. こんなんとか 5 愛媛県の道の駅の2F部分をリ ニューアル。8m x 8m x 3.5mの 空間4面にプロジェクション+ Kinectでインタラクティブな バーチャル水族館を作成。
  6. 6. こんなんとか 6 ベネッセ様進研ゼミの学習用タブ レットのコンテンツ。ゲーム要素 を交えて遊びながら、地理x歴史 を学ぶことができるアプリ。
  7. 7. こんなんとか 7 新宿メトロプロムナードに、東京 喰種の実写版映画公開に先駆けた プロモーションを展開。 Kinectを使って、体験者が喰種とな り、特定のパラメータによりいず れかの赫子(かぐね)が生え、写 真入り指名手配のポスターがもら える体験ができるイベント。
  8. 8. HoloLensとの出会い • そんな感じのいろいろなものを作ってたら、とある 大手メーカーさん(以前お仕事した)から連絡が あった • HoloLensを入手してしまったので(日本発売前)、 こんなオモチャはハニカムラボさんだろうというこ とで連絡してみた • とりあえずどういうことができるか実験して欲しい 触ってみたかったので凄くラッキー! →触ってみたら、HoloLens超いいデバイス! 8
  9. 9. HoloLensとの出会い • HoloLensというデバイスの素晴らしさを知って、ア メリカから密かに友達に買ってきてもらったり、日 本発売したらさらに何台か買ってみたり、いろんな アプリを作って遊んでたら、 • Cris(MRPPのエライ人)にデモをいくつか見せる機 会があって、 • Alex(HoloLensの生みの親)にデモをいくつか見せ る機会があって、 • そんなこんなのたくさんのラッキーの積み重ねで MRPPに認定されちゃいました!(もちろん頑張りま した) 9
  10. 10. というわけでそろそろ本題。 10
  11. 11. このセッションの目的 • Unityを使わずどんなアプローチがあるか • 速いのか遅いのか、簡単なのか難しいのか • やったことないので試してみる • というわけで今回は、UE4とDirectXを使った HoloLensアプリのビルドを試してみました • ちょうど興味があって試してみようと思ってる人の 参考になればいいなと思ってます 11
  12. 12. 特にDirectXについては、マイクロソフトの千葉さんが 去年のde:codeのセッション説明で煽っていたので、、、 やっておかねば!! 12
  13. 13. Unreal Engine 4 でHoloLensアプリをビルド 13
  14. 14. 大まかな流れ 1. カスタムエディタのソースを取得 2. ビルド環境、ソリューションを作る 3. カスタムエディタをビルド 4. UE4のプロジェクトを作って、 5. UWPアプリとしてパッケージ 6. HoloLensに転送 7. めでたしめでたし この流れでやっていきます。 @diberidarshiさんの記事がとても参考になりました。 https://qiita.com/diberidarshi/items/084d6313de9a380bea3e 14
  15. 15. カスタムエディタのソースを取得 15 • UE4はUWPパッケージの出力に非対応 • なので、UWP出力ができるカスタムされたUE4を使用します • UWP出力可能なカスタムUE4はGitHub上にソースがあるのでそこから取得 • https://github.com/MICROSOFT-XBOX-ATG/MICROSOFT_UWP_UNREAL • Microsoft Xbox ATGのリポジトリ。非公式に公式が対応中
  16. 16. カスタムエディタのソースを取得 16 • (注意1)GitHubにアクセスしてNotFoundが出る場合は、Unreal EngineとGitHubの関連付 けができていないので、Unreal EngineのサイトにログインしてマイページでGitHubのアカ ウントを設定すればOKです。 • (注意2)リポジトリにアクセスできたら、メインブランチではなく、dev_MixedRealityブ ランチを取得します。 切り替える
  17. 17. ビルド環境、ソリューションを作る 17 • UE4をビルドするのに、Visual Studio 2017の「ユニバーサルWindowsプラットフォーム開 発」の項目が必要になります。 • すでにVisual Studioがインストールされてる人は、コンパネ→プログラムのアンインストー ルで、Visual Studio 2017を選択して“変更”から追加でインストールしておきます。
  18. 18. ビルド環境、ソリューションを作る 18 1. Setup.batを実行して、 2. GenerateProjectFiles.batを実行 したら、 3. UE4.slnができる ② ① ③ はずなんだけど、2018/02現在の状態だ と、途中でエラーが出て失敗します。 (ハマリポイント)
  19. 19. ビルド環境、ソリューションを作る 19 同階層にある、GetUWPDependencies.ps1の途中でコケてるみたいなので、少し手を入れます。 ② ① 具体的には、Xbox Live Extensions SDKのインストー ルに失敗してしまってるようなので、 1. 該当部分をコメントアウト 2. 書かれているURLに直接アクセスしてインストー ラをダウンロード ダウンロードしたインストーラでXbox Live Extensions SDKをインストールしたら、最初の Setup.batから進めれば無事にUE4.slnができあがりま す。
  20. 20. カスタムエディタをビルド 20 できあがったUE4.slnをVisual Studioで開いてビルドすれば、Engine/Binaries/Win64にUE4Editor.exeが できます。これがカスタムのUE4になります。 ちなみに、ビルドはかなり時間が必要でここまで3〜4時間かかります。(環境によると思います)
  21. 21. UE4のプロジェクトを作る 21 カスタムUE4を開いて、適当に新規プロジェクトを作ります。 今回はキャラクターを置いただけのシンプルなものにしたいので、 1. 新規でBlankプロジェクトを作って、 2. キャラクターを置き、 3. 床のモデルもSky SphereもFogもLightも全部削除します
  22. 22. UWPアプリとしてパッケージ 22 このままUWPアプリを出力しますが、その前にUWPプラットフォームの設定を変えておきます。 • Target Device FamilyをWindows Holographicに変更 • Minimum Supportedを一番小さい バージョンに変更
  23. 23. UWPアプリとしてパッケージ 23 あとは、Package ProjectからUWPを書き出せばOKです。HoloLens用なのでx86-32bitを選択します。
  24. 24. HoloLensに転送 24 無事に書き出しが終わると、appxができてるのでApp Managerからインストールします。 Unityから書き出した場合と構成が少し違いますが、appxだけをApp packageで選択すればOKです。 (Dependencyは特になし)
  25. 25. めでたしめでたし? 25 出ました! が、このシンプルな構成にも関わらず、パフォーマンスが全然出ません(体感で15〜20fpsくらい)。 さらにfpsが出ないのでピタッと固定されずガタガタしてます。 • ボトルネックがどこにあるのか現状全然分かりません • カメラもなんかおかしい(確かにHoloLens用のカメラを設定してない) • 現状はジェスチャーもどうやって取るんだろうか状態
  26. 26. パフォーマンスネックを調べるのはなんだか時間がか かりそうなので、いったん置いておこうかな 26
  27. 27. DirectXを用いてHoloLensアプリをビルド 27
  28. 28. 大まかな流れ 1. 必要なものをインストール 2. テンプレートからプロジェクトを作る 3. ビルドして転送 4. めでたしめでたし この流れでやっていきます。 オフィシャルの記事(Creating a holographic DirectX project)と https://developer.microsoft.com/ja-jp/windows/mixed- reality/creating_a_holographic_directx_project かたりぃなさんの記事がとても参考になりました。 http://catalina1344.hatenablog.jp/entry/2017/02/05/201946 28
  29. 29. 必要なものをインストール 29 • Visual Studio 2017 • HoloLens Emulator が必要なので、入ってない場合はインストー ルします。 HoloLens Emulatorの中に、Holograpicプロ ジェクトのテンプレートが入っています。
  30. 30. テンプレートからプロジェクトを作る 30 必要なものが入っていると、Visual Studioを起動して新規プロジェクトを作成するときに、Holographicテ ンプレートが選べるようになっています。 Visual C++→Windowsユニバーサル→Holographicから、Holographic DirectX 11 Appを選択します。
  31. 31. ビルドして転送 31 プロジェクトができたら、いつもUnityから出力したVSビルドと同じように、 ビルドしてHoloLensへ転送します。
  32. 32. ひとまずめでたしめでたし 32 出ました! 虹色のキューブがくるくる回ってます。
  33. 33. ここからテンプレートを改造していきましょう。 改造するために全体構造を把握します。 33
  34. 34. すごくおおまかな全体構造 34 起動 初期化 Initialize() SetWindow() メインループ Update() Render() 終了処理 • D3Dデバイス作成 • カメラ作成 • ホログラフィックスペースを設定 • コンテンツ初期化、シェーダ読み込み等 • インプットイベントハンドラ設定 • シーンの更新 • 入力イベントチェック • 描画
  35. 35. ここをいじればいろいろできる 35 テンプレートプロジェクトで具体的に言うと、2つのファイルだけ • SpinningCubeRenderer →コンテンツ(モデルとか)、シェーダはこのクラスで初期化して、Update/Renderもここ。 • SpatialInputHandler →入力イベント(ジェスチャーとか)を設定する 最初は初期化の中のここの部分を改造するのが簡単 • D3Dデバイス作成 • カメラ作成 • ホログラフィックスペースを設定 • コンテンツ初期化、シェーダ読み込み等 • インプットイベントハンドラ設定
  36. 36. 同じモデルを出すために改造 36 SpinningCubeRenderer::CreateDeviceDependentResources()内で、初期化処理として • Vertex/Pixelシェーダファイルのロード、作成 • 頂点フォーマットを定義 • キューブモデルを生成(8頂点をプログラム内に記述) • 頂点バッファ、インデックスバッファを作成 を行っているので、ここをちょっと改造していきます。 Objファイルを読み込んで表示したいんですが、Objファイルの読み込みロジックはないので、自前で テキストとして読み込んで、ごにょごにょとパースして頂点を取り出してがんばって頂点バッファ、イ ンデックスバッファを作ります。 ※DirectX 11は情報がいろいろ豊富ですが、UWPの場合、C++/CXでの開発になるので、実はここの情 報がとても少なくてそこが一番苦労するポイントかもしれません。 がんばってマイクロソフトのリファレンスやサンプルプログラムとにらめっこしながら進めます。
  37. 37. 同じモデルを出すために改造 37 出ました! こちらはパフォーマンスも余裕で60fps出てる感じ(体感) さらに、画面いっぱい描画されるくらい近づいても処理落ちしません(ピクセルフィルレートがネック になってない感じ)。おそらく今回のピクセルシェーダがおそろしくシンプルだからだと思います。
  38. 38. GPUインスタンシング 38 中身を見ていて気付いたんですが、SpinningCubeRenderer::Render()の中の描 画コマンドが、 context->DrawIndexedInstanced(m_indexCount, 2, 0, 0, 0); となっていて、第2引数が“描画するインスタンス数”なんですが、何で2回描画す るんだろうと思っていたら、右目用と左目用の2回でした(1にしたら左目しか 描画されない)。 Unityだと、複数出したいオブジェクトに明示的にGPUインスタンシングを設定 することはできると思うけど、HoloLensの両眼をレンダリングするときの内部 処理はどうなっているんだろう・・・(もしGPUインスタンシング化されてな かったら、DirectX直だとその部分を直接書けるのは有利ポイントかなと妄想)
  39. 39. パフォーマンス解析ツールについて 39 DirectX 9の頃の最強GPU解析ツールのPIX、Intel CPUの強い味方VTuneが、 DirectX実装にしたら使えないだろうか、と妄想してましたが、やっぱり使 えないみたいです泣 DirectX 11での便利なパフォーマンス解析ツールはまだ調査不足です。 もしPIX並のGPU解析ツールが使えるなら、その部分はUnityより有利にな るポイントだなと思います(妄想) 誰か知ってたら教えてください。
  40. 40. まとめ • UE4は実用にするにはまだちょっと厳しいかも • DirectXはいけそう 40
  41. 41. DirectX実装のいいとこよくないとこ • いいとこ • カリカリのチューニング/最適化については有利かも • Unity, HoloToolKitのバージョン整合性に苦しまなくていい • 深いところまで追いかけてのデバッグがし易い(と思う) • ちゃんと作ればシェーダの管理とかUnityより楽そう(と思う) • 低レベルからやりたい人、Unityのブラックボックスがイヤな人には向い てるかも • DirectXでやってます(キリッ)って言える • よくないとこ • ポストエフェクトとかパーティクルとか派手にしたい場合はシステムか ら作らないといけないのがそれなりに大変 • C++/CXは情報が少なくて大変 • HolographicSpace関係も情報が少なくて大変 41
  42. 42. 結論 さくっと作るならUnityが良いと思います パフォーマンスを追求するならDirectXもあり! 42
  43. 43. 宣伝 そんな風に、日々いろんなアプリケーション作りなが ら、ラッキー感も漂っているハニカムラボは、 随時、仲間募集中です!! 詳しくは採用特設サイトを見てね https://www.recruit.honeycomb-lab.co.jp/ 43
  44. 44. ありがとうございました! 44

×