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をアタッチしたusing HoloToolkit.Unity.SpatialMapping;
public class PlaneCreator : MonoBehaviour {
// Use this for initialization
void Start () {
SurfaceMeshesToPlanes.Instance.MakePlanes();
}
}
Game Object を選択Add ComponentでPlaneCreatorをアタッチ
これでUnityを実行すると検知した空間の天井、床、壁にPlaneが表示されます。
開発者が実質記述するのは、なんと
SurfaceMeshesToPlanes.Instance.MakePlanes(); の一行だけです。
勘違いしないで欲しい点は、このコードが正しいのか?という点です。
SurfaceMeshesToPlanes.Instance.MakePlanes(); は
サンプルのように30秒程度、Scanした後に実行すべきで
おそらくあまり実務では、Start直後に用いないほうが良いかと
今回は、あくまで、コードの理解を早める、
そしてUnity上でぱっと確かめるためという意図をこめ効率化としました。
これによって、壁や天井にオブジェクトを張るのが容易になり
今後の開発がスピードアップできればと考えています。