ARKit (SceneKit) で Unreal Engine や Unity のようなグローパーティクルをつくる
SceneKit でグローなパーティクルのサンプルがなかったのでつくってみることにした。
つくってから気がついたが Apple 謹製のサンプルファイル Fox 2 での背景の火の粉のパーティクルがそれに当たる。
パーティクルにグローができる原理
3DCG におけるグローとは、カメラにおける光の滲みのような状態で、強い光源にレンズを向けた際に光が白っぽくかぶるフレア現象。
または、デジカメで強い光源がイメージセンサーに画素の許容量を超えた際に光が滲んだように周囲に広がるブルーミングのこと。
SceneKit では HDR 設定をオンにして Bloom の設定をいじり、ジオメトリでマテリアルの輝きの値である Emission をあげるとグローができる。
これと同様にパーティクルも輝きの値をあげるとグローの表現が実現できる。
パーティクルで追加された設定
iOS 11 の SCNParticleSystem では、パーティクルに輝度を与える以下のプロパティが追加されている。
- particleIntensity
- particleIntensityVariation
particleIntensity は輝度で、particleIntensityVariation 他の variation と同様にパーティクル生成時に入れた値をプラスマイナスする。
particleIntensity が 4、particleIntensityVariation 2 の場合、4 ± 2 となるので、2 〜 6 の値が生成時にランダムで設定される。
HDR の設定をしてみる
今回、作成したサンプルが ARKit のプロジェクトであるためカメラ設定をコードで書いているが、Scene Editor でカメラを設置して値をいじった方が楽だと思われる。
hdrCamera = sceneView.pointOfView?.camera hdrCamera.wantsHDR = true hdrCamera.wantsExposureAdaptation = true hdrCamera.exposureAdaptationBrighteningSpeedFactor = 0.4 hdrCamera.exposureAdaptationDarkeningSpeedFactor = 0.6 hdrCamera.minimumExposure = -15 hdrCamera.maximumExposure = 15 hdrCamera.bloomIntensity = 2.0 hdrCamera.bloomThreshold = 0.6 hdrCamera.bloomBlurRadius = 30
軽く説明すると wantsHDR = true で HDR カメラ表示に変更、wantsExposureAdaptation と以下で露出の自動調整を行なっている。
その下の bloomIntensity、bloomThreshold、bloomBlurRadius でブルーム効果の設定を行なっている。
文字通り bloomIntensity でブルームの強さ、bloomThreshold でしきい値、bloomBlurRadius で光の滲み具合の半径設定している。
bloomIntensity や bloomBlurRadius を小さくしすぎたり、bloomThreshold を大きすると効果が現れないので注意。
パーティクルの設定
画像や下の方にある GitHub のサンプルファイルを参照。 particleIntensity は強めの 3 を設定している。
今回のグローとは関係ないが、Animate Color で色を設定するとパーティクルが消えるまで左から右へと色が変化する。右側のアルファ値を 0 にすると徐々に消えていくようになる。
また、Color variation で HSB の色のヴァリエージョン値を設定すると各パーティクルで色が変わる。
サンプルファイル
まとめ
HDR とパーティクルの設定を行うだけでもわりとドラマチック?な表現ができると思われる。
サンプルファイルではジオメトリが大きすぎてわかりづらいが、Depth Of Field をちゃんと設定すると背景のボケが付加できたりするとさらに効果的になる。