2017年8月23日水曜日

fastlane勉強会 vol4 に参加

お疲れ様です。 ZuQ9->Nnです
2017/08/22(日) fastlane勉強会 vol4 が開催されたので参加しました。
場所は株式会社Origami さん
実はこの勉強会は何度お参加しているのですが
今回の目的は勉強会の参加ってよりも、自分の発表です。

発表内容はFabricでfastlaneを使ってみるというもの

前から気になっていたので今回、自分の勉強もかねて
どこまでこのツールが使えるかを検証したかったのでこのテーマを選びました。

発表が久しぶりすぎて緊張しすぎてしまい。かなりグダグダになってしまいましたね。
発表中もFabricとfastlaneの話がまじってしまい。
自分の中で混乱してしまう感じでした。
あと、自分の発表に集中しすぎて、他の方の発表を集中して聞けなかった。orz..

特にmatchあたりは、現状きちんと使えて無いので
もう一度資料だけでも読み直しておきます。

あーなんだか悔しぃ。。リベンジしてぇって感じ。
あと、もう少し余裕も欲しいですね。
懇親会も料理の写真撮っておけばよかった。ここに載せられたのに。。

また、宣言して自分を追い込むかなぁ。
最近こんな感じでしか行動できてないけど。。
また、その時の気分、ノリで決めたいと思います。

最後に、今回の発表の機会をいただけて大変ありがとうございました。
これを糧に次のステップに進めるように精進します。

2017年6月4日日曜日

HoloLens開発 SpatialUnderstanding事始め 空間検知と空間内の情報(天井、床、壁)の判定まで

お疲れ様です。ZuQ9->Nnです。
久しぶりのHoloLens開発の進捗。
今回はSpatialUnderstandingです。

SpatialUnderstandingはクラス名、メソッド名が長くまた公式のサンプル
HoloToolkit-Examples > SpatialUnderstanding > SpatialUnderstanding-FeatureOverviewの
中のコードもかなり多めで解析が困難です。
ですから、まず空間検知と空間内の情報(天井、床、壁)の判定までを行っていきます。

今回は、Unity 5.6.1f1 (64-bit)
HoloToolKit-UnityはGitHubの最新を取得して行いました。

Unityのプロジェクトを作成し、
HoloToolKit-UnityとHoloToolkit-Testsのフォルダーを追加してください。

UnityにHoloToolKitのメニューが表示されますので
Configure > Apply HoloLens Project Settingsを選択
表示されたメニューをそのままApply > YES

プロジェクトの設定が終わったら再びUnityにHoloToolKitのメニューから
Configure > Apply HoloLens Capability Settingsを選択
Spatial PerceptionをチェックしApply

次に、 HierarchyのMain cameraを右クリック
メニューからDelelteで削除します

Project内のHoloToolkit > Input > PrefabのHoloLensCamera

続いてInputManager、

HoloToolkit > Input > Prefab > Cursorの中のCursor

HoloToolkit > SpatialMapping > Preabsの中のSpatialMapping

HoloToolkit > SpatialUnderstanding > Preabsの中のSpatialUnderstandingを

それぞれHierarchyに追加

HierarchyのSpatialMappingを選択し、Inspectorの
Object Surface Obsever Room Modelのプロパティをクリック
MediumRoomWithHomeFurnitureを選択しセット

Spatial Mapping ManagerのDraw Visual Meshesのチェックを外します。


この段階でいったんUnityを実行してみると。
こんな感じて空間検知が実行されメッシュが表示されます。

SpatialMapping同様、空間検知だけならノーコーディングでできてしまいます。

次にHierarchyのCreateから 3DObject > 3D Textを選択し追加
3D TextのInspectorで見やすい位置、設定にしてください。

今回はTransformのpositionをx:0 y:0 z;40
Text MehのAnchorをMiddle Cneter AlignmentをCenter
Font Sizeを30に設定しました。(ここはご自由にお好きな設定にしてください)


つづいて3D TextのInspector Add ComponentでTaglongと

BillboardのScriptを追加します

ProjectのCreateからC# Script、スクリプトの名前を
SpatialUnserstandingTestとします。

SpatialUnserstandingTestの中身はこんな感じ

using UnityEngine;
using HoloToolkit.Unity;
using System;

public class SpatialUnserstandingTest : MonoBehaviour {

    public TextMesh textMesh = null;
    public float kMinAreaForComplete = 50.0f;
    public float kMinHorizAreaForComplete = 25.0f;
    public float kMinWallAreaForComplete = 10.0f;

