じゅころぐAR/VR

AR/VRメインのブログ。時々ドローン。

DaydreamでPointer Clickを実装する

Google VR for Unityに同梱されているGVRDemoを参考に、Daydreamのコントローラ操作を実装してみました。
本当はだいぶ前にやったんですが、ARCoreとか他のプラットフォームをいじっていたので、このタイミングで一旦まとめ。

開発環境

UnityおよびSDKのバージョンは以下です。

シーンの構成

GoogleVR/Prefabsから必要なPrefabを配置します。

f:id:jyuko49:20170911231004p:plain

GvrEditorEmulator.prefab

Unityエディタのエミュレータで視線変更を行うためのPrefabです。
シーンに配置することで、Alt+マウスコントロール、Ctl+マウスコントロールによるカメラの回転ができます。
実機での動作には、特に影響ありません。

Utilities/GvrFPSCanvas.prefab

配置すると画面上にFPSを表示してくれるPrefabです。
スマートフォンVRでのFPSは気になるので、開発時に表示させておくとよいと思います。

Controller/GvrControllerMain.prefab

Daydreamコントローラとの接続を行うためのPrefabです。
Unityエディタ上では、Controller Emulatorアプリが利用でき、"USB"または"WIFI"の接続設定が行えます。
※Controller Emulatorについては、過去の記事を参照。

UI/GvrControllerPointer.prefab

コントローラが指している方向をポインタ表示してくれるPrefabです。

UI/GvrEventSystem.prefab

コントローラを操作した際にイベントを発行してくれるPrefabです。

Pointer Clickイベントの実装

まず、カメラにGvrPointerPhysicsRaycasterをアタッチします。
これを忘れると、Pointer Clickイベントが取れません。

f:id:jyuko49:20170911232556p:plain

クリック対象のオブジェクトには、Rayの衝突を検知するCollider、イベント発生時に実行するScript、Event Triggerをアタッチします。

f:id:jyuko49:20170914004803p:plain

Event Triggerの"Add New Event Type"をクリックするとイベントの一覧が表示されるので、"PointerClick"を選択します。

f:id:jyuko49:20170912213520p:plain

Event TriggerにPointer Clickイベントが追加され、スクリプトの関数を紐付けられるようになります。uGUIでボタンに処理を紐付けるやり方と同じです。

GVRDemoではPointerの操作でCubeのテクスチャの色を変えたり、位置を移動させたりしていましたが、自作のデモではクエリちゃんmodel SD版を使い、キックモーションを実行するようにしました。

実際に追加したスクリプトは以下で、PointerClickイベント発生時にOnPointerClick()を実行しています。

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

[RequireComponent(typeof(Collider))]
public class QueryController : MonoBehaviour {

    private QuerySDMecanimController m_mecanimController;

    void Start () {
        m_mecanimController = GetComponent<QuerySDMecanimController> ();
    }
        
    public void OnPointerClick(){
        m_mecanimController.ChangeAnimation (QuerySDMecanimController.QueryChanSDAnimationType.BLACK_KICK);
    }
}

デモ実行

上記のシーンをUnityエディタ上で実行した動画です。

コントローラを動かすとポインタが動き、対象オブジェクトにポインタの光が当っている状態でタッチパッドをクリックすると、Pointer Clickイベントが実行されます。
実機(Zenfone AR)+Daydream View+コントローラでも動作は確認済みです。

Unityエディタ上ではFPSが出ていませんが、実行しているMac Bookが古いだけなので実機では60FPS出ています。

まとめ

Google VR for UnityのPrefabsを利用すれば、簡単なポインタ操作はすぐに実装できます。
Pointer Clickで動作するUIやシューティングゲームであれば、これだけでも十分動かせると思います。

とはいえ、インターフェースとしては物足りない感じなので、Daydream Elementsを参考に、よりリッチな空間UIを実装できるようにしたいところです。

WebARonARKitを試してみる

ARCoreのプレビュー版が公開されたことで、WebARによるARCore(Android)とARKit(iOS)のクロスプラットフォーム開発が可能となりました。

Getting Started with AR on the Web  |  ARCore  |  Google Developers

