ARKit で HDR や被写界深度を適応する
ARKit で HDR や被写界深度を適応してみようと思う。
SceneKit ベースの ARKit のシーン上でのカメラは、ARSCNView の pointOfView へ SCNCamera を適応しているため、 SCNCamera の HDR や被写界深度を設定するとそのまま適応されるのでかなり簡単。
SceneKit ベースの ARKit の表示とカメラについて
ARKit は端末の背面ないしは前面のカメラから映像を撮り、そこから画像処理とセンサから今の場所や水平垂直などの状態を把握している。
SceneKit ベースの ARKit の View である ARSCNView は pointOfView には SCNCamera が設定されてい おり、SCNCamera の背景画像として端末のカメラ映像を貼り付けて、ARSCNView のシーンの仮想オブジェクトと合成している。
ちなみに、現状 ARKit が使用している端末のカメラ映像はプライベートフレームワークなので直接使用できない。
SCNCamera での端末のカメラ映像と仮想オブジェクトの関係は下の画像のような感じとなる。
注意点
被写界深度は仮想オブジェクトに対して適応されるため、現実空間にある手前のものに対してフォーカスは合わない。
ブルーム効果も同様。
実装
Xcode で新しい AR のテンプレートを作成し、viewDidLoad の中に以下のものを入れるだけ。
if let hdrCamera = sceneView.pointOfView?.camera { hdrCamera.wantsHDR = true hdrCamera.wantsDepthOfField = true hdrCamera.focalLength = 28 hdrCamera.fStop = 1.2 hdrCamera.focusDistance = 0.19 hdrCamera.wantsExposureAdaptation = true hdrCamera.bloomIntensity = 0.5 hdrCamera.minimumExposure = 0.5 hdrCamera.vignettingPower = 0.3 }
ビルドして動かすとこのような感じ。
わかりづらいが仮想オブジェクトから端末が離れるとボケる。
サンプルファイル
まとめ
限定的ではあるがカメラエフェクトが簡単に適応できる。
wantsHDR や wantsDepthOfField を true/false でオンオフできるし、各パラメータは実行中変更可能なので様々な表現ができると思われる。