シリーズNiagara第二弾。前回記事はこちら。
パーティクルをある点に集めるアトラクタModuleを作った。
完成品
アトラクタモジュール自作した #UE4 #ai_game_study pic.twitter.com/M50BLu9bjc
— ai (@ai_9684_dct) 2018年7月12日
環境
UE 4.20 Preview5
参考にしたサイト
https://www.openprocessing.org/sketch/506554
OpenProcessingというサイト。p5.jsやprocessingで記述されたジェネラティブアートがソースコード付きで公開されている。見ているだけで楽しいのでおすすめのサイト。
Module Scriptの中身
全体図
順に追っていく。
Parameters->Moduleから
- Vector AttractorPoint
- Float DampingCoefficient
- Float RangeOfTheNoEffect
- Float Strength
を追加。Module.○○のパラメータはローカル変数のような振る舞いをし、Map GetするとEmitter編集画面で制御出来るようになる。
今回はパーティクルそれぞれの位置と速度ベクトルが必要なのでそれもMap Getする。
AttractorPointからParticle.Positionを引き、Lengthノードにつなげることで引き付ける点と個々のパーティクルとの距離を求めることが出来る。ここから万有引力の公式に従い
(強さ係数)×(引きつけ点までのベクトル) / (引きつけ点までの距離の二乗)
でこの時刻での加速度を求められる。
引きつけ点までの距離が "RangeOfTheNoEffect" 未満の時は速度を0に、そうでなければ前の速度に求めた加速度を加えた値を速度とする。
求めた速度に更にDampingCoefficientを乗じたものをMap SetでPartice.Velocityに戻す。
これで、
引きつけ点から半径RangeOfTheNoEffect以上なら引きつけ点に引きつけられ、未満になると速度がゼロに更新されるモジュールが完成した。
パラメータ例
- DampingCoefficient 0.95
- AttractorPoint (0.0, 0,0, 0.0)
を固定し半径1000の球内に100ずつパーティクルをスポーンさせる
RangeOfTheNoEffect = 100, Strength = 20000
RangeOfTheNoEffect = 100, Strength = 200
RangeOfTheNoEffect = 500, Strength = 20000