2017年2月21日火曜日

HoloLensの開発効率化 を世界一短いコードで検知した空間にPlaneを表示する処理を実装してみる

お疲れ様です。ZuQ9->Nnです

HoloLensの空間検知Spatial Mappingはとても面白いです。
しかし、このメッシュのままだと扱いにくい場合があり、
空間にPlaneのオブジェクトを表示したい時があります。

HoloToolkit-Unityを利用すると、検知した空間から
天井、壁、床を判断し、それにPlaneを作成するコードがすでにあります。
それが、SurfaceMeshesToPlanes.csです。

しかし、このコードをアタッチするだけでは、
Planのオブジェクトを表示してくれず、
開発者がコードを作成する必要があります。

HoloToolkit-Unity > SpatialMapping > Tests > ScriptsのSpatialProcessingTest.cs
Holograms-230-SpatialMapping > Completed > Planetarium > Assets > Scripts> PlaySpaceManager.cs 
が参考になりますが、それなり処理が長く解析や理解に時間がかかります。
そこで、今回は世界一短いコードで実装したいと思います。

コードを示す前に、まず、いつものようにステップバイステップで作成手順を見ていきましょう。
毎回ですが、HoloToolkit-Unityをインストール、プロジェクトの設定を行ってください。

HoloToolkit > SpatialMapping > Prefabs > SpatialMapping.prefabをHierachyにドラッグアンドドロップ

HierachyのSpatialMappingを選択ObjectSurfaceObserverのRoomModelのプロパティに
SRMeshを選択

HierachyのCreateからCreate EmptyでカラのGame Objectを生成

作成されたGame Objectを選択、SurfaceMeshesToPlanes.csをアタッチ

SurfaceMeshesToPlanesのSurfacePlanePrefabをクリックし、SurfacePlaneを選択し、アタッチ
ここで初めてコードを作成します。ProjectのCreateを選択

C#Scriptを選択、スクリプトの名前はPlaneCreatorとします。

PlaneCreatorをクリックしエディタを起動。PlaneCreatorの内容は下記です。

using UnityEngine;
using HoloToolkit.Unity.SpatialMapping;

public class PlaneCreator : MonoBehaviour {
    // Use this for initialization
    void Start () {
         SurfaceMeshesToPlanes.Instance.MakePlanes();
      }
}
HierachyのSurfaceMeshesToPlanesをアタッチした
Game Object を選択Add ComponentでPlaneCreatorをアタッチ

これでUnityを実行すると検知した空間の天井、床、壁にPlaneが表示されます。

開発者が実質記述するのは、なんと
SurfaceMeshesToPlanes.Instance.MakePlanes(); の一行だけです。

勘違いしないで欲しい点は、このコードが正しいのか?という点です。
 SurfaceMeshesToPlanes.Instance.MakePlanes(); は
サンプルのように30秒程度、Scanした後に実行すべきで
おそらくあまり実務では、Start直後に用いないほうが良いかと

今回は、あくまで、コードの理解を早める、
そしてUnity上でぱっと確かめるためという意図をこめ効率化としました。
これによって、壁や天井にオブジェクトを張るのが容易になり
今後の開発がスピードアップできればと考えています。