【8th Wall Web】Image targetsでマーカーWebARをつくる

**※この記事は2019年時点の記事で最新の内容と異なる場合があります**

## 8th WallでマーカーWebARをつくろう！
![Screen Shot 2019-09-02 at 23.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/65378986-f541-9631-4e36-dfc99d05eaa9.png)
[画像引用](https://www.youtube.com/watch?v=WjwyBLBhfXU)

2019年4月に8th Wall Webのイメージトラッキングがリリースされましたね！
任意の画像をマーカーにできるということでAR.jsよりも活用の幅が広がりそうですがあんまり日本語の記事を見かけないので、
8th Wall Webのイメージトラッキングの使い方をメモとして残しておこうと思います！

## 初めての人は8th Wallに登録しよう
8th Wall Webを利用するにはまず会員登録が必要です。
[8th Wall公式]()よりアカウントを作成しましょう。

また、8th Wallwebはデバッグするデバイス1台までなら無料
つまり自分がアクセスするだけの完全個人開発なら無料で利用できますが
多くの人がアクセスできるようにするには$99〜の課金が必要ですので注意。

8th Wallの基本的な情報はこの記事では割愛しますが
その辺りを詳しく知りたい方はこちらの記事が詳しくておすすめです。
https://bagelee.com/programming/8th-wall-web/


また、8th Wall Webで開発するにはapp keyの取得なども必要です。
詳しくは公式のチュートリアルをご覧ください。
https://docs.8thwall.com/web/#tutorial

この記事では新規プロジェクトを立ち上げた状態からのスタートとします。

## 画像を登録する
それではマーカーとなる画像を登録しましょう。

8th Wallのマイページ（dashboard）からweb Developerページに行き、画像認識を利用するプロジェクトの右側**「IMAGE TARGETS」**より**Add an image target**を選択します。

![Screen Shot 2019-09-02 at 23.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/5c9c56db-7e93-2dce-6456-813914e017f6.png)

するとアップロード画面になります。
![Screen Shot 2019-09-02 at 23.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/992a28a3-3397-1c9c-892f-49742e78af85.png)
こちらから**jpg**か**png**の任意の画像をアップロードします。


![Screen Shot 2019-09-02 at 23.47.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/dbb766d9-fc0f-e809-5e5c-4d6ff2e66156.png)
右側で画像の比率やサイズを調整。
左側に**画像タイトル（この画像の場合「mone_svg」）**が表示されますので、このタイミングで分かりやすい名前にしておきましょう。
この画像タイトルを後ほど使います。
今回は**mone-image**としました。

編集完了したらUploadを選択します。

![Screen Shot 2019-09-02 at 23.51.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/b6d378fc-2038-90c6-5450-a0af540a661b.png)
QRコードが出てきたらアップロード完了です！
こちらのQRコードにアクセスするとARマーカーが機能するかのテストができます。

テストではARマーカーの周りに黒い額縁がつくのが確認できますが、
そもそも
- アップした画像がシンプルすぎる（単純な図形など）
- 特徴量が少ない
- 繰り返しの多い模様（パターン）
このような場合は画像がARマーカーに向いておらず、正常に黒い額縁が表れないことがあります。
その場合は別の画像をアップし直すなどしましょう。
![Screen Shot 2019-09-02 at 23.55.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/d432cff4-32ba-cb05-52e6-7143e952e00c.png)
（実際こいつは全然反応しませんでした）

![Screen Shot 2019-09-02 at 23.58.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/fb7407da-3d1a-4090-d38f-322f16da59ac.png)
QRコードの下にあるLoad automaticallyにチェックを入れて、画像側の準備はここまでです。

## コードを書く
ここからはコード側でマーカーと一緒に表示するオブジェクトなどを設置していきます。

```index.html
<!DOCTYPE html>
<html lang="jp">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>image targets</title>
    <script src="//cdn.8thwall.com/web/aframe/8frame-0.8.2.min.js"></script>
    <script src="//cdn.8thwall.com/web/xrextras/xrextras.js"></script>
    <script async src="//apps.8thwall.com/xrweb?appKey=[appkey]"></script>
  </head>
  <body>
    <a-scene
      xrweb="disableWorldTracking: true"
      xrextras-almost-there
      xrextras-runtime-error
      xrextras-loading >
      <a-assets>
        <!-- 必要であればここで3Dモデルやimgを読み込む -->
      </a-assets>
      <a-camera position="0 8 8"></a-camera>
      <a-entity
        light="type: directional; castShadow: false; intensity: 0.5;"
        position="-0.8 3 1.85" >
      </a-entity>

      <a-entity xrextras-named-image-target="name: mone-image">
        <!-- ここへマーカー認識した時に表示させたいオブジェクトを子要素として配置 -->
        <a-box material="color: #00EDAF;" shadow >
        </a-box>
      </a-entity>
    </a-scene>
  </body>
</html>
```


`<a-entity xrextras-named-image-target="name: mone-image"></a-entity>`部分で先ほど登録した画像タイトル**「mone-image」**をここで書くとマーカーと紐づけられます。

このa-entityの子要素として書いたオブジェクトがマーカーの上に表示されるようになっています。

実行するとこんな感じです。
![gif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/d28cd25a-5ce8-7b14-12eb-0a52b8bc985f.gif)

boxがびっちりと張り付いています。
マーカー画像の特徴量にも依りますが、認識精度もAR.jsより良い印象。

ちなみに
`<a-box xrextras-one-finger-rotate material="color: #00EDAF;" shadow > `というように
オブジェクトに`xrextras-one-finger-rotate`をつけるとスライドさせることによってオブジェクトがくるくる回る挙動もつけられました。
![gif (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/cf42d29f-de1f-8afc-67d4-f09f1bbdeb78.gif)

可愛い。

より詳細な使い方／応用は公式のexampleが参考になりそうです。
https://github.com/8thwall/web