moyasiエフェクト館

主にエフェクト関係の記事を上げていこうかと思います。


エフェクトに関係する記事上げてきます
エフェクト関係の記事の内容は緩く募集中
自分がわかる範囲であれば書いていこうかなと。

【Niagara】渦を描くような発生位置を作る

f:id:tktknkyo:20190913210857p:plain

【初めに】
今回制作したVerの都合で少しVer古いです、ご了承下さい

Ver:UE4.21

また、サムネイルは3本のラインですが

これにはエミッターを3つ使っています、そこもご了承ください。

 

 

Twitterに投稿した、このエフェクトの前半部分の制御の内容です。

動きの制御としては、単純にクォタニオン使っていきます。

 

事前準備として、一定期間パーティクルが発生する設定をしておきます

f:id:tktknkyo:20190913215434p:plain

赤枠の部分を設定します、今回は1.2と500にしました。

 

【動きを考える】

今回の動きは二つの動きが組み合わさってます。

1、外から中心に向かう動き

2、時計回りに回る動き

 

【動きを作っていく】

今回はまず外から中心に向かう動き

を作ってから

そこに時計回りに回る動きを合わせていきたいと思います。

 

今回の制御は、速度などではなく、直接発生位置を制御していく形となります。

なので、動かすのは「Particle.Position」のみとなります。

 

f:id:tktknkyo:20190913212625p:plain

 

BPなどで、発生位置に指定した座標を持ってくる「Engine.Owner.Posion」は

パラメータの右にある▼から検索で持ってくる事が出来るようです。(最近知りました)

 

f:id:tktknkyo:20190913212905p:plain

まずはPositionをこのように設定します。

 

まず上から

f:id:tktknkyo:20190913213137p:plain

AddVectorで、AとBに入ってる数値を加算します。

Positionの設定は、基本的にはEngine.Owner.Posionと加算するのが多くなってくると思います。

 

f:id:tktknkyo:20190913213243p:plain

Bに入っているMultply Vectorにより、その下のAとBを掛け算します。

 

f:id:tktknkyo:20190913213528p:plain

最後に、掛け算のBの部分に入っている部分は

VectorをFloatに変換する機能と(Vectorの3要素全てに同じ数値が入るようになります)

最低値から最大値の乱数を出してくれる機能

となります

黄色枠の数値は、同じのを作ると勝手に出てくるだけなので、気にしなくても大丈夫です。

 

この赤枠部分は、0~1の乱数をXYZそれぞれに代入します。

ただし、VectorFromFloatで変換しているので、XYZは常に同じ数値が入ります

 

この場合X0,Y800,Z0とXYZ0~1を掛けているので

XZは0固定で、Yのみ0~800のランダムとなります。

 

この時点で発生させてみると...

f:id:tktknkyo:20190913214721p:plain

このようになりました、黄色の丸が発生位置の基準で

そこから絶対座標のY方向+0~800の位置にランダムに再生されます

(相対座標ではないので注意)

 

ですが、今回やりたいのは、外から内側に向かうように制御したいので。

ここから調整していきます。

 

f:id:tktknkyo:20190913215128p:plain

先ほど0~1の乱数にしていたところに、この「Emitter.NormalizeLoopAge」を入れましょう。

 

f:id:tktknkyo:20190913215532p:plain

f:id:tktknkyo:20190913215607p:plain

すると、このように、左の方から発生して、右の方に動いていくようになります。

 

発生位置の基準が、落ち葉の中心位置なので

そこから外に向って行っている

つまり

Yの800と掛けている数値が、増えていっているという事になります。

 

また、最初に設定してNextLoopDuration

ここは発声期間を指定していますが、ここを高い数値にすると

炎の位置はゆっくり動くようになります。

 

この事から「Emitter.NormalizeLoopAge」は、発生時間そのものではなく

発生時間を割合で取得していると推測できます(違ってたらごめんなさい)

 

f:id:tktknkyo:20190913230239p:plain

0から1では都合が悪いので

1から引き算する事で1から0になるように設定します。

これにより、外側から中心に向かう炎となります。

 

【炎の動きに回転を入れる】

 

では、次にこの動きに回転を入れて、サムネイルのような動きができるようにします。

 

今回、説明をしやすくする為にPositionの設定を分割します

 

f:id:tktknkyo:20190913230758p:plain

Niagaraは上から計算を行います

なのでこの場合、上で設定した、外から内側に向かっていく炎の計算の後に

Engine.Owner.Positionを設定しています。

この場合は下ので上書きするので、発生位置が一箇所に固定されます。

 

f:id:tktknkyo:20190913231007p:plain

なので、Positionに更に動きを入れたい場合は

この様に、計算式の中にPositionを持ってくる事で解決します。

この状態だと、XYZに0を加算しているので、何の変化も起こりません。

 

まずは角度のランダムを設定しましょう

今回はクォタニオンを使います

Niagaraでのクォタニオンの説明などはこちらの記事などを参考にしてください

tktknkyo.hatenadiary.jp

 

 

f:id:tktknkyo:20190913231928p:plain

内容としては、非常に単純で

Positionの数値を、クォタニオンで回す、本当にただそれだけです。

 

f:id:tktknkyo:20190913232103p:plain

クォタニオンを作る手段としても、回転軸と角度から作る場合は解りやすいと思います。

この場合は上のVectorが回転軸

UE4ならZUpなので、0,0,1を回転軸にして

角度には0~360の乱数を入れます。

 

これで、回ってはくれます...が

今の状態のPositionは、発生位置と加算しています。

 

つまり、相対座標としてではなく、絶対座標として回してしまいます。

個人的にNiagaraで座標を扱う場合はここが面倒かなと思います。

なので、実際作るときは、Positionはあまり別けない方がいいです。

 

f:id:tktknkyo:20190913233256p:plain

今回説明用という事で、少し強引なやり方を使います

上の赤枠でVector同士の減算をする事で、Positionが相対座標に変換し

 

その下の赤枠部分で、Engine.Owner.Positionを加算します。

簡単に言ってしまうと、計算式に、エフェクトの発生位置そのものが影響しないようにします。

 

f:id:tktknkyo:20190913233542p:plain

こうする事で、Y座標800から0に向かう動きが

半径800から0に向かう動き、に変換する事ができました。

 

ただし、今回やりたいのは

f:id:tktknkyo:20190913210857p:plain

 

このような動きを作りたいので、角度の方の制御をしていきます。

 

f:id:tktknkyo:20190913233820p:plain

単純に、角度をランダムにしていた部分に「Emitter.NormalizeLoopAge」を掛け算するのみです。

この場合だと、0から360度に変化していきます。

この360の部分を大きくすると、回転が早く、小さくすると、回転が遅くなります。

 

f:id:tktknkyo:20190913234031p:plain

これで渦を描くようにはなります。

 

ラインを3本に増やすには、エミッターを増やしましょう。

(条件指定するIF使えば一つのエミッターでも可能ではあると思います)

 

f:id:tktknkyo:20190913234625p:plain

角度を固定値で増やしたい場合は、角度の計算の後に角度を固定値で増やしてあげるだけでいけます。

 

【まとめた場合】

f:id:tktknkyo:20190913235254p:plain

まとめた場合はこんな感じになります。

 

赤枠の部分が、前半部分のY座標の800から0に向かっていく部分で

黄枠の部分が、クォタニオンを作っている部分です

紫枠の部分が、赤枠のベクトルを黄枠のクォタニオンで実際に回している部分となります。

 

今回はここまでとなります。

動画の後半部分はまた別の制御方法でやっているので。

機会があればおそらく記事にすると思います。