ARCoreはまだ対応デバイスが少なく、容易には試せない(※)ため、WebARonARKitによるWebAR開発環境を構築します。
※: ZenFone ARで無理矢理やってみた結果はこちら

f:id:jyuko49:20170904210625p:plain

環境構築

手順はGitHubのReadmeに記載されています。

github.com

ARKitを利用するためには、iOS11とXcode9が必要になります。
2017秋に正式リリースされるまでの間は、Appleデベロッパ登録することで、ベータ版での開発が可能です。

Apple Developer Program
https://developer.apple.com/programs/enroll/jp/
※登録には年額11,800円かかります

iOS11のインストール

ARKitはiOS11をインストールできる機種のうち、A9/A10チップを搭載した機種のみ対応になります。

iOS 11 betaは、以下のサイトからリストアイメージを取得して、iTune経由でインストールします。
Appleデベロッパ登録(有料)を行なったAppleIDでログインが必要です。

https://developer.apple.com/download/

Xcode9 Betaのダウンロード

iOS11 Betaと同じく、Appleデベロッパ登録を行い、ベータ版のダウンロードを行います。

https://developer.apple.com/download/

ベータ版は通常のXcodeとは別アプリとしてインストールされるため、共存ができます。

WebARonARKitのインストール

WebARは通常のSafariChromeでは動作しないため、WebARonARKitをインストールして動作確認を行います。
推奨環境としては、ARKitよりもさらに機種が少なく、iPhone SEとiPhone 6s / 6s Plusが記載されていません。

ただし、上記はあくまで推奨で、実際にWebARonARKitはiPhone SEでも動作しました。

インストールの準備として、WebARonARKitのGitHubリポジトリをcloneまたはzipダウンロードします。
“/WebARonARKit/WebARonARKit.xcodeproj"をXcode9 Bataで開き、通常のアプリと同様にビルド、端末にインストールします。

f:id:jyuko49:20170904205203p:plain

成功すると、WebARonARKitのアイコンが端末に表示されます。

f:id:jyuko49:20170904210501p:plain

サンプルの実行

WebARonARKitは、WebAR(three.ar.js)のコードでARKitを利用するためのブラウザアプリです。
アプリを起動して、WebARアプリケーションのURLを入力することで、ARKitの一部機能を利用することができます。

サンプルはGetting Started with AR on the WebのView the examplesに記載のURLから実行できます。
上記はARCoreの開発者向けサイトですが、WebARに関しては同一のサンプルがWebARonARKit(iOS)とWebARonARCore(Android)で動きます。

  • Boilerplate
    • AR表示に必要なコードのテンプレート、位置固定のboxを表示
  • SpawnAtCamera
    • 画面タッチで端末の位置にboxを表示、移動しながら配置すると軌跡になる
  • SpawnAtSurface
    • 画面タッチでhitTestを実行し、床にboxを移動
  • Reticle
    • hitTestを連続で実行し、画面中心に円を表示

今回はここまで。
WebAR(three.ar.js)のコードサンプル、解説は別の記事にまとめる予定。

余談

WebARと関係ないですが、Unityの環境も作りました。
Unity5.6.1p1以降にUnity ARKit Pluginを入れて 、Xcode9でビルドすれば動くっぽいです。

Unity ARKit Plugin
https://oc.unity3d.com/index.php/s/3hfM9T05P9vOpCf

↓2つ目の画像のがUnityサンプルのParticlePainter(空中に文字を書くやつ)

WebARonARCoreを未サポートのZenFone ARに入れてみた

ARCoreのプレビュー版が公開されたことにより、WebAR(three.ar.js)でARCoreとARKitのクロスプラットフォーム開発ができるようになりました。
ARCoreの機能に目新しさはありませんが、ライトなARをWebで作るという使い方は面白そうです。

Getting Started with AR on the Web  |  ARCore  |  Google Developers

早速試してみようと思いましたが、ARCoreができる端末が手元にないので、本記事執筆時点で未サポートのZenFone ARに無理矢理インストールしてみました。
結果として、ちゃんと動作はしませんでしたが、ARCoreとWebARの概要はなんとなくわかりました。

