Meta2 について(Unity SDK解説編)

Meta2のアプリ開発方法はUnityかOpenVRの2択があります。しかし、OpenVRはまだ一部しか機能実装されてないようなので、現時点では実質Unity一択と考えて良いと思います。

今回は、MetaのUnity SDKを調べて、構成や使い方を整理してみました。

これまでの開封編、環境構築編は下記をご覧ください。

magicbullet.hatenablog.jp

magicbullet.hatenablog.jp


なお、以下のバージョンで検証しています。

Windows 10 Pro (Version 1703, OS build 15063.726)
Unity5.6.3p1
Meta SDK 2.4.0.24

=====

目次

1. SDKのインポート

2. サンプルシーンから見たSDKの構成

2-1. Button Events (物理ボタンの入力を検出)

2-2. Gaze (オブジェクトを見る)

2-3. HandCubeInteraction (オブジェクトを手で触って操作)

2-4. HandTrigger (オブジェクトに手をいれたことを検知)

2-5. MetaInteractionHalo (オブジェクトを制御したときにハイライトする)

2-6. MetaLocking (オブジェクトの位置を示す矢印を表示?)

2-7. Mouse Cube Interaction (マウスを使う)

2-8. Reconstruction (いわゆるSpatial Mapping)

2-9. TurnTableSwipe (スワイプジェスチャの検知)

2-10. UGUIExample (uGUI部品の操作)

3. 終わりに

=====

1. SDKのインポート

前提として、Unity2017は未対応なのでUnity5で5.6以上を準備します。

下記のパスに移動して、Unitypackageをダブルクリックしてインポートします。

f:id:Takyu:20171118101559p:plain

C:¥Program Files¥Meta¥Meta SDK2 Beta¥Unity

インポートするとこのようになります。

f:id:Takyu:20171118101944p:plain


余談ですが、SDK2.3までは、Meta Home(※)からunitypackageのリンクに飛べましたが、2.4では削除されたようです。

※タスクトレイから起動できる、ポータルアプリです。

2.サンプルシーンから見たSDKの構成

意外なことに?Meta SDKはかなり親切で、サンプルシーンがたくさん入っていて、Meta2の操作が体験できるようになっています。

なお、Meta2アプリを作るときは、MetaCameraRig Prefabが必須です。その他、手を使う場合は、MetaHands、マウスやキーボードを使う場合はMetaInputModule Prefabを使います。


以下、構成や使い方を解説します。それぞれのタイトルはSDKのサンプルシーン名です。


2-1. Button Events

Meta2の物理ボタンを押したことを検出する機能のサンプルです。検出できるボタンは以下の赤枠で囲ったところです。

f:id:Takyu:20171118102201j:plain

f:id:Takyu:20171118102837j:plain

補足:スクリーンショットボタンにfuture releaseとありますが、ボタン入力自体は検出できます。


入力については、専用のイベントハンドラが準備されています。具体的には、Meta Button Indivisual Event BroadcasterというスクリプトをオブジェクトにアタッチすればOKです。


f:id:Takyu:20171118103241p:plain

Camera Eventsは、スクリーンショットボタン、Volume Up/Down Eventsは、音量ボタンに対応しています。

ボタンが押されたとき任意のメソッドを呼ぶには、uGUIのボタンイベントと同じように設定します。すなわち、呼びたいメソッドを含むスクリプトをアタッチしたオブジェクトをドラッグし、対応メソッドを選びます。

ちなみに、Volume Up/Downとありますが、以下のように音量を制御しているだけなので、音量以外で使うことも可能です。


gistdc19306fae34f0b8c68a9ce3fc54568a

2-2. Gaze

HoloLensや多くのVRと同じように、視界中心と一致する場所を検出します。

サンプルシーンではブロックが並んでおり、見つめたブロックの色が変わります。

補足:理由はわかりませんが、注視カーソルはありませんでした。


各ブロックにはGazeSampleScript.csがアタッチされています。
ここではOnGazesStart()とOnGazesEnd()がイベントハンドラから呼ばれることで、ブロックの色が変わるためのフラグが変更されます。


gist802c92f5b11eb221ce1be9a21124bae9

これらのメソッドは、UnityのIEventSystemHandlerを継承したIGazeStartEvent / IGazeEndEvent によってinterfaceの形で準備されています。

参考のため、Start側だけ記載しておきます。


gist16157744ed72548e4694462b8d63de1e


2-3. HandCubeInteraction

目の前にあるCubeオブジェクトをつかむ、動かす、拡大縮小、回転する、ができます。


これは、Meta2で制御したいオブジェクトに、操作に応じたInteraction スクリプトをアタッチすると制御できます。

該当するスクリプトは、GrabInteraction.cs、TwoHandGrabRotateInteraction.cs、TwoHandGrabScaleInteraction.csです。

f:id:Takyu:20171118152338p:plain


他の操作をしたいときは、下記の中にもスクリプトがあるので参考になると思います。

Assets/MetaSDK/Meta/Hands/HandInput/Scripts/Interactions



ちなみに、握ったときに何かの処理をさせたい場合、2-1のときと同様にuGUIのような処理をします。

