はじめに
3月初めよりインターンで株式会社ゆめみ(https://www.yumemi.co.jp/ja) にてHoloLensの研究開発をしている近大生のよっしーです。
国内でこの1月から提供を開始したMicroSoft製MRデバイスのHoloLensについての記事を書いていきます。
「HoloLens +他社製の外部入力」や「動きを3Dモデルにして配信」など、いろいろな方たちが面白い試みを数多く試されていますが、HoloLens開発の基本的部分の記事があまりなかったので、それをメインに書いていこうと思います。
すること
平面を壁、床、机、天井に分類する
生成するオブジェクトを、Gazeの当たっている平面の種類によって変更したい。
という時などに使えると思います。
前提環境
- Version: Windows Holographic
 - OS Build: 10.0.14393.953
 - HoloLensの開発環境セットアップ済み
 - Unityでの開発
 - HoloToolkit-Unityの利用
 - HoloLens開発の基礎用語
 - PlaySpaceManager(Holographic Academy 230で出てくる)の利用で、メッシュを取り除いた平面へと変換が出来ている。
 
Physics.Raycast()の利用
Raycastはオブジェクトの衝突を判定できるもので、今回使うものは以下の引数を取ります。
- origin: ワールド座標でのレイの開始地点
 - direction: レイの方向
 - maxdistance: レイが衝突を感知する最大距離
 - layerMask: レイキャスト時に選択的に衝突を無視するために使用する
 
実装例
RaycastHit hitInfo;
bool hit = Physics.Raycast(GazeManager.Instance.GazeOrigin,
GazeManager.Instance.GazeNormal, out hitInfo, 20f, SpatialMappingManager.Instance.LayerMask);
    if (hit) {
        GameObject surface = hitInfo.transform.gameObject;
        SurfacePlane plane = surface.GetComponent<SurfacePlane>();
        if (plane != null) {
            switch (plane.PlaneType) {
                case PlaneTypes.Floor:
                    //Do somothing
                    break;
                case PlaneTypes.Ceiling:
                    //Do somothing
                    break;
                case PlaneTypes.Wall:
                    //Do somothing
                    break;
                case PlaneTypes.Table:
                    //Do somothing
                    break;
                case PlaneTypes.Unknown:
                    //Do somothing
                    break;
            }
        }
    }
解説
- GazeManager.Instance.GazeOrigin: 視線の座標を取得
 - GazeManager.Instance.GazeNormal: 視線のforwordを取得
 - out hitInfo: 衝突判定のあった平面を取得
 - layerMask: 特に重要なポイント! SpatialMappingManager.Instance.LayerMaskの値を使い空間マッピングオブジェクト以外が反応しないように設定している。
 
HolotoolKitのデフォルトでは以下のように、レイヤーマスクが31に設定されています。

hitoInfoのtransform.gameobjectをsurfaceとして取得し、
surfaceにアタッチされているSurfacePlaneコンポーネントをplaneとして取得します。
そうすることにより、plane.PlaneTypeによって平面タイプを分類出来ます。
参考
RayCastその2、衝突するオブジェクトの制限【Unity】
http://kan-kikuchi.hatenablog.com/entry/RayCast2
Holographic academy Holograms230
https://developer.microsoft.com/en-us/windows/holographic/holograms_230