必要なアプリ

WebAR(three.ar.js)で作成したアプリケーションをWebARonARCoreというブラウザアプリで閲覧します。WebARonARCoreは、ChromeがWebARをサポートするまでの検証用ブラウザだと思えばいいかと。

WebARonARCoreを動作させるには、ARCoreというアプリが必要になります。
似たような名前なので、非常に紛らわしいです。

ARCoreのインストール

まず、ARCoreをインストールする必要があります。 GithubのReadmeにInstall the ARCore APKという項目があり、APKがダウンロードできます。

このAPKをインストールしようとすると、Tango Coreをアップデートするメッセージが出ました。

f:id:jyuko49:20170901012842j:plain

アップデート自体は問題なく行えますが、アップデートを行うとTangoの機能を使う処理でアプリ落ちが発生し、Tangoアプリが動作しなくなります。

ARCoreはTango Coreをより広いデバイスで使えるよう作り直し、Tangoの名称をARに置き換えたものなのかもしれません。
とはいえ、Tangoとしては機能がデグレするので、プレビュー版でZenFone ARがサポート外になっている一因なのだと思います。
少なくとも、ARCoreとTangoは全くの別物という感じではなさそう。

ちなみに、Phab2 ProにこのAPKをインストールしようとすると、インストーラが起動せずに落ちます。おそらく、Android7.0以上で作られているためだと思います。
ARCoreがAndroid7.0以上となった場合、Phab2 Proの扱いが気になるところです。

WebARonARCoreのインストール

同じくGithubのReadmeからInstall the WebARonARCore APKに記載のリンクでAPKをダウンロード、端末にインストールします。

こちらに関しては、ChromiumARのアップデートでした。 f:id:jyuko49:20170901012950j:plain

ChromiumARはTangoの機能をWeb(JavaScript)で使えるようにしたブラウザアプリで、TangoとARCoreの違いを除き、WebARonARCoreと似たような作りです。

github.com

getar.jp

ベースがTangoCoreからARCoreになったのに合わせて、こちらも機能は落ちている訳ですが、ARKitでも同一のWebARアプリケーションが動くようになっています。

examplesの実行

ARCoreサイトの Getting Started with AR on the WebページにView the examplesとしてリンクが貼られているので、このURLをWebARonARCoreに入力します。

動くには動きましたが、モーショントラッキングが安定せず、平面推定も動作しませんでした。
IMUの性能や配置など、ハードウェア周りで何か差異があるんですかね?
まあ、まともに検証できる状態ではないです。

Tango Coreの復元

諦めて、Tangoが使える状態に戻しました。

  • Tango Core(ARCoreでアップデートされたもの)をアンインストール
  • Google PlayからTango Coreをインストール
  • 端末再起動

上記の手順でTangoが動くことは確認済みです。 当然ながら、Tango Coreを戻すとWebARonARCoreは起動できなくなります。

f:id:jyuko49:20170901021957j:plain

まとめ

WebARの機能はあまり試せませんでしたが、ARCoreの位置付けがなんとなく見えてきました。

  • Tango Core → ARCoreとなっている
  • ChromiumAR → WebARCoreとなっており、ARCore版のWebAR対応ブラウザになっている
  • WebARonARKitも実装されており、同一のWebARアプリケーションがiOSでも動く
  • ARCoreはAndroid7.0以上ならインストールできそう
  • 対応デバイスでないとモーショントラッキングが安定しない(使いものにならない)

各アプリがTangoからのアップデートになっているということは、Tangoから移行されるものと考えた方がよさそうです。
スペック的には十分と思われるZenFone ARが非対応なのは、

  • 現時点で移行するとTangoから大きくデグレする
  • ラッキングでハードウェア間の差異を吸収できていない

の2点が課題になっていると思われます。

という訳でPixelやGalaxy S8を購入しないとWebARonARCoreは試せない状態ですが、クロスプラットフォームのメリットを活かし、iPhoneにiOS11 Betaを入れて、WebARonARKitでWebARを試す予定です。

ARCoreについて調べる

