ウラデブ

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

蜘蛛を遮蔽してみよう 〜 ワキワキさせてみたよ

ども、ウラさんです。
前回蜘蛛ちゃんを貼り付けてみたのですが、遮蔽されてないので裏側が見えちゃって恥ずかしいので遮蔽させてみます。

 

f:id:urasansan:20170410111349j:plain

えぇ、結局蜘蛛のまま行きますよっ!

 

HoloToolkitに遮蔽するシェダーが用意されてるのでそれを使えば良いだけみたい。
とりあえずSpatialMappingで試してみる。

f:id:urasansan:20170410111918p:plain

こんな感じでWireframeになってるのを、Occlusionに変えてあげると。

f:id:urasansan:20170410112158p:plain

f:id:urasansan:20170410112209p:plain

はい、メッシュの向こうにある板が描画されてない。
素敵っ!

って事で、前回作った壁や天井にこいつを設定してやれば良いだけですな。

f:id:urasansan:20170410112502p:plain

壁と床と天井のマテリアルをOcclusionにする。
んで、見えると邪魔だって消したのを戻す。

f:id:urasansan:20170410112648p:plain

今回は、テーブルとかは無視なので壁と床と天井だけ表示にする。
あとは前回のままで実行すると・・・

f:id:urasansan:20170410112917p:plain

あら、ちゃんと遮蔽されてる。
楽過ぎるな・・・



まぁ、これだけなんですが、蜘蛛ちゃんのアセットにアニメーションが入っていたのでUnityの勉強がてら動かしてみました。
せっかくなので蜘蛛っぽくワキワキ動かしてみたので動画でどうぞっ!


キモっ!!!
予想よりも遥かにキモくなったぞっ!
まぁでも、壁に遮蔽されてるの確認出来るでしょ?
ちゃんとHoloLensになったね。

ちゃんと壁の大きさを考慮して蜘蛛ちゃんの動きを制御して、タップで撃ち落とせるとかすれば蜘蛛退治ゲームになるんじゃね?
地球防衛軍みたいなの作れるんじゃね?
キモいから作らないけどねっ!

って事で、
では、またっ!

 

次はキモく無いのにしようね・・・

壁とか天井とか床とかに貼り付けよう 〜 社内が蜘蛛だらけ

ども、ウラさんです。
前回、空間認識をして部屋の壁や床を作れるようになったのでそこへオブジェクトを置いてみます。
壁とか天井に張り付いてて違和感無いのは何かなぁー・・・って考えながらアセットストアを見てたら丁度よいのが無料であったのでそいつにしました。

 

f:id:urasansan:20170405142047j:plain

 はい、蜘蛛ちゃんですねっ!

蜘蛛かヤモリならそこら中に這い回っててもなんら違和感ないですねっ!
キモいですねっ!
蜘蛛が苦手な方には最低な記事になってますねっ!
すみませんっ!っと。



さて、前回のプロジェクトを使って行きます。
SurfaceMeshesToPlanes_MakePlanesCompleteで壁とかが生成された後に

	List<GameObject> walls = new List<GameObject>();
	walls = SurfaceMeshesToPlanes.Instance.GetActivePlanes(PlaneTypes.Wall);

てな感じで、壁や天井を指定してGameObjectのリストが取得出来るみたいです。
オブジェクトが取得できれば、後はUnityの知識ですね。

あるオブジェクトに垂直に張り付くようにオブジェクトを生成出来ればOKですね?
単純に考えればX軸を-90度傾ければ垂直になるでしょう。
ってな事で、

	Quaternion rot = wall.transform.rotation;
	rot.x -= 90;
	Instantiate(prefab,  wall.transform.position, rot);

こんな感じにしたけど、何か変・・・
しゃーない、調べるか・・・
Unityに関しては手探りでやってるだけなんだよなぁ、Unity好きじゃ無いし。

えーと、
「回転はクォータニオン使ってるから知識無い奴が直接値触っちゃダメよーっ!」
って事らしいです。
へーへー、こちとらクォータニオンなんぞ変態数学の知識は無いですよ、すみませんねぇーっ!
知識無い奴は関数使ってねーって事らしいので
Quaternion.Euler
こいつを使えば良いみたい。

	GameObject wall = GameObject.Find("wall");
	Quaternion rot = wall.transform.rotation * Quaternion.Euler (-90, 0, 0);
	Instantiate(prefab,  wall.transform.position, rot);

