この資料は第6回 HoloLens 参考書読書会で使用したスライドの一部です。
第6回 HoloLens参考書 読書会World Anchorについて3月28日 イワケン
View Slide
2/58自己紹介•岩崎謙汰 (イワケン) 1993年生まれ•東京工業大学 大学院卒業 4月から社会人•研究分野: グラフサンプリング•趣味: Unity、AR×〇〇を考える、Vtuber•HoloLens実績• めざせスカウター! HoloLensによる特定個人の 顔認識アプリ制作とその課題 (ABCSpring 2017)• XR HACKATHON、決勝進出• 学生ハッカソン、企業賞
3/58今日扱う内容•書籍 第7章 “The Tools of the Trade”• Persistence (永続性)• World Anchors• ゲーム内のデバッグWindow
4/58今回のゴール•World AnchorとPersistence (永続性) の意味を理解する•World AnchorのUnity上の使い方を学ぶ•書籍の流れを確認するアンカーとは「いかり」のこと。イメージで覚えておこう!ながれ
5/58今回の環境Unity 2017.1.0f3Visual Studio 2017 13.0.1HoloToolkit-Unity v1.2017.1.0Parallels Desktop13for Mac Pro Edition13.2.0
6/58Persistence (永続性)とは何か理解しよう
7/58Persistence (永続性) のモチベーション•ホログラム (オブジェクト) をリアル空間に関連付けて配置したい (その場にあるかのような)•アプリケーションを落としても、その場に残るようにしたい。(ゲームでの位置のセーブ機能)•ん? どゆこと?
8/58ダメな例1バーチャル洗濯機を時計の下に置いたが…
9/58ダメな例1バーチャル洗濯機を時計の下に置いたが…ARメガネを動かすと移動してしまう!
10/58良き例ARカメラが移動&回転しても、リアルの時計の下にいて欲しい!World Anchorで固定されてるイメージ
11/58ダメな例2バーチャル洗濯機を時計の下に置いて、アプリを落としたら…
12/58ダメな例2次の日アプリを起動したら隣の家にあった
13/58良き例アプリを落としても、起動したら時計の下にあれ!これがPersistence (永続性)
14/58World Anchorを使うとこういうことが出来るようになる!
15/58クイズ•先程はアプリケーションを落とした場合、永続性が保たれてる例であった。では、アプリケーションを落とした後にさらにHoloLensの電源を落とした場合、永続性が保たれるか。1. 永続性は保たれる2. 永続性は保たれない
16/58なぜHoloLensはこのようなことができるの?
17/58Spatial Coordinate Systems(空間座標系)のおかげさ
18/58リアル世界の座標系 vs HoloLens座標系•Unity上の 1 Unit = 現実世界の1m• ここまでは良かった•リアルの現在地 (緯度経度) をHoloLens世界に知らせる方法がない。• GPSあるけど精度悪すぎて非現実的•HoloLensはもっと小さな世界を繊細に表現したい
19/58World Anchor•絶対座標は厳しい…(だってGPSの精度悪すぎるんだもん)•よし、相対座標を採用しよう•Spatial Mappingで部屋の形状 (Mesh) わかるから、その相対位置で配置しよう。これがWorld Anchorの実装アイデア。?
20/58仕組みはなんとなくわかったでもWorld Anchorの実装って難しいんでしょう?
21/58World Anchorは比較的かんたんです!(書籍引用)
22/58World Anchorはこれだけ覚えよう•World Anchor Managerから基本操作する。• 固定するオブジェクトの名前を考える。• 固定したい時はWorld AnchorをAttachする。• 固定したくない時はWorld AnchorをRemoveする。World Anchor Manager World Anchor StoreオブジェクトAttachAnchor関数を実行したイメージ図登録名前: 冷蔵庫名前: 冷蔵庫GameObjectWorld Anchor
23/58World Anchor Managerのコード•最初は気にしなくてもよし•World Anchor Storeを管理する•AnchorをAttachする (Store状況を見ながら)•AnchorをRemoveする (Storeから削除する)•World Anchor Storeには、Anchorが付けられたオブジェクトの情報がストックされている。World Anchor Store名前: 冷蔵庫GameObject名前: 時計GameObject・・・World Anchor Manager
24/58では、書籍にのっとって手を動かしていきます!
25/58書籍のソースコードのダウンロード• https://github.com/PacktPublishing/HoloLens-Beginners-Guide をcloneまたはDownload Zipします。
26/58プロジェクトを新規作成
27/58書籍のGithubからChapter7をインポート•Unityのメニューから [Assets] > [Import Package] >[Custom Package]を選択•書籍のGithubのフォルダChapter7からChapter7before.unitypackageをインポート
28/58Mixed Reality Toolkit Unityのダウンロード•https://github.com/Microsoft/MixedRealityToolkit-Unity/releases をクリック•自分のバージョンのunitypackageをダウンロード
29/58Mixed Reality Toolkit Unityのインポート•Unityのメニューから [Assets] > [Import Package] >[Custom Package]を選択•HoloToolkit-Unity-v1.2017.1.0.unitypackageを選択して全てをインポート
30/58Chapter7を選択•Unityのプロジェクタービューから[Scene] >[Chapter7]を選択。エラーが出なければOK
31/58オブジェクト準備•ヒエラルキービューの非アクティブのSphereオブジェクトを削除する。•skeeオブジェクトの子供にTapToPlaceColliderオブジェクトがあれば削除する。
32/58BoxColliderのアタッチ•skeeオブジェクトを選択しBoxColliderをアタッチする。•CenterとSizeの値を以下のように設定• Center: X: -152 , Y: 39, Z: -335• Size: X: 304 , Y: 463 , Z: 1189
33/58PlaceSkeeBallMachine.csをアタッチ•skeeオブジェクトを選択しPlaceSkeeBallMachine.csをアタッチする。
34/58World Anchorの実装•PlaceSkeeBallMachine.csを開く。•11,12行目を確認する。
35/58•40行目でSingletonのWorldAnchorManagerを代入•48~55行目でWorldAnchorManagerにskeeオブジェクトをアタッチWorld Anchorの実装
36/58Unityでよく出るgameObject•コード中のgameObjectについてgameObject Scriptをアタッチしている実際のGameObjectthis.gameObject ↑ gameObjectと同じthis このScript。MonoBehaviourを継承
37/58Update関数内のRaycast•Update関数内のコード (Update関数はフレームごとに呼ばれるUnity特有の関数)
38/58OnInputClicked関数•AttachAnchor,RemoveAnchorの使用例
39/58WorldAnchorの実装のおさらい•おさらい• GameObjectにアンカーをアタッチしたい時WorldAnchorManager.Instance.AttachAnchor (ゲームオブジェクト, 名前); を呼ぶ• GameObjectからアンカーを外したい時WorldAnchorManager.Instance.RemoveAnchor (ゲームオブジェクト); を呼ぶ• Anchorがアタッチされたオブジェクトは基本静止状態
40/58ApplicationManager.csの書き換え (1/2)•プロジェクトビューの[Scripts]>[ApplicationMangaer]を開く。
41/58ApplicationManager.csの書き換え (2/2)•Update関数の中身を書き換える。
42/58skeeの位置を変える
43/58AppManagerオブジェクトの編集
44/58World Anchor Managerを新しく作る
45/58実行するとエラーが出るみたい…•書籍の金言•Do not hesitate to search for an answer.答えを検索することをためらうな•今回の場合、WorldAnchorStoreがUnityEditor上で動作しないことが原因らしい。•つまり、HoloLensにBuildすればOK♪
46/58アプリデバッグの実装•詳しくは最終章でやるよ!•この章では、シンプルなテキストボックスを実装する。Debug Messageが見える。
47/58デバッグ用のテキストを設定する•プロジェクトビューから [HoloToolkit] > [UI] >[Prefabs] > [3DTextPrefab]をヒエラルキービューのHoloLensCameraにドラッグ &ドロップする
48/58デバッグ用のテキストを設定する•Prefab化することで、元のPrefabと分離して新しいPrefabを作る。
49/58ApplicationManager.csを書き換える•Textmeshを書き換えられるようにする。
50/58ドラッグ&ドロップ•DebugInfoオヴジェクトをApplicationManagerと•結びつける。
51/58Startボタンの設置追加:SizeのZを0.01など0より大きくする
52/58名前の変更•先程の3DTextPrefabをCrtl + Dで複製する。•それぞれの名前を”StartBtn”,“OptionBtn”にする
53/58ボタンの配置
54/58StartButton.csを加える
55/58StartButton.csを書き加える•OnInputClicked関数 (AirTapされたら呼ばれる関数)に以下のコードを加える。•ApplicationMangaer.Instance.debugTextMesh.text+= “¥n Start Button Clicked”;
56/58やってみよう•OptionButtonも同様に行おう!•ApplicationMangaer.Instance.debugTextMesh.text+= “¥n Option Button Clicked”;と書き加える。
57/58おわり〜•ビルドしよう!
58/58World Anchorまとめ•HoloLensでは、ホログラムの位置が大事。アプリケーションを落としても変わらない永続性が必要。•World Anchorは空間マッピングの相対座標によって達成される。•World Anchor ManagerによってWorld Anchorを管理する