Gaming Life

一日24時間、ゲームは10時間

UE4 Niagaraを触ってみる(2) アトラクタ Module Script自作

 シリーズNiagara第二弾。前回記事はこちら。

ai-gaminglife.hatenablog.com

 パーティクルをある点に集めるアトラクタModuleを作った。

完成品

環境

UE 4.20 Preview5

参考にしたサイト

https://www.openprocessing.org/sketch/506554

 OpenProcessingというサイト。p5.jsやprocessingで記述されたジェネラティブアートがソースコード付きで公開されている。見ているだけで楽しいのでおすすめのサイト。

Module Scriptの中身

全体図

f:id:ai_gaminglife:20180712160319p:plain

 順に追っていく。

f:id:ai_gaminglife:20180712160327p:plain

 Parameters->Moduleから

  • Vector AttractorPoint
  • Float DampingCoefficient
  • Float RangeOfTheNoEffect
  • Float Strength

を追加。Module.○○のパラメータはローカル変数のような振る舞いをし、Map GetするとEmitter編集画面で制御出来るようになる。

 今回はパーティクルそれぞれの位置と速度ベクトルが必要なのでそれもMap Getする。

f:id:ai_gaminglife:20180712160336p:plain

 AttractorPointからParticle.Positionを引き、Lengthノードにつなげることで引き付ける点と個々のパーティクルとの距離を求めることが出来る。ここから万有引力の公式に従い

(強さ係数)×(引きつけ点までのベクトル) / (引きつけ点までの距離の二乗)

でこの時刻での加速度を求められる。

 引きつけ点までの距離が "RangeOfTheNoEffect" 未満の時は速度を0に、そうでなければ前の速度に求めた加速度を加えた値を速度とする。

f:id:ai_gaminglife:20180712160345p:plain

 求めた速度に更にDampingCoefficientを乗じたものをMap SetでPartice.Velocityに戻す。

 これで、

引きつけ点から半径RangeOfTheNoEffect以上なら引きつけ点に引きつけられ、未満になると速度がゼロに更新されるモジュールが完成した。

パラメータ例

  • DampingCoefficient 0.95
  • AttractorPoint (0.0, 0,0, 0.0)

を固定し半径1000の球内に100ずつパーティクルをスポーンさせる

RangeOfTheNoEffect = 100, Strength = 20000

f:id:ai_gaminglife:20180712160353g:plain

RangeOfTheNoEffect = 100, Strength = 200

f:id:ai_gaminglife:20180712160423g:plain

RangeOfTheNoEffect = 500, Strength = 20000

f:id:ai_gaminglife:20180712160425g:plain