こんな感じで、Quaternion.Euler使ってX軸を-90度したのと合成すれば良いみたい。

ここまで出来れば、壁や天井は取得出来てるし、垂直に貼り付ける事も出来たので後は簡単ですな。

private void SurfaceMeshesToPlanes_MakePlanesComplete(object source, System.EventArgs args)
{
	RemoveSurfaceVertices.Instance.RemoveSurfaceVerticesWithinBounds(SurfaceMeshesToPlanes.Instance.ActivePlanes);

	SpatialMappingManager.Instance.DrawVisualMeshes = false;

	//	蜘蛛のプレハブ
	GameObject prefab = Resources.Load<GameObject>("spider");

	//	全ての壁に這わせてみる
	List<GameObject> walls = new List<GameObject>();
	walls = SurfaceMeshesToPlanes.Instance.GetActivePlanes(PlaneTypes.Wall);
	foreach( GameObject wall in walls ) {
		Quaternion rot = wall.transform.rotation * Quaternion.Euler(-90, 0, 0);
		Instantiate(prefab,  wall.transform.position, rot);
	}

	//	全ての天井に這わせてみる
	List<GameObject> ceilings = new List<GameObject>();
	ceilings = SurfaceMeshesToPlanes.Instance.GetActivePlanes(PlaneTypes.Ceiling);
	foreach( GameObject ceiling in ceilings ) {
		Quaternion rot = ceiling.transform.rotation * Quaternion.Euler(-90, 0, 0);
		Instantiate(prefab,  ceiling.transform.position, rot);
	}

	//	全ての床に置いてみる
	List<GameObject> floors = new List<GameObject>();
	floors = SurfaceMeshesToPlanes.Instance.GetActivePlanes(PlaneTypes.Floor);
	foreach( GameObject floor in floors ) {
		Quaternion rot = floor.transform.rotation * Quaternion.Euler(-90, 0, 0);
		Instantiate(prefab,  floor.transform.position, rot);
	}
}

こんな感じで、全ての面の中央に蜘蛛ちゃんを配置してみる。

 

f:id:urasansan:20170405144616p:plain

はい、出来た!
キモっ!!!
まぁ、でも、ちゃんと壁等に張り付いてるね、成功だね。

ただ、これだと実際の壁に張り付いてる感が無いので
SurfaceMeshesToPlanes
が作ってるPlanesを消してみます。

f:id:urasansan:20170405150805p:plain

これで良いのかしら・・・?

f:id:urasansan:20170405150938p:plain

透明になった。

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



キモっ!!!
まぁ、やりたい事は一応出来たね・・・
ただ、裏側が見えちゃってる蜘蛛ちゃんがいるね。
遮蔽されてないね、Hololensなんだからちゃんと遮蔽されて向こう側の壁の蜘蛛ちゃんは見えなくならないとダメだよね。

Occlusionとやらがキーワードだな、よし調べようっ!
では、またっ!

 


蜘蛛じゃなくてヤモリのが良いかなぁ・・・

 

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

ども、ウラさんです。
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で簡単に空間認識が出来ました。

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


では、またっ!

 

初めてのHoloLens開発 〜 樽から猫にゃん

ども、ウラさんです。
んでは、HoloLens開発をやってみよーっ!

完成品はこちら。

f:id:urasansan:20170301133037j:plain

樽からネコにゃんを出します。(なぜ?)

 

 んでは、環境構築から。
HoloLens開発の情報は結構あるので助かります。
ただ、バージョンが違ったりで既に古くなっている情報も多々あるので軽く書いときます。
ここの情報も直ぐに古くなっちゃう可能性も大ですがね・・・

 

ちなみに、「Windows10 Home」でやってます。
HomeだとHoloLensエミュが動かないのですが実機があるので問題なしです。

 

先ずは、「Visual Studio 2015 」をさくっと入れましょう。
VSが入ったら一度HoloLensで動く物を作るのが良いでしょう。
この段階で躓いてるとこの後のUnity入れてとかでどこが悪いのか分からなくなっちゃうので・・・

VSを起動して、新規プロジェクト作成で「空白のアプリ (ユニバーサル Windows)」を選択。
C++でもC#でもなんでもOK
出来たらビルドして、HoloLensで動かして完成ですっ!
コードなんて一切書かなくて良いです。
マウスでポチポチやれば良いです。
HoloLensはUWPアプリ(ストアアプリ)がそのまま動くので、HoloLens用に何もしなくて良いのです。
VSとHoloLensのペアリングだけすれば良いだけ。