たとえば、下記の場合、EventFunctionというオブジェクトに呼びたいメソッドが書かれたスクリプトがアタッチされています。

これをイベントハンドラで動作したい箇所にドラッグすると(①)、該当メソッドが選択できるので、選択します(②)。

f:id:Takyu:20171118153458p:plain



2-4. HandTrigger

手が領域に入ったことを検出するサンプルです。


検出してほしいオブジェクトにHandTrigger.csをアタッチして、これまでと同様にイベント登録するだけです。


f:id:Takyu:20171118154801p:plain


動画のように、片手と両手を検出できます。


2-5. MetaInteractionHalo

オブジェクトをGrabした、動かしている(Hoverしている)、何もしていないときに、オブジェクトの外側に色をつけるサンプルです。

いちおう、左側のCubeをGrabすると、Cubeの外側がピンク色になります。Meta2越しでは確認できますが、Unity Editor上では確認できませんでした。


色をつけたいオブジェクトに、InteractionObjectOutlineSettings.csというスクリプトをアタッチして色を設定するだけで、設定としては簡単です。

f:id:Takyu:20171118171012p:plain


2-6. MetaLocking


Meta2ヘッドセットの向きにかかわらず、特定の方向を示す矢印を表示させるサンプルです。

HoloLensだと、TagAlongが似ています。

サンプルでは、Meta2というQuadが円周軌道を描いて回っており、最初はこのQuadの動きに合わせて矢印が動くのかと思いましたが、オプションのHUD、Orbitalのどちらを指定しても動きませんでした。

この辺り、まだ理解ができていない可能性もあり、もし矢印で誘導するコンテンツを作る必要があったらまた調べてみたいと思います。

f:id:Takyu:20171118172541p:plain

ちなみに、CompassオブジェクトのScaleは初期値で0.2ですが、これだと視力検査の1.0以上の文字を見るみたいになってほとんど見えないので、Scaleは最低1以上がよいと思います。


2-7. Mouse Cube Interaction

マウス操作機能のサンプルです。このように、ヘッドセットのディスプレイ上でマウスを使うことができます。

実装方法はシンプルです。


このように、マウス操作したいオブジェクトにDragTranslate.cs、DragScale.cs、DragRotate.csのうち、好きなスクリプトをアタッチして調整します。

f:id:Takyu:20171118173300p:plain

なお、手をつかうときは、MetaHands Prefabが必要でしたが、マウス操作の場合はMetaInputModule PrefabをHierarchy Viewに配置します。


使うときはキーボードのF8を押して、Meta2の視界の中でのマウス操作を有効化します。この設定では、左ドラッグで移動、右ドラッグで回転、左クリックしながらホイールでz方向に移動、ができます。

2-8. Reconstruction

HoloLensでのSpatial Mappingと同等の機能です。
こちらは少し調査が必要ですので、確認次第更新します。

2-9. TurnTableSwipe

スワイプジェスチャー操作のサンプルシーンです。


TurnTableSwipeInteraction.csが、左右方向のスワイプを検出します。

f:id:Takyu:20171119141801p:plain

ソースを読んでみると、宣言では同じクラスを使っており、


gistefe20a744075a05b3dc6b6d3d0e263de


後工程で、右か左に応じた処理をしています。


gist14e4e13f79e9d67d163bdf568a402f9c



gist7ae746bf8f534a93d70830d02d2bb7f5



今回はスワイプによって、中華レストランの円形テーブル(Cylinderオブジェクトを縮めたもの)のようなものを回しています。

テーブルを回転させる処理は、後工程のRotateメソッドです。


gist19aa4192a209795b7a2382a91a69d6fe


もし、左や右の動きを検出したことで別の処理をしたい場合、TurnTableSwipeInteraction.csの中でStartCoroutine(Rotate(targetAngle));をコメントアウトし、Inspectorから任意のメソッドを呼び出す処理を書くと実現できます。

2-10. UGUIExample

uGUIの部品を操作できるサンプルです。

Meta Canvas Prefabをアタッチして、これの子オブジェクトとしてuGUI部品を追加するだけで、uGUI部品を手の操作、またはマウス・キーボード操作で制御できます。

f:id:Takyu:20171119071634p:plain

赤枠で囲った部分が、uGUIの標準部品をそのままアタッチしたものです。

あとは、手の操作用にMetaHandsとMetaInputModule Prefabを追加しておきます。


ただし、動画のとおりですが、若干精度が悪いです。ボタンを押すくらいなら高い精度で検出できますが、スライダーや選択ボタンはあまりうまくいきませんでした。

こういうGUI系の操作は無理に手でやるよりはマウスを使った方が確実かもしれません。


3. 終わりに

今回紹介したように、Meta2のジェスチャー操作は色々あります。また、SDKのサンプルコードはかなりわかりやすく書かれています。

基本的にはWindowsPCのデスクトップ(UWPではない)のアプリ開発と思ってよいので、VRコンテンツ開発の知見もそのまま使えそうです。


これまで開封編、環境構築編と続き、SDKの解説をしたことで、Meta2を使うための基本的な準備は整いました。あとは、Meta2がDeveloper kitという位置づけのためか、つまづくところが多いので、そういうところをまとめたTips集を作る予定です。