【WebAR】A-frameを使ってマーカー上に3Dモデルを表示するまで

# はじめに
諸事情により、アンドロイドでもiPhoneでもARができるようにしたかったため、WebARに目をつけました。
サイトを見て回って情報を集めた感じ、[A-Frame](https://aframe.io/)というフレームワークを使ったらWebAR簡単にできそうじゃん〜って思っていたらちょっと手こずったので、自分用の備忘録として手順を記録します。
ちなみにWebARとは、ブラウザ上でARを体験できるARのことです（ざっくり）。
アプリをわざわざインストールする必要がないため、とても気軽にARで遊べるようになるのです。

# 用意するもの・使用したもの
- マーカー
- A-frame
- 表示したい3Dモデル
- OBJ2GLTF（3Dモデルのデータ形式を.glbに変換）
- Netlify

# フォルダ構成
最終的な形は以下のようになりました。
これから踏む手順でダウンロードする様々なファイルは全部この中に突っ込んでいきます。

```
AR_sample
┝ cat.glb
┝ index.html
└ pattern-marker.patt
```

# 事前準備

## マーカーの準備
決められた条件を満たすARマーカーを用意します。
[こちらの記事](https://medium.com/chialab-open-source/ar-js-the-simpliest-way-to-get-cross-browser-ar-on-the-web-8f670dd45462)にも書いてありますが、マーカーの基本的な条件は以下の通りです：
1. 形は正方形
2. マーカーに白い部分や透過された部分は存在しては行けない（薄い灰色のみOK）
3. 色は使用できない
4. 内容はシンプルなもの（簡単な記号や文字）

上記を満たしている画像を用意したら、[ジェネレーター](https://jeromeetienne.github.io/AR.js/three.js/examples/marker-training/examples/generator.html)を使用してプログラム上で指定する`.patt`ファイルを作成します。([こちらの記事](https://medium.com/arjs/how-to-create-your-own-marker-44becbec1105)に丁寧に作り方が書かれています)


# 3Dモデル
今回は[Google Poly](https://poly.google.com/)から探しました。
OBJファイルをダウンロード。展開すると`.obj`ファイルと`.mtl`ファイルが入っています。（どちらも使います）

## 3Dモデルのファイルを変換
[こちらの記事](http://iti.hatenablog.jp/entry/2017/12/04/090023)によると`.glb`ファイルに変換することで軽くなるらしいです。
というわけで[変換ツール](https://github.com/AnalyticalGraphicsInc/obj2gltf)をインストールして、READMEに書いてあるように

```
obj2gltf -i AR_sample/model.obj -o AR_sample/cat.glb
```
を実行します。この時、`.obj`ファイルと`.mtl`ファイルが同じ階層にあること。
成功すると、`.obj`ファイルや`.mtl`ファイルと同じ階層に`.glb`ファイルが生成されます。
最終的にはこの`.glb`ファイルがあればいいです。




以上で準備は終わりです！

# コード
最終的なコードは以下のようになりました。
A-FrameをつかうとHTMLのようにARをタグで書いていくことができるのです。お手軽でいいですね。

```.html
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,intial-scale=1">
  <!--ここで最新バージョンのARを読み込む-->
  <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script>
  <script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"></script>
  <title>WebAR</title>
</head>

<body style="margin:0px; overflow:hidden;">

 <a-scene embedded arjs="debugUIEnabled:false; sourceType: webcam;">

    <!--ここで表示したい3Dオブジェクトのファイルを指定-->
    <a-assets>
      <a-asset-item id="model" src="cat.glb"></a-asset-item>
    </a-assets>

    <!--ここでマーカーのファイルを指定-->
    <a-marker preset="custom" type="pattern" url="pattern-marker.patt">

      <!--ここで表示したい文字を指定-->
      <a-text value="\(^o^)/" position=" -0.3 0 0.5" align="center" rotation="-90 0 0" color="#7993ff">
      </a-text>

      <!--ここで3Dオブジェクトの位置などを指定-->
      <a-entity gltf-model="#model" play-all-model-animations="" position="-0.55 0 -0.5" rotation="0 140 -10" scale="4 4 4" visible="true">
      </a-entity>

    </a-marker>
    <a-entity camera></a-entity>
  </a-scene>
</body>

</html>
```

一つ注意点としては、`a-text`タグでは日本語入力ができません。
あまり自分が文字を表示させる想定ではないため、表示させる方法は調べていません。（すみません）

----------
[ 20191223追記 ]
日本語を表示する必要が出たため、調べました。笑
以下のQiita記事でA-Frameで日本語を表示する方法をまとめてあります。必要でしたらぜひ参考にしてみてください！
[A-Frameで日本語を表示したい
](https://qiita.com/emuyuu/items/df90a011d73643b8adcb)

-------------

また、はじめ3Dモデルのscaleをやたら小さく指定しまっていることに気づかず、モデルが表示されない、、、なぜだ、、、という不毛な時間を2時間くらい過ごしてしまいました。（目視できないサイズでずっと表示されてました）
ダウンロードできる3Dモデルは様々なサイズになると思うので、はじめは scaleは指定せずに表示させてもいいかもしれないなと思いました。

# デプロイ
[Netlify](https://app.netlify.com)という無料ホスティングサービスを利用して動作確認をしました。
こんな感じに表示されました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404873/d004af20-d0bc-d512-89db-ff91cb6d24fa.jpeg" width=50%>
モデル：[Mindshow Grumpy Cat](https://poly.google.com/view/eG1Y1s88sKq)

やったぜ \\\(^o^)/

# 最後に
マーカーの準備など、思いがけないところで手間取ってしまいましたが、3Dモデルを表示させるところまでは比較的簡単に進めることができました。
まだまだアニメーションなどは未知数なので、色々と触って遊んでみたいと思います。