ARCoreとは?

概要

ARCoreはデジタルと物理の世界をシームレスに融合させた新しい経験を形作ることができる、Googleが提供する新しいAR(拡張現実)プラットフォームです。
以下が実際に実装して、実行してみたものになります。
ezgif-3-c10ddc3c08.gif

Tangoってなかったっけ?

ARCoreはいわばTangoの一般向け汎用デバイスに向けたARプラットフォームにあたります。
Tangoはモーショントラッキングカメラや深度センサーなど追加のハードウェアを必要とするのに対し、ARCoreはそういった特別なハードウェアなしでTangoのようなものを開発することができるようにしたものです。

ARKitと何が違うの?

ARCoreARKitのAndroid版のようなものです。

何ができるの?

  • モーショントラッキング
  • 水平面の検出(認識)
  • 光源の推測(環境光)

ARCore Developer Preview2から追加されたこと

  • ARの検出元となるカメラ画像を取得できる(ComputerVisionのプロジェクトを参考)

    • 起動中のカメラの毎フレームの画像を取得できる
    • 起動中のカメラの毎フレームのグレースケール画像を取得できる
    • カメラの毎フレームをSobalエッジフィルターした画像を取得できる。
  • C++(Android NDK)でARCoreの機能を使って開発することができる。

  • ARの検出器を切ったり、スタートしたり、と言った切り替えをすることができる。

  • 各種検出精度の向上

参考:ARCore Developer Preview 2

対応端末(2017/12/17現在)

  • Google Pixel, Pixel XL, Pixel 2, Pixel 2 XL
  • Samsung Galaxy S8 (SM-G950U, SM-G950N, SM-G950F, SM-G950FD, SM-G950W, SM-G950U1)

一応、裏技でこれら以外の端末で動かすことはできますが、現状動作がかなり怪しいのでそのつもりで開発してください。
【参考】 ARCoreをPixelやS8以外の端末で動かす

詳しくはこちら

開発可能環境とライブラリのダウンロード先

開発環境 ライブラリ
Android(Java) arcore-android-sdk
Unity arcore-unity-sdk
Unreal Engine4 arcore-unreal-sdk

で?おすすめの開発環境は?

Unityです!!
実装には3Dの技術や知識が必要になります。
Android JavaのサンプルではOBJファイルを読みこんでいますが、それ以外のファイル(FBX等)を読みたい場合は自力で読み込むしかないです。(またはRajawaliをうまく使いこなすことができたらもしかしたら...)
3Dの処理を自力で書くのは相当大変なのでUnityまたはUnreal Engineを使って開発することをおすすめします。

サンプルを動かす

Android Studioで

公式ドキュメントはこちら。Getting Started with Android Studio
開発は大変ですが、サンプルを動かすのは最も簡単です。

  1. Android Studioを起動し、 arcore-android-sdk/samples/hello_ar_javaを選択し、Androidのprojectを開きます。
  2. ▶のボタンを押す。 AndroidStudio.png

これで、ビルドされ、端末にサンプルがインストールされます。
※今回はhello_ar_javaのプロジェクトを開いて実行しましたが

  • hello_ar_c
  • computervision

のプロジェクトを開いた場合でも、同様に▶ボタンを押すことでビルド、インストールすることができます。

それぞれのプロジェクトについて

  • hello_ar_java: AndroidSDKを用いて開発しているプロジェクト
  • hello_ar_c: C++(AndroidNDK)を用いて開発しているプロジェクト
  • computervision: カメラ画面とSobalエッジフィルターを適用させた画面の2面を表示しているプロジェクト

Unityで

公式ドキュメントはこちら。Getting Started with Unity
Unityで動かすためには少し特殊な設定を行う必要があります。
※ARCore用の設定のままARCore以外のUnityプロジェクトをビルドするとビルドはできますが、カメラなどの機能は利用できませんので、気をつけてください
(ARCore Developer Preview 2に準拠しています)

  1. UnityのARCoreのSDKをダウンロードしてきて展開する。
  2. 展開後、Assets/GoogleARCore/Examples/HelloAR/Scenes/HelloAR.unityを開き、Sceneを表示する。 import_arcore.png
  3. File->Build Settingsを選択して、Build Settingsを開く BuildSettings.png
  4. 「Add Open Scenes」ボタンを押して現在のSceneを追加する。
  5. Platformの中の「Android」を選択して、「Switch Platform」ボタンを押す
  6. Platformが変更されたら、「Player Settings...」ボタンを押してPlayerSettingsを開く
    BuildSettingWindow.png

  7. Other Settingsのタブを開き、以下の設定を行う

    • Multithreaded Rendering のチェックを外す
    • Package Name の部分を適当な名前にする com.example.helloARのような感じで
    • Minimum API Level をAndroid 7.0 またはそれ以上にする
    • Target API Level をAndroid 7.0 またはそれ以上にする(Minimum API Level以上)

PlayerSettings.png
8. XR Settingsのタブを開き、 ARCore Supported のチェックをつける
ARCoreSupported.png
9. 再びFile->Build Settingsを選択して、BUild Settingsを開く
10. 「Build」ボタンを押してBuildする。ビルド結果を端末に直接インストールしたい場合は「Build And Run」ボタンを押して直接インストールする。
Build.png

これでサンプルアプリを動かすことができます。

Unreal Engineで

すみません、試していません。しかし、公式ドキュメントはこちらにありますのでこちらをご参照ください。Getting Started with Unreal
なお、Unreal Engine 4.18とそれ以外とでは導入手順が異なるようなので注意してください

開発する(Unityで)

開発環境(制約)

  • 検証端末: Pixel2
  • Unity 2017.3.0 (※ARCore developer preview2ではUnity 2017.3.0以降でビルドしないと動いてくれません)

