Flaskでは Standland, FitPort, Zones の3つのアプリがiOS 11の新機能を使ったアップデートします!
iOS 11 対応のアプリで、注目されるのはやっぱりAR?
...で、Standlandに試しに入れてみたのですが、実装してみて感じたことを書いてみる。
ARをどう使う?
どんな機能としてARを利用すると楽しいのか? が難しい!なかなか心が決まらず、悶々としていましたが、最終的にはゆるーい簡単なものになりました。
家具を配置するとかの実用的なものはまだしも、ゲーム的なものはホント、誰得?ARである必要ある? と思うようなものしか想像できなくて。
ARKitとしてのトラッキングや平面認識の機能も、外の光の強さやテクスチャなどの環境に依存するので認識が遅かったり、できなかったり、おかしくなったりします。
(iPhone Xだとかなり良くなるのかもしれないですが...!)
な時間をかけて没入するよう機能は難しそうで、動きも不安定な所に課金要素を入れるのも苦しいし...ということで、お試しな位置づけで、あまり開発コストをかけないようにした。
影をつけたい
ARKitをつかってモノを配置する ということ自体はとても簡単に実装できます。分からなくて困ったのは、影を作る方法。
まるで、そこに現実にあるかのように見せるには、影はとても大事。
staticな画像を底面に置くのもアリだけど、せっかくならキャラクターが動いたらそれに沿って影も動いてほしい...!
SceneKitの場合、影を作るにはSpotLightかDirectionalLightを当てる必要があるのだけど、床にも影を作る場合には、さらにShadowModeをdeferredにする必要がある。
本当は、キャラクター本体には影を付けず、床のみに影を付けたかったのですが、CategoryBitMaskを設定してもうまくいかず断念。deferredだからかな?
環境の光の強さと色はEstimateされた値が取得できるので、Lightに設定できる。つまり、太陽光の下と電球の下とでは色を変えたり、部屋が暗くなると一緒に暗くしたりできる。
環境の光の向きも取得できるのかと思っていたが、見当たらなかったのが残念。
ARのライフサイクル
初期化処理
ARのSessionを開始すると、初期化処理から始まり、これに数秒はかかる。
周りの環境のオブジェクトを認識してトラッキングできるようにするようなもので、カメラをある程度動かさないと処理が終わらないし、といって、動かしすぎてもよくない。
これをどーやってユーザに伝えるとわかりやすいか?が難しい。平面検出
初期化処理が終わると、平面の検出が始まる。この検出処理もARKitがやってくれるので、検出できた平面情報を受け取ればOK。
平面が検出できていない or 平面ではない所 でもObjectは配置可能ではあるが、カメラを動かした時に追随してくれない可能性が高い。
平面の検出は、されやすい表面とされにくい表面がある。
暗い所や、表面が反射している素材、真っ白な素材もされにくい。
Apple Eventのデモでやっていたような、真四角の木の机はされやすい...と思う。
平面がなかなか検出されないってことは多くて、ユーザにとってイライラする所。
ポケモンGOはAR対応するって発表されていたけど、平面の検出させるのか?させないのか? がとても気になる。
セッションの中断
ARのセッション中は、カメラでトラッキングし続ける必要がある。他のアプリに切り替えたり、画面の上に不透明なModal画面を表示したりして中断されると、それまでトラッキング対象だった情報の途中情報がなくなるので、引き続き処理をしていくのが難しくなる。
Apple のサンプルコードでも中断されたらSessionをやり直しするようになっている。
そのため、AR画面中にModal画面を表示したい時には、透明部分なしのModal画面であっても、overCurrentContext で表示するようにした。
例えば、ReplayKitを使って動画の撮影できる機能を入れているのですが、その動画プレビュー画面を表示する時とか。
UI
ARの画面では、操作ボタン類を配置せず、タップジェスチャーを使って直接配置したモノを移動したり、ズームしたり、回転させたりする感じがいい。そういう意味で、UI構成の考え方は従来とはちょっと違う目線が必要だとも思った。
モノを配置するためのインジケーター
や、検出された平面の表示があるとユーザが操作し易いが、それを表示/非表示するタイミングも悩ましい所。
どんなARアプリが登場してくるのかが楽しみ!
実際にリリースするものを作成すると、他アプリを見る目が養われるのも実装した利点かもしれない。