2017年3月20日月曜日

HoloLensの開発効率化 ノーコーディングでオブジェクトにマーカーをつける方法

お疲れ様です。ZuQ9->Nnです。 
HoloLensは、とても視野が狭く、
ホロがどうしても、視界の外に出てしまいます。

そこで、オブジェクトにマーカーをつけて
視界を誘導してあげたい場合があります。
こちらもHoloToolkit-Unityにすでに用意されています。

一番簡単なものは、HoloToolkit > Utilities > Prefabsの中にある
HeadsUpDirectionIndicator.prefabを利用する方法です。

こちらも、いつものように手順をおっていきます。
まずは、HoloToolkit-Unityのインストールとプロジェクトの設定

最初にMain Cameraを選択、右クリックでメニューを表示しDelelteで削除します。
次に、HoloToolkit > Input> Prefabsの中にあるHoloLensCamera.prefabを
Hierarchyにドラッグアンドドロップで追加

次に、HoloToolkit > Input> Prefabsの中にあるInputManager.prefabを
Hierarchyにドラッグアンドドロップで追加
次に、HoloToolkit > Input> Prefabs > Cursorの中にあるBasicCursor.prefabを
Hierarchyにドラッグアンドドロップで追加
HierarchyからCreate > 3D Object > CubeでCubeを作成
Cubeの位置を見やすい位置に移動してください。(今回は x:0 y:0 z:7)
次に、HoloToolkit > Input> Utilities> Cursorの中にある
HeadsUpDirectionIndicator.prefabを
Hierarchyにドラッグアンドドロップで追加
HierarchyのHeadsUpDirectionIndicatorを選択し、Inspectorの
TargetにHierarchyのCubeをセット
なんと、作業はこれで完了、Unityを実行してみると、
こんな感じでオブジェクトに矢印が表示されます。
video
しかし、この方法では、問題がのこります。
そう、HeadsUpDirectionIndicatorのTargetには
1つのオブジェクトしかしていできません。

それでは、2つ以上のオブジェクトの場合の対応法をみていきましょう。
HeadsUpDirectionIndicatorを選択、右クリックでDeleteを選択し削除します。

HierarchyからCreate > 3D Object > SphereでSphereを作成
CubeとSphereの座標を見やすい位置に移動。(cubeは x:1 y:0 z:7、Sphere x:-1 y:0 z:7)

HierarchyからCreateを選択、InspectorのAdd ComponentでDirectionIndicator.csをアタッチ
アタッチされたDirectionIndicatorのCursorにHierarchyのBacicCursorをセット
HoloToolkit > Input> Utilities> PrefabsのHeadsUpDirectionIndicatorPointer.prefab
DirectionIndicatorのCursor Indicator Objectにセット
HierarchyのSphereも同じ手順で、同じ設定を行ってください。
これでUnityを実行してみると、こんな感じで、
オブジェクト一つ、一つに対してマーカーがつき矢印もオブジェクトの方向に向きます。。
video
ただ、見ていただいてもわかるように、矢印がかなり、大きく不格好です。
また、オリジナルのマーカーを表示したいという欲求もうまれてきます。
なので、次に、マーカーを変更してみることにします。
まずは、お好きな画像を用意。

ここでの説明は、僕がかなり適当に作った arrow.png、star.pngを使って説明します。
まずは、この画像をUnityのProjectに追加、
HierarchyからCreate > 3D Object >  QuadでQuadを作成
Quadを選択し、Projectに追加したarrow.pngをドラッグアンドドロップで追加
QuadをArrowに名前を変更後、HierarchyからProjectにドラッグアンドドロップでPrefabに
HierarchyのArrowは削除してください。
HierarchyのCubeを選択、InspectorのDirectionIndicator
Cursor Indicator ObjectにPrefab化したArrowをセット

同じ手順でStar.pngをQuadに追加、StarのPrefabを作成
SphereのDirectionIndicatorほうにはCursor Indicator ObjectにPrefab化したStarをセット
これでUnityを実行すると、こんな感じでです。
video

