10連休に改めてARを勉強することにした。まずは1日目から3日目まで。
Day 1
10日間でARを勉強するにあたって、どこから手をつけていくか検討する。QiitaやTwitterを見る限りでは、ARKitとAR.jsが人気の様子だったので、この二つのどちらかを試していくことにした。10日間もあるので、この日はひたすらARKit / AR.jsのそれぞれのサンプルや記事を見ながら、何ができるのか/全体像を外から把握していくことにした。
ARKit関連
- ARKit (公式)
- Building Your First AR Experience (公式)
- Detecting Images in an AR Experience (公式)
- ARKit-Sampler
- ARKit-Emperor
ここで困った問題が発生した。公式サンプルはビルドできるものの、ARKit-SamplerとARKit-Emperorはビルドの途中でmacOS全体が応答しなくなってしまう問題が発生してビルドできない。環境依存の問題かと思ったが、iMacとMacBookいずれでも発生してしまい、先に進めなくなってしまったので、一旦これらのサンプルのビルドは断念。
AR.js関連
- AR.js (公式)
- 誕生日の人をちょっとだけ幸せにできるかもしれないARバースデーカードを作ってみた
- 【AR.js入門】簡単にWebARで遊んでみた【A-Frame使うよ】
- AR.jsでカスタムマーカーが認識されない場合の対処法
スマホでの動作確認にHTTPS通信が必要なため、ngrokなどを使う必要があってそこが面倒臭いのだが、ブラウザで動作するというのは気軽でよかった。ただ、開発がアクティブに行われているためドキュメント/ネット上のサンプルと最新の仕様が違っていたり、ARToolKitベースなのでARKitに比べると精度・機能・パフォーマンス的には劣る部分がある。
結局初日はARKit / AR.jsそれぞれのサンプルをいじるだけで終わってしまった。
結局ARKitがらみのビルドの問題が解決しないので一旦諦めてAR.jsを試している。もうちょっと精度があがると嬉しいのだけれども、JavaScriptで手軽に書けるのは良いな。 pic.twitter.com/6mZK7FPZ4p
— Sousai💢 (@croquette0212) 2019年4月27日
Day 2
ARKit-Sampler / ARKit-Emperorのビルドの途中にOSが応答しなくなる問題の原因がわからないのは懸念事項だが、やはり精度とデバッグのしやすさなどを考えて、今回はARKitの方を勉強していくことにした。
やっぱりAR.jsよりもARKitの方が精度もパフォーマンスも大分良い。フリーズの原因がわからないけれども、やっぱりこっちで頑張るか…。 pic.twitter.com/WUaX7YKGpH
— Sousai💢 (@croquette0212) 2019年4月28日
公式ドキュメントとネット上の記事を読みながらマーカーのトラッキングとSceneKitについて勉強を進める。公式ドキュメント以外では、下記の記事がわかりやすくてよかった。
- ARKitで作るAR名刺
- ARKit Tutorial: Image recognition and virtual content transformation (微妙に本文とコードの間に矛盾がある)
ARKitのマーカーは面白い。ARToolKit系ではマーカーはQRコードを使うことが多かったが、ARKitではカラーで特徴的な画像をマーカーに使う。確かにカラーでの識別が前提となれば白黒のQRコードよりもカラー画像の方がマーカー間の識別は効率が良さそう。
ARKitには環境マッピングのテクスチャ自動生成機能が用意されていることも知り、至れり尽くせりだなと思いつつも、ARKit以外にも色々と勉強しなければいけない範囲が大きいなということも見えてきた。10日間でどこまで勉強できるか…。
- 二つのConfigurationの違い「画像追跡」と「画像検出」
- SceneKitの使い方
- シェーダーの書き方
ARKitと関係ないが、マーカーを毎回画面に出すのが面倒くさい、かつ液晶上に表示されたマーカーは認識されにくいということもあり、コンビニで印刷して使うようにしたら便利だった。ただ、黒いインクは反射が起こりやすく、認識の妨げになるようだった。
Day 3
2日目も割とサンプルを読みながら動かすことを重視してしまったので、もう一度公式ドキュメントをしっかり読んでARKitの基礎を理解することにした。
画像追跡と画像検出の違いについてはこちらの記事がわかりやすかった。ARKit 2.0から追加された画像追跡は、超ハイパフォーマンスで動作し、マーカーの動作にも追随していくことができるが、マーカーが画面の外に出てしまった場合に座標を保存しておくことができなかったり、平面検知や環境マッピング用のテクスチャ生成などができないなど色々と制約がある。一方で画像検出の方はマーカーの動作に高速に追随していくことができない。どちらを使うべきかは作っていくアプリの内容に合わせて選んでいく必要がある。
その後、マーカーの認識精度について色々実験をしてみた。マーカーを色々なサイズで印刷し、どの程度の距離で認識できるかを試していた。画像追跡の方では、一度認識をした後は少し距離が離れていても引き続きマーカーを認識できるのだが、一度カメラの外に出てしまったりした場合は、ある程度近づかないと認識できない、という少し特徴的な挙動を確認できた。
一旦、三日分の勉強の内容をまとめて、勉強用に書いたコードを綺麗に整理したりしていたら1日終わってしまった。3日間でARKitを使うARアプリの基本的な構造と何を勉強するべきかは少し見えてきた気がする。ひとまず、今後何を作るにせよ、画面の表示の部分に使うSceneKitの理解と3D数学の理解がすぐに必要になってきそうなので、4日目はその辺りを勉強しようと思う。
続きはこちら