ARCoreの対応デバイスを持っていないため、公式サイトやTwitter等で収集した情報の寄せ集め。
個人的なメモに近いです。

ARCoreとは?

Googleが発表した新しいARプラットフォーム。
2017/8/29にプレビュー版としてリリースされた。

developers.google.com

対応デバイス

発表時点では以下の機種のみ。

Galaxy S8+は対応していないらしいので注意。
共通点として、Daydream ReadyのスペックでTangoに非対応(競合しない)。 メーカーはGoogle(製造はHTC)とサムスン

機能

AppleのARKitとほぼ同等と思われる。
Tangoとの差異として、デプスセンサを活用した高精度の点群データ(PointCloud)を扱えず、オクルージョンやメッシュ構成などはできないと思われる。

モーショントラッキング

端末を移動させてもコンテンツが留まって見える。 Tangoと比べてトラッキングエラーになりにくく、復帰が早いという噂があり要検証。

平面推定

任意地点(画面中心やタップ地点)の平面を検知して、3Dオブジェクトを接地した状態で配置する。

以下、体験者のTwitter等で調べた範囲の情報。

  • 床しか検知できない(壁や天井はNG)
  • 平面の検知はARKitに比べて速い
  • 複数の平面を同時に検知はできない(ARKitはできるらしい)
  • 平面の広さは取れない?(ARKitはできるらしい)

環境光推定

周囲の明るさに応じて、3Dオブジェクトのライティングを自動的に調整してくれる。

開発環境

  • Android Studio
  • Unity
    • Unity2017.2b9が必要
    • Androidバージョンは7.0が最小要件になりそう
  • Unreal
  • Web
    • three.jsで開発可(three.ar.js)

Tangoはどうなる?

GoogleのARプラットフォームとして、Tango(Project Tango)が提供されてきたが、Tangoのdeveloperサイト(英語)に以下のNoteが記載されており、Tango SDKはARCoreに統合される可能性が極めて高い。

Note
The Tango SDK only supports the Asus ZenFone AR and Lenovo Phab 2 Pro phones. Google is continuing AR development with ARCore, a new platform designed for building augmented reality apps for a broad range of devices without requiring specialized hardware.

意訳:Tango SDKはZenfone ARとPhab2 Proにしか対応していません。特別なハードウェアなしでより広いデバイスで使える新しいプラットフォームARCoreで、ARの開発を続けていきます。(=Tangoはもう続けない?)

developers.google.com

予兆として、Tango SDKのアップデートが6月下旬から行われておらず、7月、8月は更新がなかった。Phab2が発売された2016年12月から2017年5月までは毎月アップデートが行われていたので、明らかに頻度が落ちている。
ちなみに、AppleがARKitを発表したのは6月なので、内部的に方針転換が行われていたとしたらタイミング的にはほぼ合致する。

所感

ARCoreはARKitと同等の機能で、Tangoよりも明らかに体験の質が落ちる。
このタイミングで発表して、TangoのサイトにNoteを書いているということは、今後ARCoreでやっていきますという意思表示なのだろう。たぶん。

とはいえ、Tangoから移植しようにも全然機能が足りないし、より幅広いデバイスで使えるようにと言っておきながら、対応デバイスはDaydreamよりも少ない。プレビュー版で正式版がいつになるかも明言されていない。
今の状態でTangoやってたAR開発者がすぐに流れるとは思えないし、自分もそのつもりだけど、今はまだ静観しておいた方がいいのかも。

どうせやるならARCoreじゃなく、来月か再来月には正式リリースされるであろうARKitの方から始めて、ARCoreに水平展開した方がいいんじゃないかな。
日本国内は特にiOSのシェアが高いので、機能が大差ないならARCoreからやるメリットは思いつかない。

個人的には、ARCore単体よりもWebAR(three.ar.js)でのクロスプラットフォーム開発の方が期待感はあります。
幅広いデバイスに提供しようとするとライトなARにならざるを得ないので、three.jsやA-Frameでも開発できると思いますし、ブラウザのWebVR/WebARサポートが広がれば自分のスマホですぐに体験でき、スマートフォンARのメリットをより活かせそうです。