画像があまりに適当すぎて、わかりずらいのですが (;^_^A アセアセ・・・
Cube、Sphereにそれぞれ、独自のマーカーが適用され
それぞれのオブジェクト方向に向きます。

マーカーが青色に変わるのは、DirectionIndicator.csの
DirectionIndicatorColorが適用されているためでこちらの色はInspectorで変更可能です。

HoloToolkit > Utilities > Tests > Scenesに
HeadsUpDirectionIndicator.unityというサンプルがあり、
こちらは、HeadsUpDirectionIndicator.csを利用しています。

HeadsUpDirectionIndicator.csは、HeadsUpDirectionIndicator.prefabにも
利用されているスクリプトでDirectionIndicator.csとの違いは
HeadsUpDirectionIndicator.csのTargetに対してオブジェクトをアタッチします

こちらの手法でも、もちろん今回のようなサンプルでは大丈夫かと思いますが、
動的にコードでオブジェクトをInstantiateする場合は
オブジェクトに対してDirectionIndicator.csをアタッチし、
それをPrefab化したものをInstantiateする方法が適していると思います。

2017年3月6日月曜日

HoloLensの開発効率化 KeywordManagerを利用して、超簡単にVoice Commandを実装しよう

お疲れ様です。ZuQ9->Nnです。 
今回はVoice Commandに挑戦です。

Voice Commandは、academyの101Chapter 4 - Voiceでは
KeywordRecognizer を使った実装が紹介されています。

HoloToolkit-UnityにはKeywordManager.csというスクリプトが用意されており
これを利用することで、簡単にVoice Commandを実装することができます。

まずは、HoloToolkit-Unityのインストールとプロジェクトの設定
今回は、Voice Commandを利用するので
UnityのHoloToolkitメニュー Configure > Apply HoloLens Capability Settingをクリック

Apply HoloLens Capability SettingsのMicrophoneのチェックをお忘れなく

UnityのHierarchyからCreate > Create Emptyで空のGameObjectを作成
作成したGameObjectを選択 Add Componentで
KeywordManager.csをアタッチメント
名前のよく似たKeyboardManager.csも存在するので
間違い無いように注意!!

今回は、Voice CommandでCubeとShpereを特定の座標に作成することにします。
UnityのProjectからCreate > C# Scriptで新しいScriptを作成
Script名はObjectCreator.csとします。

ObjectoCreator.csの中身はこんな感じ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectCreator : MonoBehaviour {

    public void CreateSphere()
    {
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = new Vector3(-0.5f, 0, 3);
        sphere.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
    }

    public void CreateCube()
    {
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.transform.position = new Vector3(0.5f, 0, 3);
        cube.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
    }
}

UnityのHierarchyでGameObjectを選択、Add Componentで作成した
ObjectCreator.csをアタッチメント


GameObjectにアタッチメントされているKeyboardManagerの
Keyword And Responsesのsizeを2にを入ると
Element 0、Element 1が表示されます。

Element 0のKey Cordにhi、Key CodeにCをセット
ResposeのList is Emptyの+マークをクリック

Runtime Onleyの下のNone(Object)をクリックし、GameObjectを選択

No Functionのドロップダウンリストをクリックし
ObjectoCreatorのCreateCubeメソッドを選択

Element 1には、ぼぼ同じ手順で
のKey Cordにya、Key CodeにSを
Response()のRuntime Onlyには
ObjectoCreatorのCreateSphereメソッドを選択

なんとこれでVoice Commandの実装完了
Unityを実行します。UnityではKey Codeに設定した
Cを押すとCubeがSを押すとSphere作成されます。

KeywordやKey Codeは
かならず、今回と同じでないと動かないわけではなく
別に何を設定しても問題ありません。
自分がわかりやすいものを設定してください。
また、コード内のcube、Shpereの座標も任意で大丈夫です。
実機で動かすとこんな感じ、
video

hiというとcubeがyaというとsphereが作成されます
ちなみに、いちいち実機にインストールしなくても
HoloLens Emulatorでも確認できます。

実質的に開発者はVoice Commandそのものの実装ではなく
Voice Commandの後に何をしたいかという目的の
コードを書いてアタッチメントし呼び出すだけで良く
コンテンツの作成に注力できるように工夫されています。

なお、Voice Commandは、ISpeechHandlerの
OnSpeechKeywordRecognizedをオーバーライドすることでも実装できますが
今回のような複数のVoice Command場合
Voice Commandとメソッドが一対一になり、分岐処理がなくなり
追加、修正、削除が簡単になるのではと考えています。

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上でぱっと確かめるためという意図をこめ効率化としました。
これによって、壁や天井にオブジェクトを張るのが容易になり
今後の開発がスピードアップできればと考えています。

2017年2月13日月曜日

HoloLensの開発効率化 ノンコーディングで頭の移動に追随するオブジェクトを作成する方法

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

HoloToolkit-Unityを利用すれば 
またもノンコーディングで頭の動きに追随して 
移動するオブジェクトが作成できます。 

いつものように、HoloToolkit-Unityをインストール 
プロジェクトとSceneの設定を行います。 

Hierarchyのcreate > 3D Object > CubeでCubeを作成 
Cubeの座標をCameraに移るように移動(今回は x:0 y:0 y:7) 

Cubeを選択しAdd Componetをクリックし 
Tagalong.csを選択してアタッチ

これで完了です。Unityで実行して右クリックで 
頭の位置(Unityではカメラの位置)を移動させると 
Cube追随して動いてくれます。
video

実機でも動いたのですが何故か動画撮影中だと動かなくなりました。。 
なにか設定が必要なのでしょうか?? 
ちなみにSphereBasedTagalong.csをアタッチしても同じように動きます。 
これは名前から察するにSphere専用なのでしょうか? 
特にSphere以外にアタッチしても問題なく動きました。 
使い分けを勉強するとともにTagalong.csの中身も読み込んだほうがよさげですね。

2017年2月4日土曜日

Tokyo HoloLens Meetup vol.1 に参加

お疲れ様です。ZuQ9->Nnです。
2017/02/02(木) Tokyo HoloLens Meetup vol.1 が開催されたので参加しました。
場所は、イベント&コミュニティスペース dots.

すでに、各メディアにもその熱狂ぶりが伝えられ
もはや説明の必要もないくらいのお祭り騒ぎのイベントでした。

どうしても、ハンズオンが受けたくて参加したんですが、
これ平日の昼間のイベント、
さらには、持ち物にHoloLens実機 (みなさんのmy HoloLens)との条件があるなか
申込時でも約60人程度が集まる盛況ぶり。。

33万もする端末を、気軽に買う人がこんなにもいるのか??
皆さんお仕事大丈夫なの??といろいろツッコミどころはありますが。。。

開場時間の15:00ギリギリに入ったためか、すでにほぼ満席状態。
しかも、皆さんの、持ち物が多く、席に座れるのか??といった状態でした。

基本は、こちらのkaorun55さん資料に沿った形で進められました。



僕は、前準備もしていましたし、札束のアプリを作成したときにも
やっていた感じだったのですが、あの会場の異様な雰囲気からか
完成した時には、やたらと楽しくてしかたかりませんでした。

16:00くらいからいったん休憩、モクモクタイムを挟み。
17:00からは、いよいよSharing機能体験
個人的には、こちらがとても楽しみにしていました。
やはり、個人で33万もするHoloLens複数台所有するのは厳しいので
これを逃がすと、絶対に損だなと思っていました。

さすがに、この人数では、なかなか手間取っていた感じなのですが
僕は無事に成功。。複数台つないで、世界が広がる端末って本当に面白いですね。

18:30からはMeetup HoloLensが気になる人、全員集まれってことで
こちらは100名ほどの申し込みがありました。

実は、なんとか各発表者の内容をうまくまとめようと試みていたですが
Sharing以降は、てんやわんやの大騒ぎ。。
人数も増えて、ますますヒートアップ状態。
僕自身もその雰囲気に飲まれてしまい。もはや頭の中が真っ白な感じに。。
発表内容をきちんとメモることもできませんでした。。

ハロウィンやお正月に渋谷に集まって、お祭り騒ぎをテレビで見ますが
あれの、小規模な、一種の異様にテンションだけが高いカオスな雰囲気でした。

Meetsupで印象に残ったお話といえば、
HoloEyes 株式会社 杉本 真樹さんのお話、
医療現場ではすでに導入の状態にあるようです。
多分、ごく普通に使われるようになるんでしょうね。

また、HoloLensで録画した熟練の医師の動画が
医療教育のコンテンツになるという話をされていて。
すべての人をCreatorsと言っているMicrosoftの戦略的にも
一役買いそうな興味深い内容でした。

Myハチ公を作成し話題となった、坪倉 輝明さんの
「HoloLensは夢のあるデバイスではあるが、万能ではない!」の言葉には
僕もとても同意しています。体感するとわかるのですが
あの視野の狭さは、かなり残念ですし、大勢の人には伝わらないません。

僕自身も、実は、HoloLensの第一印象は、最悪で、
なーんだ、これだけ。。意外に、つまらない??
PV詐欺もいいところ。。だったんですが、
それが33万も自腹で払って実機を買ってしまったり
開発を始めて技術情報をブログにだしたりと。

kaorun55さんの 「HoloLensで人生が変わった人の話」ほどではないにしろ
確実に行動を変えられ来ています。それほどに、人を引き付け魅了する何かが
この端末には確実にあります。それが証拠に、僕のような人間が
こんなにも多く、平日の昼から集まるのですから。。

帰えるときには、参加するだけで、何もしていないにもかかわらず
かなり疲れた状態になっていましたので、主催者やメンター
スタッフの皆さんの、ご苦労は相当なものであったろうと思います。
ご苦労様でした。そして何より、ありがとうございました。


2017年1月30日月曜日

HoloLensの開発効率化 Unityから直接アプリをインストールする方法

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

UnityでHoloLensの開発してアプリを実機にインストールする場合
いちいちUnityからUWPにbuildしてVisual Studioを開き 
Visual Studio側でCPUの設定をX86に変更する等 
とかく面倒な手順が発生します。 
これもHoloToolkit-Unityを使えば、手間を省くことができます。
 
まずは、HoloToolkit-Unityをインストール 
プロジェクト、Sceneの設定を行います。 
きちんとSceneをセーブし、UnityのBuild Settingsで 
インストール対象のSceneを選択してください。


HoloToolkit-Unityをインストール しているとUnityにHoloToolkitが表示されます。
UnityのメニューのHoloToolkit > Build Windowを選択 


Build Windowのメニュー Deployの username passwordを設定
(username passwordは現在利用しているWindows PCの username password)

HoloLensの実機をUSBでWindowsにつないで、
SLNの Build SLN, Build APPX, then Installボタンを押せば
HoloLensの実機にアプリをインストールすることができます。 

ただし、アプリがインストールされるだけで、自動で起動したりしないので 
アプリを起動したい場合は Build Windowのメニュー Utilitiesの 
Launch Applicationボタンを押してください。

また、Unityでアプリの内容を変更した場合は  
再度Build SLN, Build APPX, then Installボタン、Launch Applicationボタンを押し
再Build、再Install、アプリの起動のし直しが必要になります。
今までの手順よりだいぶお手軽ですが 、これなら
Holographic Remoting Playerのほうが便利そうですね。

2017年1月26日木曜日

HoloLensの開発効率化 ノンコーディングでHoldできるオブジェクトを作成する方法

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

HoloToolkit-Unityを利用すれば
なんとノンコーディングでオブジェクトのHold
つまりHolo内で掴んで移動させられる
オブジェクトを作れるようになります。

まずは、 HoloToolkit-Unityをインストール
プロジェクトとScenesの設定をきちんと行います。

HoloToolkit-Unityの
Input > Prefabs > InputManger.prefabをHierarchyに追加

Hierarchyのcreate > 3D Object > CubeでCubeを作成
Cubeの座標をCameraに移るように移動(今回は x:0 y:0 y:7)
Cubeを選択しAdd Componetをクリックし
HandDraggable.csを選択してアタッチ
これで完了です。Unityで実行し、
Shiftを押すと青い指マークがでますので
Cubeを選択し、マウスをクリックするとHoldで移動させられます。

video


実機で動かすとこんな感じになります。
video

例によって、HoloToolkit-Unityは、いつ変更されるかわからないのですが
とりあえず、現在のところは、これで問題ないかと思います。