アプリケーション共同開発部 の石丸です。
Android エンジニアをやっています。
昨年は VR 関連製品が多く発売され、大きな話題となりましたが、今年は AR 関連の製品やサービスが増えてくるのではないかと考えています。
中でも私個人が注目しているのは、Googleが開発しているARプラットフォーム『Tango』で、その『Tango』に対応した端末が、昨年末ついにリリースされました。
AR(拡張現実)といえば、日本でも数年前に話題となったARカメラや、昨年社会現象にもなったポケモン GO などが有名ですが、Tango ではより一歩進んだ AR 体験が可能となります。
Tangoで何ができるのか
Tango (英語サイト)
Tango では現在以下の機能が提供されています。
- モーショントラッキング (Motion Tracking)
- エリア学習 (Area Learning)
- 深度検出 (Depth Perception)
モーショントラッキングは、動きを検知し、端末の向きや移動量を取得することができます。
エリア学習は、エリアの視覚的な特徴等を記憶し、モーショントラッキングの精度を上げることができます。
深度検出は、赤外線センサーを使用し、センサーを向けている方向の物体までの距離(座標)を取得することができます。
早速試してみる
それでは、早速サンプルなどを参考に Tango 機能を試してみたいと思います。
今回はモーショントラッキングと深度検出をテストするため、画面をタップした位置に、オブジェクトを配置するサンプルを作成します。
Tango の API は、 Java 、 C 、 Unity 用のものが公開されていますが、今回は Unity 用の SDK を使用します。
検証環境
- Unity 5.3.5 p5 (Mac)
- Android Studio 2.2.2
- JDK 1.8.0_91
- Tango SDK 1.4.9
検証端末
- Phab2 Pro (Android 6.0.1)
(環境設定等は割愛します)
Tango のサイトより、 Tango SDK の unity package をダウンロードし、
Assets > Import Package > Custom Package からインポートします。
新しいSceneを作成し、以下の Prefab を Hierarchy に追加します。
- Tango/Prefabs/Manager
- Tango/Prefabs/AR Camera
- Tango/Prefabs/Tango Point Cloud
追加した Tango Manager の Inspector で、
以下にそれぞれチェックが入った状態にします。
- Enable Motion Tracking
- Enable Depth
- Enable Video Overray
(デフォルトのカメラが残っている場合は削除しておきます)
次にサンプルなどを参考に制御用のスクリプトを書いていきます。
Tango SDK に最低限必要なメソッドが揃っている為、書く内容としてはシンプルです。
[PointTest.cs]
using UnityEngine; using System.Collections; using System.Collections.Generic; using Tango; public class PointTest : MonoBehaviour, ITangoDepth { #region -- 公開フィールド -- public TangoPointCloud tangoPointCloud; public GameObject loadResource; #endregion #region -- 非公開フィールド -- private TangoApplication tangoApplication; private GameObject loadedObject = null; private Vector3 targetPoint = Vector3.zero; private bool isWaitingCallback = false; #endregion #region -- Unityライフサイクル -- public void Start() { tangoApplication = FindObjectOfType<TangoApplication>(); // リスナの登録 tangoApplication.Register(this); } public void OnDestroy() { // リスナの解除 tangoApplication.Unregister(this); } public void Update() { if(Input.GetMouseButtonDown(0)) { StartCoroutine(GetTouchPostion(Input.mousePosition)); } } public void OnGUI() { // タップ地点とカメラの距離 float dist =(targetPoint - Camera.main.transform.position).sqrMagnitude; GUI.Label(new Rect(40, 40, 400, 100), string.Format("<size=40>{0:f4}</size>", dist)); } #endregion // タッチした地点にオブジェクトを配置する IEnumerator GetTouchPostion(Vector2 screenPos) { // 深度情報が取得できるまで待つ isWaitingCallback = true; tangoApplication.SetDepthCameraRate(TangoEnums.TangoDepthCameraRate.MAXIMUM); while(isWaitingCallback) { yield return null; } tangoApplication.SetDepthCameraRate(TangoEnums.TangoDepthCameraRate.DISABLED); // 取得した深度(点群)情報の中からタッチされた画面座標の地点に近いワールド座標を取得 Camera cam = Camera.main; int index = tangoPointCloud.FindClosestPoint(cam, screenPos, 20); if(index >= 0) { SetCharactorObject(tangoPointCloud.m_points [index]); } } private void SetCharactorObject(Vector3 position) { targetPoint = position; if(loadedObject == null) { loadedObject =(GameObject)Instantiate(loadResource, targetPoint, Quaternion.identity); } else { loadedObject.transform.position = targetPoint; } // こちらを向いた状態にする Vector3 target = Camera.main.gameObject.transform.position; target.y = loadedObject.transform.position.y; loadedObject.transform.LookAt(target); } #region -- Tangoイベント -- // TangoServiceへの接続 public void OnTangoServiceConnected() { tangoApplication.SetDepthCameraRate(TangoEnums.TangoDepthCameraRate.DISABLED); } // TangoServiceとの切断 public void OnTangoServiceDisconnected() { } // 深度情報が更新された public void OnTangoDepthAvailable(TangoUnityDepth tangoDepth) { isWaitingCallback = false; } #endregion }
Hierarchy に GameObject (ここでは Test Object としています) を追加し、
そこに先ほど作成したスクリプトを追加します。
PointTest の Tango Point Could には、
先に Hierarchy に追加してある Tango Point Could を紐付けます。
Load Resource には、タッチした座標表示したいオブジェクトを任意で設定します。
表示するオブジェクトは、今回はUnity ちゃんのモデルをお借りしました。
Scene をセーブしたら、早速実行してみましょう。
画面をタップすると、タップした位置に Unity ちゃんが表示されます。
端末を持って回りこむことで、後ろからも見ることができます。
今回試したのはごくシンプルな内容ですが、今までは難しかったような機能が実現できたり、色々想像が膨らみますね!
今後、 Tango の対応端末が増え、センサーや端末の性能が向上していくと、スマホがより便利に、そして新しい使い方、楽しみ方が見えてくるように思います。
フェンリルのオフィシャル Twitter アカウントでは、フェンリルプロダクトの最新情報などをつぶやいています。よろしければフォローしてください!
この投稿のユニティちゃんは、以下のライセンスに従っております
© Unity Technologies Japan/UCL