ARCore 取扱説明書

【更新情報】

| 更新日時 | 内容 |
|:--|:--|
| 2018/2/25 | ARCore 1.0がリリースされましたので、合わせて内容を更新しました。 |
| 2018/4/2 | ARCore 1.1.0がリリースされましたので、合わせて内容を更新しました。 |
| 2018/5/22 | ARCore 1.2.0がリリースされましたので、合わせて内容を更新しました。 |
| 2018/6/1 | ARCore 1.2.1がリリースされました。特に更新はないのですがタイトルの方を変更しました |
| 2018/8/20 | ARCore 1.4.0 リリースにより更新しました。 |
| 2018/9/13 | ARCore の対応端末が増えたので更新しました。 |
| 2018/9/14 | ARCore 1.4.1 の内容に更新しました。 |
| 2018/12/9 | 最新のARCoreの利用状況を基に記事を更新しました |

#[ARCore](https://developers.google.com/ar/)とは?
## 概要
[ARCore](https://developers.google.com/ar/)はデジタルと物理の世界をシームレスに融合させた新しい経験を形作ることができる、Googleが提供する新しいAR(拡張現実)プラットフォームです。
以下が実際に実装して、実行してみたものになります。
![ezgif-3-c10ddc3c08.gif](https://qiita-image-store.s3.amazonaws.com/0/72596/b4c87768-a69a-3816-ed6b-ad15a108c985.gif)

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

<font color="#FF0000">※2018/3/1をもってTangoのサポートは終了しました。これからは、ARCoreの開発に注力します。</font>
【参考】 [Google、「Project Tango」の終了を正式発表　「ARCore」開発者プレビュー2公開](http://www.itmedia.co.jp/news/articles/1712/18/news052.html)

## [ARKit](https://developer.apple.com/arkit/)と何が違うの?
[ARCore](https://developers.google.com/ar/)は[ARKit](https://developer.apple.com/arkit/)のAndroid版です。
ARKitでできることのほとんど同じことはARCoreでもできます。

## 何ができるの?
 * モーショントラッキング
 * 水平・垂直面の検出(認識)
 * 光源の推測(環境光)
 * 特徴点抽出(PointCloud)
 * 空間共有
 * マーカー画像検知

など

こちらにARCoreを実行してみた様子のデモをいろいろ紹介してくれていますので参照してみてください。
[ARCore Master Class | Augmented Startups](https://arduinostartups.teachable.com/p/master-arcore-unitysdk-build-augmented-reality-apps)

【参考】

 * [Experience augmented reality together with new updates to ARCore](https://blog.google/products/google-vr/experience-augmented-reality-together-new-updates-arcore/)
 * [arcore-android-sdk Releases](https://github.com/google-ar/arcore-android-sdk/releases)
 * [arcore-unity-sdk Releases](https://github.com/google-ar/arcore-unity-sdk/releases)

## 対応端末(2018/12/09現在)
| メーカー | 機種名 | 備考 |
|:--|:--|:--|
| Acer | Chromebook Tab 10 | Requires ChromeOS stable builds 69 or later |
| Asus | ROG Phone |  |
| | Zenfone AR |  |
| | Zenfone ARES |  |
| Google | Nexus 5X | Requires Android 8.0 or later |
| | Nexus 6P | Requires Android 8.0 or later |
| | Pixel, Pixel XL |  |
| | Pixel 2, Pixel 2 XL |  |
| | Pixel 3, Pixel 3 XL |  |
| HMD Global | Nokia 6 (2018) | Also known as Nokia 6.1 |
| | Nokia 6.1 Plus |  |
| | Nokia 7 Plus |  |
| | Nokia 7.1 |  |
| | Nokia 8 | Requires Android 8.0 or later |
| | Nokia 8 Sirocco |  |
| Huawei | Honor 8X, Honor 10 |  |
| | Honor View 10 Lite |  |
| | Mate 20 Lite, Mate 20, Mate 20 Pro, Mate 20 X |  |
| | nova 3, nova 3i |  |
| | P20, P20 Pro |  |
| | Porsche Design Mate RS,  |
| | Porsche Design Mate 20 RS |  |
| | Y9 2019 |  |
| LG | G6 | Requires Android 8.0 or later |
| | G7 Fit, G7 One, G7 ThinQ |  |
| | Q6 |  |
| | Q8 |  |
| | V30, V30+, V30+ JOJO, <br> LG Signature Edition 2017 | Requires Android 8.0 or later |
| | V35 ThinQ, <br> LG Signature Edition 2018 |  |
| | V40 |  |
| Motorola | Moto G5S Plus |  |
| | Moto G6, Moto G6 Plus |  |
| | Moto X4 | Requires Android 8.0 or later |
| | Moto Z2 Force |  |
| | Moto Z3, Moto Z3 Play |  |
| OnePlus | OnePlus 3T | Requires Android 8.0 or later |
| | OnePlus 5, OnePlus 5T |  |
| | OnePlus 6, OnePlus 6T |  |
| Samsung | Galaxy A3 (2017) | Requires Android 8.0 or later |
| | Galaxy A5 (2017) |  |
| | Galaxy A6 (2018) |  |
| | Galaxy A7 (2017) |  |
| | Galaxy A8, Galaxy A8+ (2018) |  |
| | Galaxy J7 (2017), Galaxy J7 Pro | SM-J730 models |
| | Galaxy Note8 |  |
| | Galaxy Note9 |  |
| | Galaxy S7, Galaxy S7 edge |  |
| | Galaxy S8, Galaxy S8+ |  |
| | Galaxy S9, Galaxy S9+ |  |
| | Galaxy Tab S3 |  |
| | Galaxy Tab S4 |  |
| Sony | Xperia XZ Premium | Requires Android 8.0 or later |
| | Xperia XZ1, Xperia XZ1 Compact | Requires Android 8.0 or later |
| | Xperia XZ2, Xperia XZ2 Compact, Xperia XZ2 Premium | Requires Android 8.0 or later with software update after Aug 2018 (security patch level 2018-08-05 or later) |
| | Xperia XZ3 |  |
| Vivo | NEX A, NEX S |  |
| | X23 |  |
| Xiaomi | Mi 8, Mi 8 SE |  |
| | Mi Mix 2S |  |
| | Mi Mix 3 |  |
| | Pocophone F1 |

一応、裏技でこれら以外の端末で動かすことはできますが、現状動作がかなり怪しいのでそのつもりで開発してください。
【参考】 [ARCoreをPixelやS8以外の端末で動かす](https://qiita.com/satoshi_noda/items/c9583f6cf318a198bb6d)

端末状況について詳しくは[こちら](https://developers.google.com/ar/discover/supported-devices)

【2018/2/25更新】
上記端末のほか、現在、Samsung, Huawei, LGE, Motorola, ASUS, Xiaomi, HMD/Nokia, ZTE, Sony Mobile, Vivoの端末メーカーの次の新機種にはARCoreを載せようとしていいます。そのため、これらのメーカーから販売される新機種の端末にはいずれもARCoreが搭載されている可能性が高いと思われます。

【参考】 

 * [Announcing ARCore 1.0 and new updates to Google Lens](https://www.blog.google/products/google-vr/announcing-arcore-10-and-new-updates-google-lens/)
 * [Googleの仮想現実プラットホームARCoreが1.0に達し、13の機種で可利用に、Lensのプレビューも対象を広げる](http://jp.techcrunch.com/2018/02/24/2018-02-23-google-publicly-launches-arcore-1-0-on-13-phones-will-begin-expanding-lens-availability/)

## 開発可能環境とライブラリのダウンロード先
|開発環境|ライブラリ|
|---|---|
|[Android(Java)](https://developer.android.com/index.html?hl=ja)|[arcore-android-sdk](https://github.com/google-ar/arcore-android-sdk)|
|[Android NDK(C/C++)](https://developer.android.com/index.html?hl=ja)|[arcore-android-sdk](https://github.com/google-ar/arcore-android-sdk)|
|[Unity](https://unity3d.com/jp)|[arcore-unity-sdk](https://github.com/google-ar/arcore-unity-sdk)|
|[Unreal Engine4](https://www.unrealengine.com/ja/features)|[arcore-unreal-sdk](https://github.com/google-ar/arcore-unreal-sdk)|
|web|[three.ar.js](https://github.com/google-ar/three.ar.js)(SDKではなく[three.js](https://github.com/mrdoob/three.js/)のAR対応したものになります。サンプルなどは別途あります。)|

## で？おすすめの開発環境は?
<font color="#FF0000">Unity</font>です!!
実装には3Dの技術や知識が必要になります。
3Dについてのはじめの一歩として[こちら](https://www.slideshare.net/takukobayashi560/3d-70392050)に紹介しています。
![3D入門](https://cdn.slidesharecdn.com/ss_thumbnails/3d-161223062742-thumbnail-4.jpg?cb=1482474669)

Android Javaのサンプルでは[OBJ](https://ja.wikipedia.org/wiki/Wavefront_.obj%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)ファイルを読みこんでいますが、それ以外のファイル([FBX](https://ja.wikipedia.org/wiki/FBX)等)を読みたい場合は自力で読み込むしかないです。(または[Rajawali](https://github.com/Rajawali/Rajawali)をうまく使いこなすことができたら、もしかしたら...)
3Dの処理を自力で書くのは相当大変なのでUnityまたはUnreal Engine、(web)を使って開発することをおすすめします。(※webの場合、[three.js](https://github.com/mrdoob/three.js/)の練度や対応状況、端末依存などの影響を大きく受ける可能性があります。そのため安定した動作が期待できない可能性があります)

【2018/5/22追記】
[Sceneform](https://github.com/google-ar/sceneform-android-sdk)が新しくリリースされました。これはAndroid Javaをメインに開発している人でも3Dの開発をしやすいようにしたエディタツール(Android Studio Plugin)です。つまりUnityやUE4のエディタ機能をAndroid Studioでも利用できるようにしたものになります。[Sceneform](https://github.com/google-ar/sceneform-android-sdk)を使って開発していけば、開発も捗ると思います。(Sceneformの使い方などについては本稿の趣旨と離れるので割愛します)

【参考】

 * [Sceneform Overview](https://developers.google.com/ar/develop/java/sceneform/)

# サンプルを動かす
## Android Studioで
公式ドキュメントはこちら。[Getting Started with Android Studio](https://developers.google.com/ar/develop/java/getting-started)

1. Android Studioを起動し、
arcore-android-sdk/samples/hello_ar_javaを選択し、Androidのprojectを開きます。
2. ▶のボタンを押す。
![AndroidStudio.png](https://qiita-image-store.s3.amazonaws.com/0/72596/210429ec-17b4-a82b-dbd3-fb7ea4ad9f7f.png)

これで、ビルドされ、端末にサンプルがインストールされます。
※今回はhello_ar_javaのプロジェクトを開いて実行しましたがこれ以外のプロジェクトを開いた場合でも同様に▶ボタンを押すことでビルド、インストールすることができます。

### それぞれのプロジェクトについて
 * hello_ar_java: AndroidSDKを用いて水平・垂直平面検出のサンプルプロジェクト
 * hello_ar_c: C++(AndroidNDK)を用いて水平・垂直平面検出のサンプルプロジェクト
 * computervision_java: カメラ画面と[Sobalエッジフィルター](http://www.mis.med.akita-u.ac.jp/~kata/image/sobelprew.html)を適用させた画面との表示を切り替えて使うことができるプロジェクト。カメラのPreview画像の取得や検出処理などを自力でやりたい人向けのもの。(なお、ARCore 1.3.0以降ではハードウェアレベルでの一部カメラの制御や情報の取得もできるようになりました)
 * computervision_c: computervision_javaのC++(AndroidNDK)版
 * cloud_anchor_java: 空間共有(AR空間上に3Dモデルを置いた場合、違う端末から見ても同じ場所に置かれている)のサンプルプロジェクト
 * cloud_anchor_c: cloud_anchor_javaのC++(AndroidNDK)版
 * augmented_image_java: マーカー画像を検知する(特定の画像をデータベースとして登録し、カメラでその画像を検知する)とARの3D空間上にオブジェクトが出現するサンプルプロジェクト
 * augmented_image_c: augmented_image_javaのC++(AndroidNDK)版

## Unityで
公式ドキュメントはこちら。[Getting Started with Unity](https://developers.google.com/ar/develop/unity/getting-started)
Unityで動かすためには少し特殊な設定を行う必要があります。
<font color="#FF0000">※ARCore用の設定のままARCore以外のUnityプロジェクトをビルドすると正常に起動しないことがありますので気をつけてください</font>
ARCoreでは[Instant Preview](https://developers.google.com/ar/develop/unity/instant-preview)という、Unity Editor上でARCoreを実行している様子を表示することができる機能があります。通常のBuildの他に、この機能の使い方も一緒に紹介します。

1. UnityのARCoreのSDKをダウンロードしてきて展開する。
2. 展開後、Assets/GoogleARCore/Examples/HelloAR/Scenes/HelloAR.unityを開き、Sceneを表示する。
![import_arcore.png](https://qiita-image-store.s3.amazonaws.com/0/72596/7d2afc7b-8db5-24c0-2b70-84af9e88220f.png)
3. File->Build Settingsを選択して、Build Settingsを開く　

![BuildSettings.png](https://qiita-image-store.s3.amazonaws.com/0/72596/e9d366ec-f34f-15d8-d9fa-2bd90822d6ff.png)
4. 「Add Open Scenes」ボタンを押して現在のSceneを追加する。
5. Platformの中の「Android」を選択して、「Switch　Platform」ボタンを押す。
6. しばらくすると、AndroidでBuild可能な環境となります。

### Unity Editor上で実行する場合
ARCoreが実行可能な端末とPCと接続している状態で以下の手順を実行することでUnity Editor上で端末のカメラを使い、実行した様子を見ることができます。
1. ARCoreを実行可能な実機端末とUnityで開発しているマシンをつなげる
2. ▶のボタンを押す。

![UnityEditorPlay.png](https://qiita-image-store.s3.amazonaws.com/0/72596/8e1b0fa7-a90b-bf2b-a164-3dc5e3b8ff3a.png)

これにより、実機端末の方で[Instant Previewモード](https://developers.google.com/ar/develop/unity/instant-preview)で実行され、実機端末でARカメラで撮影、実行されている様子が「Game」画面の中に表示されます。
![UnityInstantPreview.png](https://qiita-image-store.s3.amazonaws.com/0/72596/062e23a5-7f33-c7c7-901a-f6c735b9d15f.png)
また、この状態で「Hierarchy」内に3Dモデルなどを挿入すると実機端末内に挿入したものが出現します。
[Instant Previewモード](https://developers.google.com/ar/develop/unity/instant-preview)での注意点として、このとき、起動するSceneでは以下の内容を記述しないと、実行中の間の実機でのタッチ判定を取得する事はできないので注意が必要です。(サンプルには記述されているので、主にversion upする場合の話になります。)

```C#
#if UNITY_EDITOR
  using Input = InstantPreviewInput;
#endif
```

詳しくは[こちら](https://developers.google.com/ar/develop/unity/instant-preview)をご覧ください

### Buildする場合
1. Platformが「Android」に変更されたら、「Player Settings...」ボタンを押してPlayerSettingsを開く 
![BuildSettingWindow.png](https://qiita-image-store.s3.amazonaws.com/0/72596/a43e6de5-3dfd-6193-dc46-104f5a123cd1.png)

2.　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](https://qiita-image-store.s3.amazonaws.com/0/72596/156a9fb4-24e5-3ebe-52e7-8c36a94f0fca.png)
3. XR Settingsのタブを開き、 ARCore Supported のチェックをつける 
![ARCoreSupported.png](https://qiita-image-store.s3.amazonaws.com/0/72596/b120aced-be49-2d9a-37a1-65b529af3ab5.png)
4. 再びFile->Build Settingsを選択して、BUild Settingsを開く
5. 「Build」ボタンを押してBuildする。ビルド結果を端末に直接インストールしたい場合は「Build And Run」ボタンを押して直接インストールする。
![Build.png](https://qiita-image-store.s3.amazonaws.com/0/72596/5e6ef2b2-fe9c-abe0-7ce0-54cf1adc8333.png)

これでサンプルアプリを実機にBuildして動かすことができます。

### Unity Script(C#)で設定を追加する

上記、XR Settingsタブの 「ARCore Supported」 のチェックはUnity 2018.2.1以降では以下のようにUnity Scriptでもからでも行うことができます
```C#
PlayerSettings.Android.ARCoreEnabled = true;
```


## Unreal Engineで
すみません、試していません。しかし、公式ドキュメントはこちらにありますのでこちらをご参照ください。[Getting Started with Unreal](https://developers.google.com/ar/develop/unreal/getting-started)

# 開発する(Unityで)
## 開発環境と開発の制約
 * 検証端末: Pixel2
 * Unity 2017.4.3f1以降 <font color="FF0000">(※基本的に最新のUnityのバージョンを使うようにしてください)</font>

## Android以外の環境の開発もできるの?
できません。開発するときは必ずPlatformを「Android」に指定して開発してください。
![AndroidPratform.png](https://qiita-image-store.s3.amazonaws.com/0/72596/5e670037-a0aa-d71c-c36e-f361ae2c0b63.png)
【2018/5/22追記】
ARCore1.2.0以降ではARCore内に一部、iOSでも使われる機能が内包されています。(実態はARKitの一部機能を用いています)そのため、ARCore内でもARKitの一部の機能を使うことができますが、本格的にARKitと共同で開発する場合は[Unity-ARKit-Plugin](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin)を利用してください。また、ARKitとARCoreを共通のソースコードで開発する場合はこちらもご活用ください。
[Unity で ARKit & ARCore AR開発環境のマルチプラットーフォーム(iOS & Android)対応](https://qiita.com/taptappun/items/bc38a446a06c83bd1898)

【2018/8/20追記】
ARCore1.4.0では上記の機能はCloudAnchorを利用する場合にのみ使うことができるようになっていますので、それに合わせてiOSでARCoreをつかえるようにするかどうかの設定をすることができます。
![editor_arcore.png](https://qiita-image-store.s3.amazonaws.com/0/72596/5a0ae444-18c9-0cdb-0590-5785ae5aded7.png)
上記で設定画面を開きます。
![ARCoreUnityiOSSettings.png](https://qiita-image-store.s3.amazonaws.com/0/72596/0b197fd6-b48d-d9b4-7503-9f562021c082.png)
iOS Support Enabledにチェックを入れることでiOSでもARCoreが使えるようになります。

【参考】
 * [Welcome to the ARCore SDK for iOS](https://developers.google.com/ar/develop/ios/overview)

## 表示されるものをドロイド君から変えたい
ひとまず、既存のSceneにあるExampleControllerの中のAndy Android Prefabを別のものに差し替えたら表示されるものが変わります。
![ChangeAndy.png](https://qiita-image-store.s3.amazonaws.com/0/72596/43b75bdf-ed7d-5cb7-c8e8-65583f941e2a.png)

### 検知した平面上にものを出現させる場合
検知した平面上にものを出現させる場合、Anchorと呼ばれるものを作成し、その子供に出現させる必要があります。Anchorを作る理由として、ARCoreでは時々、位置の調整を行なっており、Anchorの子供に出現させないとだんだん位置がずれていきます。(問い合わせてご回答いただけました。[The camera often seems to teleport.](https://github.com/google-ar/arcore-unity-sdk/issues/174))
具体的なやり方は以下のとおりです。

```C#
Trackable trackable.CreateAnchor(Pose)
//または
Session.CreateAnchor(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モデルを持ってくることをおすすめします。

 * [SketchUp](https://www.sketchup.com/ja)
 * [Sketchfab](https://sketchfab.com/)
 * [Poly](https://poly.google.com/)
 * [Free3D](https://free3d.com/)
 * [Unity AssetStore](https://www.assetstore.unity3d.com/) ※一部有料
 * [ニコニコ立体](http://3d.nicovideo.jp/) ※MMDが多い。[VRM](https://dwango.github.io/vrm/)ファイルも増えてきている。(最近、[VRM](https://dwango.github.io/vrm/)というフォーマットが登場しました。Unityで[VRM](https://dwango.github.io/vrm/)を使用したい場合は[UniVRM](https://github.com/dwango/UniVRM)がおすすめ)

# 3Dモデルをいっぱい使いたい、なんか便利なツールないの？
そのためのツールを作成しましたのでこちらを参考にしてください。
[Unity 開発者があると便利だと思うツールを色々と作成したので公開](https://qiita.com/taptappun/items/30914c590ef5b75944a6)

## 検知した平面に物理演算を適用したい
以下記事が非常に参考になります。
[ARCoreで検出した水平面にオブジェクトを落とす](http://tks-yoshinaga.hatenablog.com/entry/2017/09/19/170800)

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

```DetectedPlaneVisualizer.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;
```

そして、検出した面に当たり判定が適用されるようにします。
DetectedPlaneVisualizer.prefabにMeshColliderをつけることで、検出した面に当たり判定がつき、物を置くことができるようになります。
![AttachMeshCollider.png](https://qiita-image-store.s3.amazonaws.com/0/72596/631a4593-95d4-78b6-9a77-35ef9002d9d8.png)

該当箇所を以上のように修正すると検出面にCollider(あたり判定を検出する膜)をつけることができます。
その後、物理演算をしたい3Dモデルに以下のようにRigidBodyという要素をつければ、物理演算をしてくれるようになります。
![RigidBody.png](https://qiita-image-store.s3.amazonaws.com/0/72596/2651e9c0-ecc2-9b84-854a-9a54151c981a.png)
またこの時、Use Gravityにチェックを入れると、重力が有効になり、検出した平面に上に乗せることができます。

## 検知した平面についてもう少し詳しく知りたい
サンプルの平面の検出にあたる部分の処理を以下に表示します。

```HelloARController.cs
List<DetectedPlane> m_NewPlanes = new List<DetectedPlane>();
if (Session.Status != SessionStatus.Tracking)
{
    return;
}
Session.GetTrackables<DetectedPlane>(m_NewPlanes, TrackableQueryFilter.New);
```

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

```HelloARController.cs
List<DetectedPlane> m_AllPlanes = new List<DetectedPlane>();
Session.GetTrackables<DetectedPlane>(m_AllPlanes, TrackableQueryFilter.All);
```

これで検出できている平面全ての情報を取得することができます。
```Session.GetTrackables```の第2引数は省略可能で```TrackableQueryFilter.All```を使うので十分に事足ります。
この、```DetectedPlane```が検出できた平面で、水平・垂直の両方の平面を共通して扱います。
この```DetectedPlane```は検出面が広がることで各種値が更新されていきます。(以降の項目を参照)

### [DetectedPlane](https://developers.google.com/ar/reference/unity/class/GoogleARCore/DetectedPlane#classGoogleARCore_1_1DetectedPlane_1a12ba9a2247d68a9bc699dc608de4c289)について
検出できた面はDetectedPlaneというstructとして取得することができます。
この、DetectedPlaneですが面の座標や広さの情報を保持しています。それぞれの座標系の情報以下の通りです。

|フィールド(メソッド)名|意味|
|---|---|
|CenterPose|面の中心にあたる部分の[Pose](https://docs.unity3d.com/ja/current/ScriptReference/Pose.html)(座標や角度などを保持しているStruct)|
|ExtentX|面の中心からの広さ(距離)のX軸の値|
|ExtentZ|面の中心からの広さ(距離)のZ軸の値|
|PlaneType|検出した面が上平面か下平面か垂直平面か区別するためのもの|

詳しく説明はこちらを参照。
[GoogleARCore.DetectedPlane](https://developers.google.com/ar/reference/unity/class/GoogleARCore/DetectedPlane#classGoogleARCore_1_1DetectedPlane_1a12ba9a2247d68a9bc699dc608de4c289)

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

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

    void OnBecameInvisible(){
        
    }
}
```

【参考】[カメラに写っているかで処理を分岐する](https://qiita.com/edo_m18/items/8a354d3099fc799c97ff)

## 壁は検出できないの?
ARCore 1.2.0以降では壁も検出できるようになりました。ARKitではVersion 1.5から壁を検出できます。(iOS 11.3以上にする必要があります)
実際に検出する方法は
![ARCoreDevice.png](https://qiita-image-store.s3.amazonaws.com/0/72596/9482a48e-456f-bf64-c8fb-6a104a5f338c.png)

 * ```ARCore Device```の中にセットされている、Session Configの参照先をみる

![SessionConfig.png](https://qiita-image-store.s3.amazonaws.com/0/72596/7d797731-131d-8fbc-69c1-f9cba9b37db2.png)

 * ```Session Config```の中にセットされているもの(DefaultSessionConfig)の中にある、```Plane Finding Mode```の値が、```Horizontal And Vertical```または```Vertical```になっている。(水平面の場合は```Horizontal And Vertical```または```Horizontal```になっている)

この状態で、壁を検出すると、上記、[DetectedPlaneについて](https://qiita.com/taptappun/items/a5337d29a43d5d673c7f#detectedplane%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)と同様に、DetectedPlaneを取得することができます。([上記](https://qiita.com/taptappun/items/a5337d29a43d5d673c7f#detectedplane%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)のように```PlaneType```で取得できた値で判別することができます。)

この他、[ARCoreSessionConfig](https://developers.google.com/ar/reference/unity/class/GoogleARCore/ARCoreSessionConfig)(今回の場合、DefaultSessionConfig)にてARCoreで利用できる機能のON/OFFの設定ができます。

なお、独自に実装することも可能です。その場合はこちらを参考にしてください。
[ARKitで任意の方向の平面を検出する](https://qiita.com/rakusan/items/8e3ba031acb31fd7a26c)

## [AugmentedImage](https://developers.google.com/ar/reference/c/group/augmented-image)について教えて
[AugmentedImage](https://developers.google.com/ar/reference/c/group/augmented-image)とは事前に画像の情報を指定し、その画像をARCoreのカメラにかざすと検出できるという機能です。(一般的にはマーカー画像と呼ばれます) [Vuforia](https://vuforia.com/)で使われている機能と類似の機能になります。
<font color="#FF0000">なおARCore1.2.0ではARCore起動中に検出可能画像を追加することはUnityEditor上では可能ですが、実機ではできません。</font>

### マーカー画像の設定について
 * ```ARCore Device```の中にセットさせる、```Session Config```を変更する

![AugmentedImageSessionConfig.png](https://qiita-image-store.s3.amazonaws.com/0/72596/02d9ef7d-a08f-eba2-4186-87da0548ba78.png)

 * ```Session Config```の中にセットされているもの(この場合AugmentedImagesSessionConfig)の中にある、```AugmentedImageDatabase```に認識する画像情報のデータベースをセットする。

![ImageDatabase.png](https://qiita-image-store.s3.amazonaws.com/0/72596/1d08666a-1b39-e9e3-bce8-51ae53abc373.png)

 * データベースにある画像を更新、削除、追加することで認識可能画像を変更することができます。

プログラム上で行う場合、以下のように```AugmentedImageDatabaseEntry```を操作することで更新できます。

```ARCoreSessionConfig.cs
AugmentedImageDatabaseEntry entry = new AugmentedImageDatabaseEntry(Texture2D image);
AugmentedImageDatabase.Add(entry);
```

### 設定したマーカー画像を検知した時の処理について
以下のようにすることでマーカー画像を検出した情報を取得することができます。

```AugmentedImageExampleController.cs
public void Update(){
  List<AugmentedImage> m_TempAugmentedImages = new List<AugmentedImage>();
  Session.GetTrackables<AugmentedImage>(m_TempAugmentedImages, TrackableQueryFilter.Updated);
}
```

ここで取得できた、```AugmentedImage```は[上記](https://qiita.com/taptappun/items/a5337d29a43d5d673c7f#%E6%A4%9C%E7%9F%A5%E3%81%97%E3%81%9F%E5%B9%B3%E9%9D%A2%E4%B8%8A%E3%81%AB%E3%82%82%E3%81%AE%E3%82%92%E5%87%BA%E7%8F%BE%E3%81%95%E3%81%9B%E3%82%8B%E5%A0%B4%E5%90%88)のTrackableでもあるので、AugmentedImageからCreateAnchorを呼び出すことでARCoreの空間に出現させることができます。

## [CloudAnchor](https://developers.google.com/ar/develop/unity/cloud-anchors/cloud-anchors-overview-unity)について教えて
CloudAnchorとは、複数の端末において共通の空間を共有する機能です。iOS(ARKit)で検出している空間とも共有することができます。
以下がデモの様子です。
![CroudAnchors](https://storage.googleapis.com/gweb-uniblog-publish-prod/original_images/google_justALine_GIF6_180506a.gif)

### CroudAnchorsを試してみる。
CroudAnchorsを実際に利用できるようにするには、まずEditor→Project Settings→ARCoreを選択し、ダイアログを開きます。
![editor_arcore.png](https://qiita-image-store.s3.amazonaws.com/0/72596/5a0ae444-18c9-0cdb-0590-5785ae5aded7.png)

以下のように「Cloud Server API Key」の項目にAndroid, iOSそれぞれに対応したAPIキーを入力します。(APIキーの取得については以下参照)
![ARCoreUnitySettings.png](https://qiita-image-store.s3.amazonaws.com/0/72596/53b998b1-0a5f-b5aa-e543-197dc4dc3c2d.png)


### APIキーとは?(設定方法)
[Google API Console](https://console.cloud.google.com/apis/)を開き、ARCoreのCloud Anchorを使えるようにします。
![SearchARCore.png](https://qiita-image-store.s3.amazonaws.com/0/72596/47b6b4b3-954a-e3f5-1acc-bb42213eeb8b.png)
[Google API Console](https://console.cloud.google.com/apis/)からARCoreの検索します。
![ARCoreSettings.png](https://qiita-image-store.s3.amazonaws.com/0/72596/a48f5e2d-add8-575f-369c-830d31933f0d.png)
検索してでてきた、ARCoreの設定を「有効」にします。
![APIKey.png](https://qiita-image-store.s3.amazonaws.com/0/72596/1fbfc144-1819-809e-0f62-c19358e07d93.png)
[Google API Console](https://console.cloud.google.com/apis/)の中の「認証情報」を選択し、上記のようにARCoreが有効になっているプロジェクトのAPIキーの内容をUnityのAPIキーの項目にのところに入力します。

この状態でAssets/GoogleARCore/Examples/CloudAnchor/Scenes/CloudAnchor.unityを開き、プロジェクトこのSceneをビルドすることで、CloudAnchorsについて、試してみることができます。
<font color="#FF0000">※UnityのExamplesでのCloudAnchorsは接続がかなりシビアになっており、なかなか端末と繋げることができません。UnityではなくAndroid Naitiveでは[NearBy](https://developers.google.com/nearby/)を利用しているためか、割と繋がりやすいです。</font>

また、上記でデモ動画で行われているアプリやソースコードは以下になりますので、実装の際にはこちらも参考にしてください。

* [Just a line](https://play.google.com/store/apps/details?id=com.arexperiments.justaline&hl=ja)
* [justaline-android(Github)](https://github.com/googlecreativelab/justaline-android)
* [justaline-ios(Github)](https://github.com/googlecreativelab/justaline-ios)

【その他参考記事】

 * [グーグル「ARCore」の新機能「Cloud Anchors」、マルチプレーヤーでAR体験を共有](https://japan.cnet.com/article/35118915/)
 * [ARCoreのCloud AnchorsをSwift, iOSで試してみた](https://qiita.com/k-boy/items/69e345fc69d681a9bff3)
 * [【ARCore1.2.0版】iPhoneとAndroidでCloud Anchorの環境構築](http://www.crossroad-tech.com/entry/ARCore1.2.0_CloudAnchor_setup)


# まとめ
 * ARCoreの導入の仕方と一部ソースコードなどで解説、紹介しました
 * Unreal Engine4での導入については後ほど記事を更新したいと思います。
 * その他、気になることなどありましたらコメントいただけると幸いです

# 関連記事
 * [Unity 開発者があると便利だと思うツールを色々と作成したので公開](https://qiita.com/taptappun/items/30914c590ef5b75944a6)
 * [Unity で ARKit & ARCore AR開発環境のマルチプラットーフォーム(iOS & Android)対応](https://qiita.com/taptappun/items/bc38a446a06c83bd1898)