この段階でうまく行かない場合は、VSのインストールオプションが間違ってるとかだと思うよ。(適当)

 

HoloLensでUWPアプリ動かしてもしゃーないので、ちゃんとHoloLensアプリ作りましょ。
って事で「Unity」入れます。
現時点で最新の「Unity 5.5.1f1」を入れました。
インストール途中なぜかエラーがでました・・・
UWPビルド関連のインストールに失敗してるみたい。(署名無しかな?)

とりあえず、続行してUnityのインストールを完了させて。
UnitySetup-Metro-Support-for-Editor-5.5.1f1.exe」を後から入れました。
なんだろ、他の人は平気なのかしら・・・?
無事にUnityが入ったら、「HoloToolkit-Unity」をここからダウンロードして解凍しときましょ。


Unityで新規プロジェクト作成して、HoloToolkit-Unityの「Assets」の中身をぶち込みます。

f:id:urasansan:20170301140313j:plain
「HoloToolkit-Examples」はいらないよ。



HoloToolkit-Unityがガンガン更新されてるようで、ここからの手順は色々と情報があったのですが、2016年3月1日の段階では以下方法で良いみたい。

f:id:urasansan:20170301141113j:plain

まず、HoloLens用の設定をしちゃいます。
「HoloToolkit」→「Configure」→「Apply Hololens Project Settings」
を開いて、「Apply」をポチっと。
Unityを再起動するぜーって聞いてくるので、再起動。

再起動したら。
「HoloToolkit」→「Configure」→「Apply Hololens Scene Settings」
を開いて、「Apply」をポチっと。

これで、設定は完了するみたい、かなり楽。

 


ゴリゴリ作る前にちゃんと動く環境か確認。
最初からシーンにある、「Main Camera」と「Directional Light」を削除。

f:id:urasansan:20170301142057j:plain

HoloToolkitの「HoloLensCamera」プレハブをシーンへ追加。

 

f:id:urasansan:20170301142158j:plain

HoloToolkitの「SpatiaMapping」プレハブをシーンへ追加。

 

「HoloToolkit」→「Build Windows」を開いて。
「Build Visual Studio SLN」をポチ。

f:id:urasansan:20170301142557j:plain

 

ビルドが終わったら、Visual Studioで開いてUWPアプリと同じように実機で実行。
メッシュが現れれば環境構築は成功って事で。
HoloToolkitですげー簡単に作れるっ!

 

無事動く事が分かったので、イベント取得しましょ。
エアタップが取れないと何も始まらないのでね。

f:id:urasansan:20170301144332j:plain
HoloToolkitの「InputManager」プレハブをシーンへ追加。

 

f:id:urasansan:20170301144402j:plain
HoloToolkitの「Cursor」プレハブをシーンへ追加。

スクリプトを書くので、「AirTap.cs」を作成。

using HoloToolkit.Unity.InputModule;
using追加して。

IInputClickHandler
ハンドラー追加して。

public void OnInputClicked(InputClickedEventData eventData)
こいつが、エアタップされたら呼ばれる。

 
gameObject.AddComponent<Rigidbody>();
こんなのをOnInputClickedに書けば、エアタップでオブジェクトに重力が適用される。

f:id:urasansan:20170301150907j:plain
アセットストアで拾ってきた無料の樽にスクリプト追加。


f:id:urasansan:20170301150943j:plain
メッシュが出来てから、樽をエアタップすれば地面にボコンって落ちてきますよ。


メッシュが邪魔なので

f:id:urasansan:20170301151148j:plain「Draw Visual Meshes」を切っとく。

イベント取得出来たのであとはUnityの知識ですな・・・
エアタップで樽からネコちゃんが飛び出すスクリプトをがんばって書けば良いだけです。
結構苦労したけど・・・

 


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

 

 

あら、かわいいっ!
HoloToolkitのおかげでかなり簡単に作れました。
すでにUnityゴリゴリな方なら大した苦労も無くHoloLensアプリは作れるでしょう。

ちなみに、「Hlographic Remoting」が便利なのでぜひっ!

f:id:urasansan:20170301154937j:plain
使い方はググる先生が教えてくれます・・・

 

