Apple Engine

Apple, iPhone, iOS, その周辺のことについて

ARKit (SceneKit) で Unreal Engine や Unity のようなグローパーティクルをつくる

 

SceneKit でグローなパーティクルのサンプルがなかったのでつくってみることにした。

つくってから気がついたが Apple 謹製のサンプルファイル Fox 2 での背景の火の粉のパーティクルがそれに当たる。

 

パーティクルにグローができる原理

f:id:x67x6fx74x6f:20190110190554p:plain
デフォルト / HDR + Bloom

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 を大きすると効果が現れないので注意。

 

パーティクルの設定

f:id:x67x6fx74x6f:20190110185434p:plain

画像や下の方にある GitHub のサンプルファイルを参照。 particleIntensity は強めの 3 を設定している。

 

今回のグローとは関係ないが、Animate Color で色を設定するとパーティクルが消えるまで左から右へと色が変化する。右側のアルファ値を 0 にすると徐々に消えていくようになる。

f:id:x67x6fx74x6f:20190110185518p:plain

 

また、Color variation で HSB の色のヴァリエージョン値を設定すると各パーティクルで色が変わる。

f:id:x67x6fx74x6f:20190110185539p:plain

 

サンプルファイル

github.com

 

まとめ

HDR とパーティクルの設定を行うだけでもわりとドラマチック?な表現ができると思われる。

サンプルファイルではジオメトリが大きすぎてわかりづらいが、Depth Of Field をちゃんと設定すると背景のボケが付加できたりするとさらに効果的になる。