    private void LateUpdate()
    {
        if (DoesScanMeetMinBarForCompletion)
        {
            SpatialUnderstanding.Instance.RequestFinishScan();
        }

        Vector3 rayPos = Camera.main.transform.position;
        Vector3 rayVec = Camera.main.transform.forward * 10.0f;

        IntPtr raycastResultPtr = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticRaycastResultPtr();
        SpatialUnderstandingDll.Imports.PlayspaceRaycast(
            rayPos.x,
            rayPos.y,
            rayPos.z,
            rayVec.x,
            rayVec.y,
            rayVec.z,
            raycastResultPtr);

        SpatialUnderstandingDll.Imports.RaycastResult rayCastResult = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticRaycastResult();
        textMesh.text = rayCastResult.SurfaceType.ToString();
    }
    private bool DoesScanMeetMinBarForCompletion
    {
        get
        {
            if ((SpatialUnderstanding.Instance.ScanState != SpatialUnderstanding.ScanStates.Scanning) ||
                (!SpatialUnderstanding.Instance.AllowSpatialUnderstanding))
            {
                return false;
            }

            IntPtr statsPtr = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticPlayspaceStatsPtr();
            if (SpatialUnderstandingDll.Imports.QueryPlayspaceStats(statsPtr) == 0)
            {
                return false;
            }

            SpatialUnderstandingDll.Imports.PlayspaceStats stats = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticPlayspaceStats();
            if ((stats.TotalSurfaceArea > kMinAreaForComplete) ||
                (stats.HorizSurfaceArea > kMinHorizAreaForComplete) ||
                (stats.WallSurfaceArea > kMinWallAreaForComplete))
            {
                return true;
            }
            return false;
        }
    }
}

最後に、HierarchyのCreateからCreate EmptyでからのGameObjectを作成

作成したGameObjectのAdd Componentで先ほど作成した
SpatialUnserstandingTestとのスクリプトをアタッチ

SpatialUnserstandingTestのText MeshにNew Textを設定

これでUnityを実行、マウスでぐりぐり視線を動かすとこんな感じで
Testに空間の情報が表示されます。
video

それでは、SpatialMappingとSpatialUnserstandingとの相違点は何かといことですが
僕の理解では下記の点かとおもいます。(間違っていた場合はご指摘ください。)

*メッシュの形状が異なる
   これは一目瞭然なのですが、SpatialMappingは、かなり、
    ガタガタなメッシュが表示されるのに対し
 SpatialUnserstandingは場所によっては、
    とても綺麗なグリッド状のメッシュが表示されます。

*メッシュの構築プロセスが異なる
    これは文章で説明するとわかりにくいのですが、SpatialMappingは実行して
    時間がたてば行動しなくてもメッシュの情報が構築されていきます。
     SpatialUnserstandingは動画で示した通り、実行しただけでは、
     少ししかメッシュが表示されず
     積極的に視線を動かしていくことでメッシュの情報が構築されていきます。

*SpatialUnserstandingは直接、空間内の情報(天井、壁、床)を判別できる。
     SpatialMappingはSurfaceMeshesToPlanes.csのMakePlanesメソッドを実行し
     SurfacePlaneオブジェクトを生成しないと空間内の天井、壁、床を判別できませんが
     SpatialUnserstandingは視線の先の情報を直接判別することができます。

*空間内で判別できる情報がSpatialUnserstandingの方が多い
     SpatialMappingは、SurfacePlane.csにPlaneTypesのenumで定義されている
     Wall、Floor、Ceiling、Table、Unknownの5種類しか判別できないのに対し
     SpatialUnserstandingは、SpatialUnderstandingDll.csの
     内部クラスRaycastResultのSurfaceTypesのenumで定義されている
     Invalid、Other、Floor、FloorLike、Platform、Ceiling、WallExternal、WallLikeの8種類です

*SpatialUnserstandingでは定義以外の空間内情報を独自定義することができる
     MicrosoftのSpatialUnserstanding公式のサンプルでは
  ChairやCouch(ソファーのような長椅子)を独自定義し利用しています。

*SpatialUnserstandingでは空間内にオブジェクトを生成する便利関数が存在する
     HoloToolkit > SpatialMapping > Script内に
 SpatialUnderstandingDllObjectPlacement.csのスクリプトが用意されていて
     Create_OnFloor、Create_OnWall、Create_OnCeilingという、
     いかにもオブジェクトの生成を助けるような便利関数が存在しています。

これらを見ていくと、今回おこなった空間検知、空間内の情報の判別を行った後
最後のお便利関数を利用してオブジェクトを配置してくといった
処理の流れになるかと思います。

SpatialUnderstandingは、やはりコードも長く複雑な印象が強く
苦手意識が強くなりますが、今回くらいの内容であれば
意外と怖くないかも?っておもってくれる開発者が多くなるといいなぁと考えています。

SpatialUnderstandingは情報も少なかったので
個人的に参考にした記事のリンクも張っておきます

Indubitable Development
HoloLens Tutorial – Spatial Understanding