github.com

github.com

Daydream Viewを購入しました

Amazonで注文していたDaydream Viewが届きました。
とりあえず使ってみた所感をまとめておきます。

はじめに

Daydream Viewは国内販売されていないため、並行輸入品です。
国内に在庫があるようで、最短で注文した翌日に入手できます。

www.amazon.co.jp

並行輸入品なので説明書はすべて英語。しかも、小さくて四角い!(写真だと大きく見えるけど)
なので、全く読んでいません。

ゴーグル

外観

幅はZenfone ARと同じくらいで、大きすぎず小さすぎずといった感じです。
丸みを帯びたフォルムなので、全体的にコンパクトに見えます。

前面を開けたところ。スマートフォンは蓋で押さえつける形です。
スマートフォンに直接触れる突起部分が硬いプラスチックではなくラバーっぽい材質なので、画面に傷が付く心配は無さそう。

実際にZenfone ARをセットするとこうなります。

若干ハミ出て見えますけど、画面のサイズとゴーグルの大きさ的にはちょうどよいです。
逆にこれ以上画面が大きいと一部が見切れてしまいそうで、Pixelが5インチ、Pixel XLが5.5インチ、Zenfone ARが5.7インチとなると、5-6インチのスマートフォンが対象っぽい。

最後に、装着面です。
かなりゆったりした設計でメガネを掛けたままでも余裕です。

装着してみた

VRゴーグルを装着した自分を華麗に自撮りするのは想像以上に難しかったので、文章のみでお送りします。

軽さ

コンパクトかつ流線型のフォルムになっていますし、表面が布製なのでかなり軽いです。

フィット感

ヤバい。

ヘッドバンドを頭に合わせて調節すると、かなり安定感があります。
そもそも軽いというのもあるし、後頭部と鼻の辺りでしっかり固定されてる感じがある。

没入感

いくつかアプリを体験してみましたが、ここはやはり専用機に劣るかなと思います。

視野角が少し狭めでVR空間上でもゴーグルを着けて覗いている感じが強い。
Cardboardが視野角90°、専用機は視野角100-110°らしいので、印象としては95°くらいです。
スマートフォンVRなので仕方ない部分もあり、Standalone型のヘッドセットに期待します。

コントローラ

外観

Daydream Viewには、コントローラが1個付属しています。
Daydreamのセットアップ画面を見る限り、2個使えそうな感じはしない。

私は手が小さい方ですが、それでも手の平に収まるサイズです。

上の方の丸く窪んだ部分がタッチパッドになっていてクリックもできます。 真ん中にあるのがアプリボタン、その下にあるのがホームボタンです。

背面にはGマークしかなく、丸みを帯びていて持ちやすくなっています。
側面にあるのは、音量調節のボタンです。

写真ではわかりにくいですが、下の方(グリップエンド)にはUSB-Cの端子とストラップを通す穴が開いています。USB-Cはおそらく充電用途だけかなと思います。

使ってみた

実際にコントローラを利用するアプリを体験してみました。
スマートフォンとのペアリングはBluetoothでホームボタンを長押しするだけでOKです。

操作性

コントローラを動かして操作する分には、軽くて持ちやすいので快適です。
タッチパッドのクリックも操作に支障はないと思います。

問題は、アプリボタンとホームボタン。
コントローラが小さい分、ボタンの位置が近いのですが、ゴーグルで手元が見えないため、押しにくいです。
ちょっとした位置と手触りの違いに慣れるしかないので、アプリでも頻繁に使わない方が無難な気がします。

まとめ

スマートフォンVRとしてはCardboardよりも快適ですし、ゴーグルとコントローラで十分VRはできそうです。
対応スマートフォンを持っているなら、購入の価値ありだと思います。

良いところ

  • 軽くて、着け心地が非常に良い
  • 長時間着けていても疲れにくい
  • ケーブルや外部カメラが要らない
  • 安い(対応スマートフォンを持っていれば)

微妙なところ

  • 視野角は専用機よりも狭め
  • コントローラが1個しかない
  • コントローラのボタンが押しにくい