さーて、Unityをちゃんとやるかなぁーっ!
では、またっ!

 

HoloLens初体験

ども、ウラさんです。
無事HoloLensが届いたので触って見るのです。
まずは、どんなデバイスなのか単純に体験してみましたー。

f:id:urasansan:20170223115445j:plain

開封の儀。
綺麗に収まってる、箱もしっかりと高級感ある・・・(まぁ、お高いので当然ですか?)

あまり予備知識を仕入れてなかったのですが、HoloLnes単品で完結してるのにまず驚いたっ!
Windowsが入っていて、PCに接続とか必要なく単品で機能してる。
なるほど、変な形のWindowsPCなのか・・・

初期設定をして深く考えずに遊んでみます。

 

f:id:urasansan:20170223115826j:plain

こんな感じで、みなれたアイコンが並んだメインウインドウを呼び出せる。
Windowsのスタートボタン的な扱いですな。
WindowsストアにはHoloLens用のアプリがあるので適当に入れてみます。

 

 

f:id:urasansan:20170223115937j:plain

机の上に、地図を置いてみたり。

 

 

f:id:urasansan:20170223120006j:plain

グッと地図に近づいてみたり。

 

 

f:id:urasansan:20170223120037j:plain

心臓むき出しの人を床に置いてみたり。

 

 

f:id:urasansan:20170223120216g:plain

ドラゴンと戯れてみたり。

 

 

f:id:urasansan:20170223120342j:plain

YouTubeで「恋ダンス」を踊ってみたり。

 

 

f:id:urasansan:20170223120424g:plain

バレリーナを卑猥な角度から眺めてみたり。

 

 

f:id:urasansan:20170223120543j:plain

バレリーナと一緒に「恋ダンス」を踊ってみたり。

 

あら、楽しいっ!!!

 

なにこれ、すげーっ!
初期設定さえ終われば、とくに面倒な事なく楽しめるっ!
変な形のストレージ容量64G(使えるのは54G)のWindowsマシンだこれっ!

まだ、日本語対応してないので日本語入力出来ないとか、コルタナさんが日本語理解してくれないのでネイティブな発音じゃないと全然認識してくれないとか、EXEは実行出来ないとかあるけど、たのしーっ!


楽しいのでメンバーにも体験してもらおうっ!

 

f:id:urasansan:20170223121311j:plain

f:id:urasansan:20170223121332j:plain

f:id:urasansan:20170223121341j:plain

f:id:urasansan:20170223121349j:plain

うわ、人がやってるの見ると変だ・・・
たっつんとか「ネコが上に、ネコが上に・・・」とかゆーてるし、怖い・・・

みんなご満悦っ!
おっくんは「いいなぁー、ほしいなぁ・・・」ゆーてるし。
VRだと直ぐに酔ってしまったスタッフも余裕で楽しんでる。

MRすげーぞ、HoloLensすげーぞっ!

電脳コイルの世界がこんなに早く実現するとはっ!
MSやるなぁ・・・

ちなみに、キャリブレーション時にコルタナさんの指示では5フィート(約1.5m)でやれと言われるけど、1mぐらいで調整した方が良い感じになるかと。
5フィートでやると視線マーカーが上に行き過ぎるので首が疲れます。

とりあえず、なんも考えずにHoloLensで遊んでみました。
めちゃくちゃ可能性の詰まったデバイスだこれ。

オラ、ワクワクしてきたぞっ!!!

バイスの特性も使い方も分かったので、開発してみよーっ!

 

って事で、ではまたっ!

 

HoloLensで遊ぼう

ども、ウラさんです。
本ブログではMicrosoftのHoloLensで色々と遊んで行きたいとおもっとります。
まだ、実機は届いていなのですがそろそろ届くでしょう・・・(多分)

 

既に色々と情報は出回っているので助かりますっ!

www.webprofessional.jp

 

qiita.com

docs.com

 

待ってる間にここを参考に環境構築だけしときます。
Visual Studioは既に入っているので、Unity入れて、Vuforia入れて・・・

HoloLens EmulatorはWindows10のHomeだと入らないのね。
Hyper-VがHomeには無いのか・・・
まぁ、実機が来ればエミュは必要無いんじゃないかと思うので入れなくていいやぁ!
必要になったらOSを上げましょう。

って事で、早く来ないかなぁ、HoloLens。

では、またっ!