El Bruno
#Hololens – Spatial Understanding vs Spatial Mapping, and a step-by-step on how to use it

Mike Taulty
Hitchhiking the HoloToolkit-Unity, Leg 14–More with Spatial Understanding
https://mtaulty.com/2017/05/03/hitchhiking-the-holotoolkit-unity-leg-14-more-with-spatial-understanding/

2017年5月1日月曜日

とりあえずつかってみた、次世代ゲームエンジン Xenko プロジェクトの作成からRigdbodyでSphereを落とすまで

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

最近UnityやHoloLensに関してまったく進捗があがらないまま
時間のみ過ぎていき、焦りと無力さばかりがつのる悶々とした日々

ゴールデンウイークはエンジニアの新技術研究期間?みたいなノリがあるので
今回、気晴らしもかねて次世代ゲームエンジンとされるXenkoをつかってみました。

Xenkoは2017/04/25にリリースされたばかりの新しいゲームエンジンで
シリコンスタジオという会社が開発、リリースを行っています。

特徴は、なっといっても、XenkoそのものがGitLabでオープンソースで開発されている事
そして、エンジン部分がC#で実装されてることかと思います。
ここら辺が「次世代」と言われているのかなって個人的には思います。

さっそく使ってみたので、プロジェクトの作成から、
RigdbodyでSphereを落とすまでをみていきたいと思います。

本来なら、インストールとかもやるべきかなぁと思ったりしたのですが、
それは、ほかの誰かが必ずやるだろうと思うので省略します。(*^^*)

勘違いしていたのですが、Xenkoそのものは、
setup.exeでWindows用しか公式には提供されていません。
現状はMacでは動かせないようです。

ちなみに、僕が普段使っているWindowsマシーンは
第四世代Intel Core i5、メモリ8G
Windowsは、64bitのWindows 10 Proです。
そちらでは、とくにインストールにはまることもありませんでした。

Xenkoをインストールするとlauncherが出てきますのでそちらをクリック
launcherが起動したらStartをクリック
Project Selectionの画面でNew ProjectのNew Gameを選択
(今回は保存場所とプロジェクト名はデフォルトのままですが
こちらは自由に変更しても問題ありません。)
プロジェクトのターゲットはWindows、Linx、UWP、Android、iOSとなっています。
Unityと違って、Web PlayerとかWebGLのサポートは現在のところ全くありません。

今回はとりあえずWindowsのみを選択しOKをおしました。
起動すると、こんな感じの画面で、メニュー等は
日本語化されていてなんだか安心感がありますw



すでにGroundのPlaneとSphereがデフォルト表示されています。
XenkoのページにXenko for Unityという
Unityとの比較がのっていて、各種のビューの名前がのっていますので
今回は、説明を割愛します。(;^_^A

Asset EditorのSphereを選択すると、Grid Propertyが
Sphereのプロパティに切り替わります。
Add Componentボタンありますのでそちらをクリック
つづいてRigdbodyを選択
そうすると、SphereのPrpoerty GridにRigdbodyのコンポーネントが追加されています。
オブジェクトに対してコンポーネントを追加していくのは、かなりUnityと似ていますね。

SphereのRigdbodyのコンポーネントのGravityをみると
なぜかX,Y,Zが指定できるようになっています。。
とりあえず、そのまま実行してみたところ。。なにも起きませんでした。
よくみると without any collider shapeというエラーがでていました。
これはRigdbodyのコンポーネントだけではなく
Colliderのコンポーネントを追加しないとダメなようです

SphereのRigdbodyのコンポーネントPrpoerty Gridの一番下に
Collider Shapesというプラスボタンがあり、そちらのプラスボタンをおすと
色々なColliderが選択できます。今回はSphereを選択しました
ここで気を取り直して、再びアプリを実行。。
動画が見にくくて申し訳ないのですが、
Unityのようにゲームビューで実行されず、
いったんWindowsのアプリとして別のWindowが起動します。
これは、少し不便ですね。。

あと、特にGravityのx,y,zの値は入れなくても下に落ちましたし
逆にxに値をいれてみても、実行結果に変化はありませんでした。

3Dのモデルはデフォルトでは、
ToursやTeapodなどUnityにはないものが用意されています。


おそらく、Asset Storeでの資産が大きく、すぐにUnityから乗り換えて
実務でガッツリ使うぜってノリで使えなかと思いますが
今回のように、とりあえず、試すには面白いツールかと思いました。

まだまだ今後の進化に期待ってところも多いですが
新しいツールの登場により、開発者の選択肢が広がるのは良いですね。
今後触り続けるかは、僕的にも少し微妙かな。。
ゴールデンウイークは時間が許す限りお遊びしてみます。(;^_^A


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する方法が適していると思います。