LoginSignup
13
12

More than 5 years have passed since last update.

HoloLensで壁、床、机、天井の分類をする

Last updated at Posted at 2017-03-27

はじめに

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: レイキャスト時に選択的に衝突を無視するために使用する

実装例

RecognizePlane
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に設定されています。
DefaultLayer.png

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

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12