スマートフォンをセットしてはいますがほぼスタンドアロンに近く、ゴーグルもコントローラも軽くて疲れにくいので、比較的自由に動ける点は良いかもしれません。
アプリを作るとしたら、辺りを見渡したり、コントローラを特定の方向に向けるアクションがメインになりそうです。
ただ、視野角狭めなので、激しく動くようなコンテンツだと酔っちゃうかも。

それは追々考えるとして、個人的に気になっているのは、「蓋を止めるゴムが、徐々にだるんだるんになるんじゃ・・・」「お醤油とかこぼしたら、シミになりそう・・・」という点です。

Daydreamの開発について調べる

Zenfone ARを購入したときから試そうとは思っていたのですが、Daydream Viewが入手できていないこともあって後回しにしていました。
AR(というかマルチプレイ実装)が若干行き詰まりつつあるので、気分転換に試してみます。

Daydreamとは

Googleが提供しているVRの開発プラットフォームで、特定のデバイスを指す用語ではありません。
現状はスマートフォンを利用したVRになるので、体験の質で専用機にはやや劣ると思いますが、利用しやすさと開発しやすさから、より手軽にVRを楽しめるものと捉えています。

vr.google.com

Smartphone VR

スマートフォンをDaydream Viewにセットして利用する形。必要スペックを満たしたDaydream Readyのスマートフォンが必要です。
当初はPixelのみが対応でしたが、現在(2017年8月時点)では海外の主要メーカーが対応機種をラインアップしています。国内シェア的には、Xperiaにも対応してほしいのですが。

  • Pixel, Pixel XL(Google)※製造はHTC
  • GaraxyS8, S8+(Sumsung)
  • ZenFone AR(ASUS
  • Moto Z(Motorola
  • Mate 9 Pro(Huawei
  • Axon 7(ZTE)

vr.google.com

Daydream Viewは未だに国内販売がされておらず、情報も全く入ってきません。
入手方法として、並行輸入品がAmazonで出品されています。

https://www.amazon.co.jp/Google-Daydream-View-Headset-米国並行輸入品/dp/B01N634P7O/ref=pd_rhf_dp_p_img_1?_encoding=UTF8&psc=1&refRID=YSJ243N1Z35CAP4Z2VM7www.amazon.co.jp

海外で購入すると、$70.35。為替レートが$1 = 109円くらいなので、送料+手数料が1,300円くらいですね。
そこまで割高でもないので、1つ購入しました。詳細は届いたら書きます。

www.amazon.com

Standalone VR

スマートフォンやPCを接続しないスタンドアロン型のDaydream対応VRヘッドセットがGoogle I/O 2017で発表されました。

vr.google.com

メーカーはHTCとLenovoで、HTCはVIVEブランドで発売するようです。
発売は年内の予定。価格はOculusやVIVEと同程度との情報があり、10万円前後と見ています。(たぶん買う)

Daydreamの開発をするには

開発環境

Androidアプリ

Daydreamの開発を行うためのGoogle VR SDKは、Android、Unity、Unreal Engineに対応しています。
Google VRにはiOS SDKもありますが、Cardboard向けでDaydream関連の機能はないようです。

Developer Overview  |  Google VR  |  Google Developers

ざっと見た感じ、Unityが一番開発しやすいように見えたので、とりあえずUnityで環境を構築することにしました。(TangoもUnityなので)

WebVR(A-Frame)

WebVRフレームワークA-Frameにも、Daydreamのコントローラを扱うコンポーネントがあります。
A-FrameならHTMLベースで簡単にVRコンテンツが作れるので、いずれ試してみたいと思います。

daydream-controls – A-Frame

Google VR SDK for Unityのセットアップ

Googleのドキュメントの通りに進めていけばOKです。

Get Started with Google VR in Unity  |  Google VR  |  Google Developers

英語が苦手な方やセットアップで躓いた方には、以下の記事がオススメです。
図が入っていて説明が丁寧なので、わかりやすい。

developer.wonderpla.net

Zenfone ARで実行してみると、画面が分割表示され、デバイスの回転に合わせてカメラも回転します。

Controller Emulatorを使う

Daydream Viewにはコントローラが付いています。
Viewがなければ当然コントローラもありませんが、コントローラがなくても開発ができるようにController Emulatorなるアプリが提供されていました。

アプリのインストール

以下のサイトからAPKファイルをダウンロードして端末にインストールします。
このアプリはDaydream ReadyでないAndroid端末(Phab2 Proを使用)でも動作しました。

The Controller Emulator  |  Google VR  |  Google Developers

Controller Emulatorアプリの画面はこんな感じ。
それっぽいけど、平面なので操作感とかはよくわからないですね。 f:id:jyuko49:20170819122455j:plain

Unityエディタで動かしてみる

Controller Emulatorをインストールした端末を開発PCにUSBで接続して、Unityエディタでデモシーンを実行します。
コントローラ(になっている端末)を動かすと、レーザポインタみたいな白い光を操作することができ、Cubeに当っていると青、当たっていないときは赤になりました。光が当っている状態でクリックすると、Cubeの位置が変わります。

f:id:jyuko49:20170819124701p:plain

f:id:jyuko49:20170819124707p:plain

WiFi接続に変更する

コントローラ(になっている端末)は同一のLAN上にいれば、WiFiでも接続できます。
USB接続だとケーブルで動きが制限されるので、WiFiの方が快適です。

設定するには、"GvrControllerMain.Prefab"の"Gvr Controller(Script)“で"Emmulator Connection"を"USB"から"WIFI"に変更します。

f:id:jyuko49:20170819130652p:plain

次に、コントローラのIPが記述されているスクリプトを修正します。

  • GoogleVR/Scripts/Controller/Internal/Emulator/EmulatorConfig.cs
// IP address of the phone, when connected to the PC via WiFi.
//public static readonly string WIFI_SERVER_IP = "192.168.43.1";  ←元々の設定はコメントアウト
public static readonly string WIFI_SERVER_IP = "192.168.0.2"; ←コントローラ(になっている端末)のIP

コントローラ(になっている端末)のIPを調べる方法は簡単で、Controller Emulatorアプリを起動すると画面の上の方にIPアドレスが書かれています。

この状態でUnityエディタを起動すると、WIFI経由で操作ができるようになります。

続く

デモシーンを参考にシーンの構成についてもざっくりと調べたのですが、長くなってきたので続きは別の記事にします。

Unity2017.2.0b2のTangoサポートについて(実機でSpatial Mapperが動くところまで)

前回の記事でUnity2017.2.0b2のTangoサポートについて調査しましたが、ビルドエラーが発生してしまい、実機確認ができていませんでした。

jyuko49.hatenablog.com

その後、発生していたビルドエラーの原因が特定できたのでリトライしたところ、Tangoのメッシュ構成(3DR)が使えるところまではできました。

ビルドエラーへの対処法

何度かビルドエラーが出たので、それぞれ行なった対処をまとめておきます。

JDKのバージョン確認

JDKバージョンが1.8以上でないとビルドが通らないようです。
前に変更したような気もするのですが、Unityをアップデートしたことで変わってしまったのかも?

発生するエラーメッセージ、対処法ともに以下の記事がドンピシャで、非常に助かりました。

blog.naichilab.com

Tango SDKとの共存エラー?

Unity5.6でTango SDK for Unityを使って開発したプロジェクトをコンバートした際に起きました。

f:id:jyuko49:20170710211023p:plain

エラーメッセージからすると、Tango SDKとUnityでTangoのライブラリが競合しているように見える。
ということで、

Tango SDK、Tango Prefabを削除 → ビルドエラー
Tempフォルダを消してリトライ → ビルドエラー
もうわからん!!

諦めて、テスト用のプロジェクトを新規に作成し、Tango SDKはインストールせずにUnityエディタのTangoサポートを有効にするとエラーは発生しませんでした。
解決はしたものの、Tango SDKで開発を進めたプロジェクトを移行したい場合には追加調査が必要です。

Target API Level

ZenFone AR (Android 7.0)で実機テストを行う際に発生しました。
正確には、ビルドエラーではなく、ビルドは通った上でアプリが起動しないという症状です。

f:id:jyuko49:20170710212704j:plain

この件については、Target API Levelを明示的に"Android 6.0 ‘Marshmallow’ (API level 23)“にすると直りました。

f:id:jyuko49:20170710211813p:plain

原因となっている事象については、あまり理解できていませんが、Unity5.6.2+Tango SDK for Unity(Ikariotikos)の環境では"Automatic (highest installed)“にしていても問題なかったので、何か差異があるんでしょうか?
いずれにしても、Unityのアップデートで直ってくれないと困るので、一時的な対処と考えてください。

そういえば、Unityに統合されているTangoのコアライブラリはSDKバージョンどれなんですかね?
Tangoだけアップデートしたいときはどうするんだろう?

メッシュ構成を試す

ビルドが通るようになったので、前回の記事で試しそこねたSpatial Mapperの調査をしました。

Tango Spatial Mapperのセットアップ

まず、Sceneに"Create Empty"で空のGame Objectを追加します。名前も"Spatial Mapper"にしておきました。
次に、"Add Component"で"Tango Spatial Mapper"を追加します。

f:id:jyuko49:20170710214515p:plain

Inspectorを確認してみると、ほぼデフォルトの設定で使えそうですが、Renderingの"Render Material"がセットされていませんでした。
今回はテストなので"Default-Material"を使いました。

f:id:jyuko49:20170710214737p:plain

Tangoの3DRで生成されるメッシュは、Color、Normal、UVが利用でき、AR表示のオクルージョンにも使えるので、用途に応じてMaterialを設定してあげる必要があります。

ここまでの設定でビルドしたら動くかなと期待したのですが、Skyboxが表示されるのみで何もメッシュは表示されませんでした。

Tangoに接続するスクリプトの作成

動かない原因については、Tango Serviceに接続する処理がないためです。

qiita.com

Tango SDKの場合、"Tango Manager"がPrefab化されており、Sceneに置いてInspectorを設定するだけで、Tangoの各サービスに接続できるのですが、Unity2017.2b2にはそれらしきComponentが見当たりません。
要するに、スクリプトを書けってことですね。

“Create Empty"で空のGame Objectをもう一つ追加。名前は"Tango Service"にしました。
"Add Component” > “New Script"でC#スクリプト(ここでは"TangoService.cs")を作成して、以下のコードを書いてあげます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Tango = UnityEngine.XR.Tango;

public class TangoService : MonoBehaviour {

    // Use this for initialization
    void Start () {
        Tango.TangoConfig config = new Tango.TangoConfig ();
        config.enableDepth = true;
        config.enableColorCamera = true;
        Tango.TangoDevice.Connect (config); 
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}

前回調べたとおり、Tangoの機能にアクセスするクラスのNameSpaceは、“UnityEngine.XR.Tango”になっています。
リファレンスがないので、Tango SDKで実装してきた経験と勘を頼りにコーディングしています。

まず、Tango.TangoDevice.Connect()がそれっぽい。
このメソッドには、Tango.TangoConfigを渡さなければいけないようなので、newします。
Tango.TangoConfigのプロパティを見てみると、enableDepthenableColorCameraがあります。

f:id:jyuko49:20170710222649p:plain

これらを有効にして、接続してあげればメッシュ構成に必要なデータが取得できそうです。
といったところでビルドを試したところ、冒頭の通りメッシュが表示されるようになりました。

まとめ

2017.2.0b2のTangoサポートについて現段階でわかったのは、

  • Tango SDK for Unityとの共存は難しそう
  • ある程度スクリプトを書かないと使えなさそう

ということ。リファレンスがないと、ここから先の実装は難しそうです。

前の記事にも書いたとおり、Tango SDK for Unityの方がドキュメントもサンプルも充実していて使いやすく、そこからの移行が難しいとなると、当面はTango SDKのままでいいかなという感じです。
今後、リファレンスが出てきたり、機能が拡充されれば意見を変えるかもしれませんが、Tango SDKのバージョン追従もどうなるかわからないし、プラットフォームの併存は余計な混乱を招きそうで、既存の開発者からすると、あまりメリットが見えてこないですね・・・。