ARKit 2 の環境マッピング AREnvironmentProbeAnchor を試してみる
Beta 版から記事を起こしているため今後変更される可能性あり。
ARKit 2 で環境マップテクスチャの作成ができるようになった。
通常は AREnvironmentProbeAnchor から環境マッピングのテクスチャを作成するのだが、SceneKit の場合は設定をするとデフォルトでオンになるため、1行書くだけで実装できる。
Xcode 10 Beta で Xcode 9 と同様に「Augmented Reality App」でプロジェクトを作成。
viewWillAppear の ARWorldTrackingConfiguration に設定を追加するだけ。
let configuration = ARWorldTrackingConfiguration() configuration.environmentTexturing = .automatic
あとは、Physically Based のマテリアルに Metalness の Float Value を 1、Roughness を Float Value を 0 に適応したアンカーやジオメトリを置くと環境マッピングされたマテリアルの反射を試すことができる。
automatic の AREnvironmentProbeAnchor 振る舞い
environmentTexturing を automatic で設置される AREnvironmentProbeAnchor は、 ドキュメントには書かれていないため詳細は不明だが、試したところ、 AREnvironmentProbeAnchor の変化があった時の端末の位置と向きを取る。
起動し端末を立てたままそのままでしばらくすると、位置は XYZ 軸で約 0 の、回転は Y軸が約 -90、extent は XYZ 軸で無限大を取る。
また、6面のキューブマップの1面の画像は 256 x 256 で構成されている模様。
(iPhone 6s で試しているため他の端末では解像度が異なるかも?)
負荷的には iPhone 6s で 60fps 切ったり切らなかったり。
AREnvironmentProbeAnchor を取得する
ARSessionDelegate の func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) を使用し、 ARAnchor の配列から AREnvironmentProbeAnchor を調べて、そのアンカーの environmentTexture から MTLTexture を取得する。
environmentTexture はすぐに生成されないのであるか無いか確認する必要があり。
また、MTLTextureType が CubeMap なので、そのまま CIImage などに変更できないので注意。
サンプル
environmentTexturing を automatic にして Metalic な球体を 0.5m 上に置いたサンプルを作成してみた。
まとめ
かなり簡単に現実空間のものを反射するマテリアルができることがわかると思う。
より精度を高めたい場合は、environmentTexturing を manual にして、自前で AREnvironmentProbeAnchor をいくつか置くと良いと思われる。