読者です 読者をやめる 読者になる 読者になる

ウラデブ

AR、MR、プログラミングとかとか・・・

壁とか天井とか床とか欲しいな 〜 空間認識

ども、ウラさんです。
HoloLensなんだから壁や床を利用したいよね?
って事で、空間認識ってか部屋認識をやってみましょ。

f:id:urasansan:20170321162750j:plain

 前回と同じでHoloToolkitを使って空間メッシュが表示されるまで作ります。
んで、空のゲームオブジェクトを追加。

自前のスクリプトとして
「MakePlanes.cs」
を作成&アタッチ。

HoloToolkitから
「SurfaceMeshesToPlanes.cs」
「RemoveSurfaceVertices.cs」
をアタッチ。 

f:id:urasansan:20170321163601p:plain

 

んで、MakePlanes.csを編集。

sing System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HoloToolkit.Unity.SpatialMapping;
using HoloToolkit.Unity.InputModule;

public class MakePlanes : MonoBehaviour, IInputClickHandler {

	// Use this for initialization
	void Start () {
		//	エアタップ頂戴	
		InputManager.Instance.PushFallbackInputHandler(gameObject);

		//	壁とか作り終わったら教えて
		SurfaceMeshesToPlanes.Instance.MakePlanesComplete += SurfaceMeshesToPlanes_MakePlanesComplete;
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	public void OnInputClicked(InputClickedEventData eventData)
	{
		//	エアタップされたらメッシュ作るの止めて、壁とか作る
		SpatialMappingManager.Instance.StopObserver();
		SurfaceMeshesToPlanes.Instance.MakePlanes();
	}

	//	壁とか出来たら呼ばれる	
	private void SurfaceMeshesToPlanes_MakePlanesComplete(object source, System.EventArgs args)
	{
		//	平面に内包されてる頂点を削除して軽くするみたい
		RemoveSurfaceVertices.Instance.RemoveSurfaceVerticesWithinBounds(SurfaceMeshesToPlanes.Instance.
	}
}

こんな感じ。
極力シンプルにしたのでNULLチェックとかしてないよ。

最初に気が済むまで空間をスキャンして、エアタップされたら「MakePlanes」を呼んでる。
これだけで壁、天井、床、テーブル、その他を認識してくれる。

ただ、白い壁しか無いので分かりづらいのでもうちょい手を入れてみる。

f:id:urasansan:20170321165456p:plain

「SurfacePlane」Prefabで板を作ってるのでマテリアルをデフォルトから変更してあげる。
すげー分かりやすいマテリアル作ったった!

f:id:urasansan:20170321165854p:plain

んで、「SurfaceMeshesToPlanes.cs」にセット。


実行すると

f:id:urasansan:20170321170059p:plain

こんな感じで、分かりやすく壁と天井と床にポリゴン貼られる。



メッシュが邪魔なので

	//	壁とか出来たら呼ばれる	
	private void SurfaceMeshesToPlanes_MakePlanesComplete(object source, System.EventArgs args)
	{
		//	平面に内包されてる頂点を削除して軽くするみたい
		RemoveSurfaceVertices.Instance.RemoveSurfaceVerticesWithinBounds(SurfaceMeshesToPlanes.Instance.ActivePlanes);

		//	メッシュが邪魔なので消しちゃう
		SpatialMappingManager.Instance.DrawVisualMeshes = false;
	}

こんな感じで消しちゃう。

 

f:id:urasansan:20170321170702p:plain

綺麗になったっ!


って事で、動いてるのはこんな感じ。



天井にハリがあるので変な所をテーブルとして認識してたり、テーブルが床の下にあったりするようですが、まぁこんなもんですか?
今回も、HoloToolkitで簡単に空間認識が出来ました。

こーなると次は壁とか天井に何か置かないとですな。
さて、どうやって窓付けたりするのかしら?
調べましょ、調べましょ・・・


では、またっ!