2018年3月10日土曜日

第五回 HoloLens参考書 読書会で発表しました。

お疲れ様です。ZuQ9->Nnです。
2018/03/09(金) 第五回 HoloLens 参考書 読書会 で発表を担当させてもらいました。

HoloLensに関連する何かに携わっていないと、絶対に触らずにダメになっていく
そんな不安や焦りの気持ちからこちらの読書会にスタッフとして参加させてもらっていました。

こちらの「HoloLens Beginner's Guide

の書籍に添いながら各Chapterごとにスタッフが発表を受け持っています
そして、いよいよ、僕の担当の番となったわけです
内容は、Chapter6 のSpatial Mappingについて、発表資料はこちらです。

こちらの資料の中のコードApplicationManagerについはて、こちらです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HoloToolkit.Unity;
using HoloToolkit.Unity.SpatialMapping;
using HoloToolkit.Unity.InputModule;
public class ApplicationManager : Singleton<ApplicationManager>, IInputClickHandler, ISpeechHandler
{
public GameObject soundLayer1;
public GameObject soundLayer2;
public GameObject soundLayer3;
public GameObject soundLayer4;
public GameObject skeeballmachine;
public bool spatialMapSet = false;
public bool skeeBallMachinePlacementSet = false;
public bool toInit = true;
// Use this for initialization
void Start ()
{
InputManager.Instance.PushModalInputHandler(this.gameObject);
}
// Update is called once per frame
void Update ()
{
if (spatialMapSet)
{
skeeballmachine.SetActive(true);
if (toInit)
{
//this is the first time through only
skeeballmachine.transform.position = Camera.main.transform.position;
skeeballmachine.transform.position += new Vector3(skeeballmachine.transform.position.x, -1.25f, 3.0f);
//we have finished the initiallization of the skeeball machine set the toInit flag to false
toInit = false;
}
}
else
{
skeeballmachine.SetActive(false);
}
//if the skeeball machine placement is set then we want to run all of the layers of sound.
if (skeeBallMachinePlacementSet)
{
soundLayer1.SetActive(true);
soundLayer2.SetActive(true);
soundLayer3.SetActive(true);
soundLayer4.SetActive(true);
}
else
{
soundLayer1.SetActive(false);
soundLayer2.SetActive(false);
soundLayer3.SetActive(false);
soundLayer4.SetActive(false);
}
}
public void OnInputClicked(InputClickedEventData eventData)
{
SetSpatialMap();
}
public void OnSpeechKeywordRecognized(SpeechEventData eventData)
{
switch (eventData.RecognizedText.ToLower())
{
case "done":
SetSpatialMap();
break;
}
}
void SetSpatialMap()
{
spatialMapSet = true;
SpatialMappingManager.Instance.DrawVisualMeshes = false;
InputManager.Instance.PopModalInputHandler();
}
public void SetSpatialMap(string command)
{
switch (command.ToLower())
{
case "done":
SetSpatialMap();
break;
}
}
}
完成したアプリを実機で動かしたときは、こんな感じになります。

発表は、自分でも、早口になっているなと思いながらも ついつい焦りからか、
止められない感じになってしまいました。

今まで5分くらいのLTはやっていたのですが、
1時間以上の枠をもらったのは、
今回初めてで時間配分、どっからどこまでをダラダラせず、
わかりやすくまとめるか、とても課題が残りました。

発表後は、参加者にお声もかけていただき。
具体的な質問等もいただき、まだまだ、きっちりと
理解していない部分がほとんどだと痛感しました。

Spatial Mappingの一番のポイントは、HoloLensがセンサーをつかって
周りの空間の情報をスキャンし貯めている部分です。

質問者さんから言われて、僕も勘違いしていた部分があります。
SpatialMappingObserver.csにStartObserving があるので
てっきり、アプリを起動したときに
周囲をスキャンを開始するのかと思っていたのですが
アプリを起動しなくてもHoloLensそのものを起動したときに
既に自動的にセンサーを使って周りの空間をスキャンし
空間情報を貯めて更新していますね。
アプリ内では、あらかじめスキャンした空間の情報も利用しているようです。

途中でヘルプいただいた @dy_karous はじめ、スタッフの皆さんありがとうございました。
発表そのものは終わりましたが、読書会自体はつづきますので
最後まで、できる範囲内でお手伝いさせてもらいます。