Pixel2購入したい

正規の方法ではPixel2は日本では購入できません。
私はここの記事を参考に購入しました。
【実験済】日本国内から米国版GoogleストアのPixel 2を購入する方法!

Android以外の環境の開発もできるの?

できません。開発するときは必ずPlatformを「Android」に指定して開発してください。
AndroidPratform.png

Unity Editorで動かすことできるの?

ARCoreの機能やカメラは以下のようなエラーが出て、動きません。それ以外のものはエラーは出ますが動きます。
DllLoadError.png

表示されるものをドロイド君から変えたい

ひとまず、既存のSceneにあるExampleControllerの中のAndy Android Prefabを別のものに差し替えたら表示されるものが変わります。
ChangeAndy.png

検知した平面上にものを出現させる場合

検知した平面上にものを出現させる場合、Anchorと呼ばれるものを作成し、そこの子供に出現させる必要がある用です。Anchorのは以下のとおりです。

Trackable trackable.CreateAnchor(Pose)
または
Session.CreateWorldAnchor(Pose);

でAnchor(クラス)を取得できます。
上記のPoseは出現させたいPosition(座標)とRotate(向き)を指定することで作成できます。

new Pose(Vector3 position, Quaternion rotate)
または初期値(position = Vector3.zero, rotate = Quaternion.identity)を入れたい場合
Pose.identity

また、TrackableとはTrackedPlane(検出できた面)やTrackedPoint(検出できた特徴点)の基底クラスとなります。

他にも3Dモデルないの?

3Dモデルを公開してくれているサービスはいくつもあるのでここらへんから3Dモデルを持ってくることをおすすめします。

3Dモデルをいっぱい使いたい、なんか便利なツールないの?

そのためのツールを作成しましたのでこちらを参考にしてください。
Unity 開発者があると便利だと思うツールを色々と作成したので公開

検知した平面に物理演算を適用したい

以下記事が非常に参考になります。
ARCoreで検出した水平面にオブジェクトを落とす

以下に該当のソースコードを記します。

TrackedPlaneVisualizer.cs
//もともとあったコード。m_meshに頂点情報(座標と順番)や色情報を渡している |
m_Mesh.Clear();
m_Mesh.SetVertices(m_meshVertices);
m_Mesh.SetIndices(m_MeshIndices.ToArray(), MeshTopology.Triangles, 0);
m_Mesh.SetColors(m_MeshColors);
//下記の2行を新たに追加。上記で作成した三角形の集合をコライダーに反映
//Add following 2 lines. This cord attaches triangular mesh information to collider.
GetComponent<MeshCollider>().sharedMesh = null;
GetComponent<MeshCollider>().sharedMesh = m_Mesh;

そして、検出した面に当たり判定が適用されるようにします。
TrackedPlaneVisualizer.prefabにMeshColliderをつけることで、検出した面に当たり判定がつき、物を置くことができるようになります。
AttachMeshCollider.png

該当箇所を以上のように修正すると検出面にCollider(あたり判定を検出する膜)をつけることができます。
その後、物理演算をしたい3Dモデルに以下のようにRigidBodyという要素をつければ、物理演算をしてくれるようになります。
RigidBody.png
またこの時、Use Gravityにチェックを入れると、重力が有効になり、検出した平面に上に乗せることができます。

検知した平面についてもう少し詳しく知りたい

サンプルの平面の検出にあたる部分の処理をいかに表示します。

HelloARController.cs
List<TrackedPlane> m_NewPlanes = new List<TrackedPlane>();
if (Frame.TrackingState != TrackingState.Tracking)
{
    return;
}
Frame.GetPlanes(m_NewPlanes, TrackableQueryFilter.New);

これで、新たに検出できた平面を取得し、

HelloARController.cs
List<TrackedPlane> m_AllPlanes = new List<TrackedPlane>();
Frame.GetPlanes(m_AllPlanes);

これで検出できている平面全ての情報を取得することができます。
この、TrackedPlaneが検出できている面で、この面は基本的に高さ(座標のyの値)が異なり、検出面が広がっていくとこの値が変更されます。

TrackedPlaneについて

検出できた面はTrackedPlaneというstructとして取得することができます。
この、TrackedPlaneですが面の座標や広さの情報を保持しています。それぞれの座標系の情報以下の通りです。

フィールド(メソッド)名 意味
Position 面の中心のX,Y,Z座標
Rotation 面の角度(傾き)
ExtentX 面の中心からの広さ(距離)のX軸の値
ExtentZ 面の中心からの広さ(距離)のZ軸の値

詳しくはこちらを参照。
GoogleARCore.TrackedPlane

カメラってどうなってんの?

First Person CameraがAR上のカメラにあたります。
アプリを起動した場所を原点として、移動、回転した分がこの値になります。
現在カメラに写っているかどうかで制御したい場合は以下のようにOnBecameVisibleまたはOnBecameInvisibleを使用することで判定できます。
※ただしこれらのCallbackはRenderer Classがついている場合のみ呼ばれます

SomthingRendererBehaviour.cs
public class SomthingRendererBehaviour : MonoBehaviour {
    void OnBecameVisible(){

    }

    void OnBecameInvisible(){

    }
}

【参考】カメラに写っているかで処理を分岐する

壁は検出できないの?

どうやら ARCore Developer Preview1では検出できませんでした。ARCore Developer Preview2ではサンプルの中にはないです。(調査中)(ARKitは検出できるみたいです)

まとめ

  • ARCoreの導入の仕方と一部ソースコードなどで解説、紹介しました
  • Unreal Engine4での導入については後ほど記事を更新したいと思います。
  • その他、気になることなどありましたらコメントいただけると幸いです
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.