3D 描画エンジンが必要だ
MoAR のビルをトラッキングする VPS 部分については1日目、2日目の記事に書いたように ARCore の Geospatial API を採用することにしたけど、カメラ映像の上にオーバーレイしてさまざまな 3D コンテンツを描画するための 3D エンジンはいったい何を使うのがベストなのか?
前提条件
- App Clip と組み合わせて使えること。
- Geospatial API と組み合わせて使えること。
Geospatial API に関してはこれが無理なら Immersal もしくは Location Anchors という代替案があるからよいのだけど、App Clip は QR コードから簡単に起動できてすぐ体験できるという部分を担っているのではずせない。
Unity
モバイルアプリで AR コンテンツ作るなら普通は Unity を使う。Unity 用の AR フレームワークの ARFoundation は Geospatial API にも対応してるし。
しかし App Clip にはアプリサイズ 10MB 制限という大きな制限があるので、Unity アプリをビルドしたときに 10MB に収めることができるのかをまず調べた。
Unity 2020.3.20f1 で新規プロジェクトを作成して何も配置せずにそのまま iOS 用の Xcode プロジェクトを書き出してアプリサイズを確認してみると…
App + On Demand Resources size: 5.7 MB compressed, 21.2 MB uncompressed
App size: 5.7 MB compressed, 21.2 MB uncompressed
On Demand Resources size: Zero KB compressed, Zero KB uncompressed
なにもしてないのに 21.2MB! 全然ダメ! Unity 使えない!(iOS 16 の 15MB 制限でもおさまらない…
SceneKit / RealityKit / Metal
Unity が App Clip では使えないとなると選択肢としては iOS に含まれている SceneKit または RealityKit、もしくは Graphics API の Metal を直接叩くか? で、
- Metal はなんでもできちゃうけど低レイヤーすぎて具体的なコンテンツ作り出すまでの足回りだけでもかなりのコーディングが必要そうなのでダメ。
- 将来的には RealityKit かなーと思いつつもまだあまりこなれていないし Metal とは逆にあまり低レイヤーなことができなそうで表現の幅がせまくなりそうなのでダメ。
消去法的に SceneKit かなーってとこでさらに調べてみると、わりと歴史があって(10年前からある…)ドキュメントもそれなりに充実していてレンダリングパイプラインにも手がいれられるぐらい低レイヤーもいじれそうということがわかったので SceneKit を採用。
ちなみに Xcode で iOS の Augumented Reality App テンプレートをビルドしたときのアプリサイズは…
App + On Demand Resources size: 464 KB compressed, 699 KB uncompressed
App size: 464 KB compressed, 699 KB uncompressed
On Demand Resources size: Zero KB compressed, Zero KB uncompressed
699KB! めちゃ軽! しかもこれテンプレに含まれてる飛行機モデルが 220KB でテクスチャが 350KB なのでアプリ本体は 129KB だけ。
SceneKit で開発する…
そこそこ歴史があってドキュメントもそれなりに用意されてるとはいえ Unity のコミュニティのデカさとは比べ物にならないぐらいググっても出てくる情報が極端に少なかったりそもそもなにも見つからんということがあって、Whatever エンジニア陣には SceneKit 経験者いなかったのもあいまって、ううう いつもの Unity だったら瞬間なのにーということが多々あったりした話はまた別の記事で。