【SD】オーラっぽいテクスチャを作る
Verは2018.1.1です
以前に作ったものなので、一部記事内でノード差し替えてます
SubstanceDesignerでオーラっぽいテクスチャを。
全体の構造
大きく4つに分けます
1・全体の明暗を調整する部分
2・一番のベースとなる模様
3・タイリングの誤魔化しとして、ベースに混ぜる模様
4・1~3の要素の合成&最後の調整
1.全体の明暗を調整する部分
ノイズのこのノードをベースにします
このノードを二つ作り、数値を調整して違うパターンにします
これを、指方向ブラーで上下にブラーを掛けます、角度の回転を0.25にすると、上下のブラーに変化します。
その後、トランスフォームのこのノードで角度を変更します。
最後に、ブレンドノードで、乗算で接続します。
所々黒っぽい部分を作りたいので、片方は全体が白っぽく、もう片方はちょっと明暗を強くすると、綺麗になりやすいです。
ベースのノイズのコントラストや、座標を調整していきます。
2.ベースとなる模様
一番の下地となる模様です。
Perin Noise1がVerで無くなったようなので、差し替えてます。
ノイズのこちらを
パターン違いで同じノードを二つ使います
比較的大きくした後に、レベル補正で明暗をある程度はっきりするように調整します。
大体こんな感じでしょうか。
レベル補正したものを、両方ブレンドノードに繋ぎ、合成方法は最小(暗)で。
この時点で、一番左のようなのになると思うので、再びブレンドノードで
今度はOverlayで合成します、これでコントラストがハッキリします。
その後はトランスフォーム2Dで、高さを20%にする事で、細長くしてタイリング処理を行います。
最後の微調整の部分
使うノードはパターンのこちら
Rotationで横から縦にして、タイリング処理を切った後、Tilingのパラメータで細くしていきます。
その後、トランスフォーム2Dで左右に分かれるように位置を調整した後にブレンドノードで減算して、左右を暗くします。
不透明度は少し低めに(今回は0.25にしています)
3.ベースに混ぜるノイズ
ベースになるのはこのノイズです
綺麗に見せるコツとしては、赤枠の部分の様な大きめの黒い部分を極力なくす事です。
続いて、調整のこのノードで、白黒を反転させます
その後は、このノードを二つブレンドノードで、加算させて白を強くします
最後にトランスフォーム2Dの、高さを25%にしてタイリングさせます。
4.合成&調整
この部分は、1,2,3で作った部分です、それらの合成です
下側のブレンドは最大(明)
右側のブレンドはSoftLightです。
この状態だと、タイリングがやや目立ってしまってもいるので、ちょっと誤魔化します。
トランスフォームのこのノードを
斜めにズラすようなノードで、これによってタイリング部分を多少誤魔化します。
その後、指方向ブラーで左右にブラーを掛けます(この部分は、個人によって好みが別れそうです)
最後にトランスフォーム2Dで回転させて完成です。
なお、最後に極座標変換するトランスフォームのこのノードを使えば
この様な見た目に、
その後、パターンのこのノードなどで円を作り
ブレンドノードで乗算すればこの様にもできます。
単純な板ポリに貼る場合には、中々使い勝手があると思います。
こういうオーラっぽい表現好きなのですが伝わりますかね... pic.twitter.com/1f1hGArLLn
— moyasi@エフェクト勉強中 (@torisutamoyasi) May 19, 2018
このエフェクトのメインの部分に使ってます
極座標掛けずに、モデルに貼る使い方だとこちら
#Effekseer
— moyasi@エフェクト勉強中 (@torisutamoyasi) January 28, 2018
配信で作ったやつです
地面から水流が流れる水属性攻撃魔法イメージです
制作時間は約1時間半
早いのか、遅いのかは、想像にお任せします。 pic.twitter.com/sRP3yN1znt
中心の柱部分の模様みたいな部分に使っています。
【Houdini】行列を使って外側に向ける
Houdiniでのモデリング関連の記事です。
Houdiniでメッシュ作るときに便利そうなものを、メモ代わりにも書いていこうかなと。
というわけで今回は、行列とか使って外側に向きを向けようかなと。
下準備とか色々
ノードツリーとしてはこんな感じ、Tubeでベースを作って、CopyToPointで複製します。
Fuseは、ポイントが重なってる部分を結合しています。
ポリゴン数を無駄に増やさない為にはあったほうがいいですが、処理自体はなくても特に問題はありません、ただ若干乱数入れる場合はあったほうがいいかもしれません。
また、形を作る関係上、頂点の部分をグループに入れておきます。
if(@P.y != 0){@group_ypos = 1;}
コードとしてはこちら、内容としては
ポイントのY軸が、0でないなら、yposというグループに入れる、という処理です。
行列を使った動き
vector axis = set(0,1,0); //Y軸の回転軸を変数に保存
vector4 q = quaternion(atan2(@P.x,@P.z),axis);
//角度をatan2で取得してクォタニオン生成
vector pivot = @P; //行列回転のために、位置を変数に保存
@P -= pivot; // 行列回転の為に、一旦原点に移動
matrix m = ident();// 単位行列を生成
vector dir = set(0,0,ch("R")); // 開き角度をシリンダーから取得
translate(m,dir); //開き角度から移動行列を生成
matrix m2 = qconvert(q); //クォタニオンを回転行列に変換
@P *= m; // 移動行列を乗算
@P *= m2; //回転行列を乗算
@P += pivot; // 位置を元に戻す
コードとしてはこちら、また、ノードのGroupにyposといれて、頂点の部分のみ動かすようにしてください。
(青文字はコメントアウト部分)
vector axis = set(0,1,0); //Y軸の回転軸を変数に保存
この部分は、単純に回転軸を取得しているのみ、基本的に正規化する必要がありますが、既にY軸の1のみなので、する必要はありません。
vector4 q = quaternion(atan2(@P.x,@P.z),axis);
//角度をatan2で取得してクォタニオン生成
先ほどの回転軸と、atan2で取得した角度にて、クォタニオンを作ります。
Y軸が赤線部分で、Y軸に回転させるばあい緑の矢印の回転をするようになります。
角度は、atan2により中心からの開き角度をとってきます、2チャンネルの情報で、XとZ軸のみとってきています(Y軸は無視してます)
このように並んでいるジオメトリの、頂点の部分が、中心から見て何度の位置にあるのかを取得します(距離は関係ないです)
vector pivot = @P; //行列回転のために、位置を変数に保存
@P -= pivot; // 行列回転の為に、一旦原点に移動
行列の回転させる場合、Pの位置情報を元に回転させます。
なので、例えばXが10の位置であれば、自転ではなく公転の様な動きになってしまいます、今回だとこれでは都合が悪いので、一旦変数pivotに保存してから、原点に移動させます。
matrix m = ident();// 単位行列を生成
ここで単位行列を作ります、行列関係では基本的に必要になってくるものです。
それをmという名前の変数に保存します。
vector dir = set(0,0,ch("R")); // 開き角度をシリンダーから取得
ここでは、どの位移動するのか?を定義します、今回はZ軸のみで、移動量は後から変更しやすくしたいので、シリンダーから取得します。
入れる数値は定数でも問題ありません。
translate(m,dir); //開き角度から移動行列を生成
先ほどの、シリンダーから取得したZ軸の移動から、移動行列を作ります
作った単位行列と、先ほどの移動値の情報から、移動行列を生成します。
matrix m2 = qconvert(q); //クォタニオンを回転行列に変換
今度は、先ほど作ったクォタニオンから、回転行列をm2という変数名で作ります。
クォタニオンでつくる場合は、単位行列を事前に作る必要がありません。
@P *= m; // 移動行列を乗算
@P *= m2; //回転行列を乗算
先ほど作った、二つ(移動と回転)を乗算させて動かします。
行列同士の乗算では、後ろの方から計算されるのでこの場合
回転行列により回転させたあとに、移動行列で動かしています
移動はZ軸のみですが、その前に回転行列で角度を変えるので、変えた角度からZ軸動くことにより移動する方向が変わってきます。
外側に向くような方向に移動させている内容としては
回転行列を作るときにatan2にて、角度を取得していてその角度を使うのが理由です。
@P += pivot; // 位置を元に戻す
最後に、位置を元に戻します。
前のHoudiniの記事ではごっちゃになってしまったので
これからは少ない部分を細かく書いていけたらな、と思います。
【Houdini】氷柱用のモデルを作る
Houdiniのモデリングの記事です。
UE4に入れてマテリアルを設定したら、こんな感じになります
結構綺麗かなと、この角度になっているのは、ライディングの影響が解りやすい角度を探した結果です。
全体の構図
大体の役割としてはコメント参照にて
流れとしては、6角錐を合わせたような図形を作ります。
この時点でUV展開をして、まず細長くし、それを基本の形とします。
それを、複製して、角度を外向きに変更します。
これと、中心のを合成させて、その後ポリゴンを、割ったり位置を変えたりで形を整えます、最後に仕上げて下を切り取ります。
中心の基本となる部分
この部分はすぐできそうな形ですが。
基本形状となる、六角錐を合わせたような形は、Sphereで作ります
Polygon Meshに変更して、あとはポイント数などを調整します。
続いて、UVTextureでUV展開します、設定は初期設定です。
その次に、uvquickshadeを繋ぎます、これでUV座標が表示されると思います。
次にPointWrangle
if(@P.y == 0){@P.y += ch("Height");}
コードはこちらを
その後、赤枠の部分をクリックすると、赤線の部分が出てくるので自由に動かしてください、大体0.45位が良いかなと。
コードの内容としては、IF文でY軸が0のポイントを判定して
そのポイントのY軸を、このスライダーの数値分加算しています。
Y軸が0になるのは、周りの部分のみなので、この部分のみ座標を変化させます。
続いてTransformノード
こちらは、外からパラメータを弄れるようにしてあります、線の色が同じ部分は同じパラメータです。
このパラメータの参照箇所としては色々ありますが、後から調整しやすくする為に、SubNetworkノードに纏めています。
SubNetworkノードは、ノードの中にノードを入れることができ、このノードツリーも全てSubNetworkの中に入っています。
ここから、パラメータを追加することができます、ドラッグ&ドロップで右側に移します。
ここで、パラメータの下限と上限を設定できます、ただしこの上限などは、スライダーでどこまで変化できるかで、数値を直接入れる場合には特に影響ありません。
今回のパラメータの全体図はこちらに、Floatと、Float2とInt型を使っています。
パラメータの部分を右クリックから、コピーして
貼り付けたいところでは、右クリックからこれで貼り付けます。
なお、この部分の数値は基本的に直接指定しても問題は特にないです、あとで作り変えたいときなどは、作っておくと便利になります。
途中でパラメータの説明入りましたが、ここで中心の元は完了
周りの氷柱
次はこの部分です
左上のTransFormと、PointWrangleから
基本サイズを調整する用です。
if(@P.y == 0){@P.y -= ch("Height");}
コードはこちら
中心の位置をずらす処理、中央のにもあるのと同じパターンです、ただこちらは逆さま向きです、理由は、コピーした時に、向きが変になった対処、理由はちょっと解ってないです。
右上側の、SphereとPointWrangle
コピーするためのポイントの元になるジオメトリです
文字列の部分は、ポイント数です、ここを弄れるようにすれば、周りの氷柱の数を調整できるようになります。
if(@P.y != 0){removepoint(0,@ptnum);}
@P *= `chs("../IceLocal")`*(1+(rand(@ptnum+`chs("../Randseed")`)*`chs("../LocalRandLevel")`));
コードはコチラ
if(@P.y != 0){removepoint(0,@ptnum);}
ここの部分は、ポイントのYが0でないポイントを全て削除します
@P *= `chs("../IceLocal")`*(1+(rand(@ptnum+`chs("../Randseed")`)*`chs("../LocalRandLevel")`));
ここは、発生位置にランダム性を持たせるためです。
次の、CopyToPoint、PointWrangle、Unpack
この次に、行列などで回転させたりするので、このチェックでPack化します。
@P += set(0,`chs("../IceHeighty")`,0);
vector4 @quat = {0,0,0,0};//クォタニオン生成
vector scl = set(0.5*(1+(rand(@ptnum+`chs("../Randseed")`)*`chs("../SizeRandLevel")`))/2,2,0.5*(1+(rand(@ptnum+`chs("../Randseed")`)*`chs("../SizeRandLevel")`))/2);
matrix3 m = ident();
vector4 q = quaternion(radians(`chs("../IceRotation")`),{1,0,0});
vector4 q2 = quaternion(atan2(@P.x,@P.z),{0,1,0});
vector4 q3 = qmultiply(q2,q);
vector4 q4 = quaternion(radians(rand(@ptnum)*360),{0,1,0});
vector4 q5 = qmultiply(q3,q4);
scale(m,scl);
m *= qconvert(q5);
setprimintrinsic(0,"transform",@ptnum,m,"set");
結構長いです...
最初の行は、全体の高さを変えるだけです
それ以降は、クォタニオンやら行列関係使ってます
最初に、X軸を傾けて、その後Atan2で角度を習得してその角度でY軸に回転させます。
そうすると、外側に向くようになります。
作ってから期間空いて内容忘れてる部分もあるので、コピペなどしてご利用下さい...
最後にUnpackで、Packを解除します
合成、仕上げ
ノードは上からMerge、Subdivide、Pointwrangle、Subdivide、Clip
Mergeは、中心のと外側のを合成します。
Subdivide
ポリゴンの分割数だけを増やします。
PointWrangle
@P.x += (rand(@ptnum)-0.5)*(`chs("../SizeRandLevel")`)*0.1;
@P.y += (rand(@ptnum+1)-0.5)*(`chs("../SizeRandLevel")`)*0.1;
@P.z += (rand(@ptnum+2)-0.5)*(`chs("../SizeRandLevel")`)*0.1;
コードはこちら、X,Y,Z軸を、それぞれバラバラに位置を移動させます、これにより、全体を変形させます。
Subdivide
ここで更に分割します、Crease Weightのパラメータで、分割した部分を調整する事ができます、ここも外部から操作できるようにするのも良いかなとは。
最後にClipを繋げば完成です。
外部のパラメータ参照が多くて結構わけわからなくなってきそうなので、一応データ置いておきます。
ちょっと雑な説明になってそうですが、次から記事書く事考えてファイルも作っていけたらなと思います。
【UE4】インプットデータ~Paticle Relative Time
マテリアルのノードの一つである「Particle Relative TIme」
名前の時点で、大体想像つきそうな気がします
マテリアルでの詳細としては
この様な事になります。寿命によって0→1に変化する数値ですね。
ただ説明なだけだと、公式を見れば済む、の一言で終わってしまうので、自分なりに考えたり、サンプルのアセット覗いて知った事などを、書いていこうと思います。
Lerpと繋ぐ
とりあえず、で解りやすい内容だとLerpと繋ぐのが非常に解りやすいかと思います。
単純にAからBに変化します
Scala Parameterと併用すれば、何処から何処まで変化させるか、をマテリアルインスタンス側で制御できるようになります、当然BPで変化させるのも可。
Texture Sampleと合わせると、画像を変化させる結果に。
Paticle Relative Time自体は、基本的に0から1に変動させているだけなので、DynamicParameterで基本的に代用が出来ます。
Dyamic Parameterについてはこちらの記事で。
ただDyamicParameterが使えないGPUの場合を考慮すると。(DyamicParameterの数値を変化させる、Parameterモジュールが機能しない為)
GPUタイプでしか作用しない、Particle Randon Valueとの併用。
Particle Randon Valueは、GPUタイプのみで機能する、発生ごとに0~1のランダムな数値を出力するノードです。
これとLerpを合わせると、AからBまでのランダムな数値を出力します、この例だと0.25~1.5の間でランダムに出力。
次のLerpにより、発生直後は0で0.25~1.5までの間に変化するようになります。
それでこの数値をどうするか?としては。
例えばこんな感じに、この場合
左から0、0.25、1.5となります。
実際に使う場合は、オパシティや、マスク用テクスチャなどで周りは切り取ると綺麗になります。
三角関数と合わせて
三角関数であるサイン(sine)とあわせて使う方法
まずサインでどういう事が出来るか
とりあえずは角度を取って長さを返します
ノードに接続しているのは、Rotation型変数ではないですが(マテリアルエディタなのでこの型がそもそもない)
数値を角度と扱って習得します。
中心ズレてますが、円があって、緑がX、赤がY、中心の紫が原点があるとします。
取得する角度というのは、中心から一本線があるとして、その開き角度です。
この茶色が、入力する角度、そして左の黄色の線が、返す数値です。
線の長さは、黒丸の半径と同じです。
返す数値は割合で返します黒丸の半径と、黄線の長さの割合です、この場合大体50%位になると思います。
また、このように180°を超えて下側に行くと、負の数値になります。
マテリアル側での数値的には、0だと0°で、1だと360°として扱います。
Paticle Relative Timeは、0から1に変化する値なので、丁度一周します、したがって0→1、1→0、0→-1、-1→0、の変化をします。
ただ負の数値になると少々面倒なので、半分の数値にしています。
これにより、0から1、1から0の変化するようになります。
先ほどの、サインの処置が赤枠部分、続けて黄色の部分では
タイリング処理からRのみ取り出して、Addによる加算をすることで
横方向にスクロールさせています。
フェードインとアウトを作る
実際の用途的に考えると、このように繋げば、フェードインとフェードアウトを作ることができます。
ただ、この状態では用途が限られるので色々弄っていきます。
掛け算してから、Clampする方法。
この図では2倍しているので、0→2、2→0の変化ですが、Clampによって、1以上を強制1にします、従って1の期間が長くなります。
具体的には、こんな感じの変化になります青枠は赤枠に比べて真っ白な部分が増えているのがわかると思います。
このままだと、フェードインとフェードアウトが一緒になってしまうので、IFで変える手段。
Paticle Relative Timeと、0.5の定数で比較して、フェードインか、フェードアウトなのかを判定させ、それぞれ黄色枠と、青枠で、別々に設定することができます。
今回の場合、こんな感じの変化となります、左右でグラデーションが変わっているのが解ると思います。
自分なりに色々用途考えた結果、この様になりました。
基本的にGPUタイプを使う場合のDynamicParameterの代わりとして使ったり、ピンが足りない場合などに使うかな?と思います。
後半の透明度に関しては、カスケード側でαのカーブを直接弄ったりするのが面倒なら、このカーブをインスタンスでも変えれるので使い道がありそうなのかな?と
三角関数と合わせると結構他にも用途はあると思います、良さそうな使い方があれば、教えていただけると大変助かります。
【Effekseer】2D風斬撃エフェクトを作ろう
今回はちょっとした作例を、比較的にシンプルな斬撃エフェクトです。
全体の動きとしてはこんな感じです。
剣線メイン
最初の斜めのライン
剣線グロウ
最初の斜めのラインの、水色部分
衝撃纏め
衝撃部分を纏めるノード、発生タイミングなどの制御で、描画自体はしない
線 メイン
外に広がる細長いライン
線 グロウ
外に広がるラインの、水色部分
線 中心 メイン
中心にある、細長いライン
線 中心 グロウ
中心にある、細長いラインの、水色部分
歪み
加算合成での歪み
グロウ
うっすら背景にある、水色の部分
今回のテクスチャは、
殆ど左側、歪みノードのみ、右側使ってます。
剣線メイン
メインとなる斬撃部分。
生存時間
30F
ここで生存フレーム数を調整します。
位置(イージング)
X7→X-5
高速2、低速3
今回は、X軸に動かして、剣線部分の動きを作ります。
生成方法(円、生成角度に影響にチェックを入れる)
開始角度60
生成位置種類、正順
ここで角度を調整します、開始角度が60、終了角度が360なので60~360の間になるのですが
生成位置種類を正順にすると、開始角度から順番に生成されます、発生数が1の場合、最初の開始角度からしか生成されません。
拡大(イージング)
X2,Y0.25→X3,Y0.1
高速2、低速3
段々と細長くなる動きにします。
描画
Z軸回転ビルボード
描画共通
ブレンド:加算
フェードイン:5
フェードアウト:10
加算合成にして、フェードイン、フェードアウトを設定
解りにくい場合は画像を参考にしてください。
剣線グロウ
剣線メインと合わせて表示してます
共通
生存時間、30
メインと同じ生存時間にします
拡大
X2、Y1.25
剣線メインより、ある程度大きめにします
描画
配置方法:Z軸回転ビルボード
全体色
R0,G255,B255,A255
配置方法は、剣線メインと同じに、色は水色に設定します
描画共通
ブレンド:加算
フェードイン:5
フェードアウト:10
ここは剣線メインと同じに。
衝撃纏め
衝撃部分の、発生タイミングの調整のみ
共通の、生成開始時間を8に
線 メイン
外側に広がるラインです。
共通
生成数:100
生存時間:5~25
生成時間:0.025
生成開始時間:-1
発生数を100に、生成時間には、大きめな振幅を
位置(イージング)
Y0→1.5~4.5
高速2、低速3
Y軸方向にラインを動かします。
生成方法(球)
生成角度に影響にチェックを入れる
X軸角度:0~360
Y軸角度:0~360
角度をランダムになるように設定する。
拡大(イージング)
X0.15~0.35→0.05~0.15
Y0.8~1.2→1.5~2.5
高速2、低速3
細長くなるように設定
描画
配置方法;Y軸固定
配置方法をY軸固定に
描画共通
ブレンド:加算
フェードイン:5
フェードアウト:10
線 グロウ
線メインと合わせて使うようのノードです。
共通
親削除時削除にチェック
生存時間:25
親である線 メインが消えた時に消えるように
拡大
X1.5
Y1.25
多少大きめに設定
描画
配置方法:Y軸固定
全体色
R0,G255,B255,A255
色を水色に
描画共通
ブレンド:加算
フェードイン:5
フェードアウト:10
線 中心 メイン
中心に配置する衝撃部分
共通
生成数:25
生存時間:5~25
生成時間:0.025
生成開始時間:-1
線 メインを流用、生成数だけ1/4に(中心部分の方が重なりやすいので発生数は少なめに)
生成方法(球)
生成角度に影響にチェックを入れる
X軸角度:0~360
Y軸角度:0~360
ランダムな方向に向くように
拡大(イージング)
X:0.075~0.175→0.025~0.075
Y:0.8~1.2→2~4
高速2、低速3
細長くなっていくように
描画
配置方法:Y軸固定
配置方法は線 メインと同じくY軸固定に
描画共通
ブレンド:加算
フェードイン:5
フェードアウト:10
加算合成にして、フェードイン、フェードアウト設定
線 中心 グロウ
線 中心 メインのノードと合わせて使います
共通
親削除時削除にチェック
生存時間:25
線 中心 メインが消えたときに同時に消えるように
拡大
X:1.5
Y:1.25
線 中心 メインより大きめに
描画
配置方法:Y軸固定
全体色
R0,G255,B255.A255
色を水色に
描画共通
ブレンド:加算
フェードイン:5
フェードアウト:10
歪み
※歪みは、単体では見えないので、このGIFでは歪みのチェックを外して表示しています
歪みってそもそも何?という方はこちらをどうぞ
共通
生成数:3
生存時間:20~40
生成時間0.1
生成開始時間:-1
ランダム性を出すため、一度に複数発生させて、生存時間は長めで振幅も大きめに設定します
回転(角度・速度・加速度)
角度Z:0~360
Z軸の角度をランダムに
拡大(単一イージング)
5→12.5~17.5
高速2、低速3
ほかの要素を、全部覆うくらいの大きさになるように
描画
全体色:イージング
R255,G255,B255,A255→R255,G255,B255,A0
段々透明にしていく
描画共通
ブレンド:加算
フェードイン:10
フェードアウト:10
歪みにチェックを入れる
歪み強度:0.2
歪みがあると、この位見栄えが変わってきます、ただ結構調整面倒な部分もあります
グロウ
背面に付けるグロウ
共通
生存時間:30
生存時間はやや長めに
拡大(単一イージング)
5→10
高速2,低速3
全体的に大きめに
描画
全体色
R0,G255,B255,A128
水色で半透明に
描画共通
ブレンド:加算
フェードイン:10
フェードアウト:20
これで完成です。
また、色合いにランダム性もたせたりすると、結構綺麗な色にもなったりします
具体的には
線 グロウ
線 中心 グロウ
この二つの色を
このように設定して
グロウのノードはR0G64B255A128にします(Gを255から64に)
連番画像に出力するとこんな感じです。
【UE4】カスケード、発生数やフレーム関係
サムネイルはやや適当です、ご了承ください。
今回は、以前よく解ってなかった発生数などに関する内容を。
カスケードでの発生数に関する部分は、必須モジュールである「Spawn」モジュールからが主です。
Spawnモジュール
持続的に発生させる場合は、基本的にこちらを使うことになると思います
赤線の二箇所はデフォルト設定の20と1
この状態だと、1秒間に(20*1)の数だけ発生(Spawn)します。
数値が二つありますが、この二つは乗算されます、なのでRateに基本となる発生数を入れておいて、RateScaleで、%として調整したりする事もできます。
この場合の利点として、パラメータを公開してBPで発生数を変動させる場合。
発生数そのものを入れる必要がなく、基準の発生数からの割合で大丈夫になります。
これにより、基準からの割合のみで設定できるので、BPで発生数を変えたい場合に、元の発生数を直接入れたりする必要が無いのが楽です。
【UE4】Particle Instance Parameter について(解説)
パラメータ公開から、BPでの編集手順は、この方が書いてくださってますので、参考にしてください。
次に、Burstを使う場合
BurstListの横にある、+のマークをクリックすると、この様なのが出てきます
Count
基本となる発生数。
CountLow
発生数にランダム性を与える場合に使います。
デフォルトの-1は、無効化されている状態です、0以上の数値を入力すると
発生数がCountからCountLowの間からランダムになります。
Time
発生するタイミングを時間で設定します、0.5なら0.5秒後に
ただし注意が必要なのは、エミッターが残っている状態でないと、発生されません。
デフォルトの状態で、1以上に設定すると発生しなくなります、恐らく仕様です。
BurstScale
RateScaleと同じく、Burstの発生数を一律調整出来ます。
Rateと違い、発生タイミングをずらして多数配置した場合に、全て調整したい場合などにも使えます。
ただしその場合、BPで全体の調整はしにくくはなるので注意。
発生のタイミングなどの調整などは、Spawnではなく、必須モジュールである「Required」で調整します。
Requiredモジュール
エミッターの継続時間などを制御するDuration
Emitter Duration
基準となるエミッターの寿命のようなもの。
Spawnで、発生を遅らせる場合、この寿命の範囲内でないと、発生する前にエミッターが消去されます。
ただし、寿命のようなものですが、このエミッターの寿命が越えてもSpawnされたパーティクルが残っている場合には破棄されません。
(それなら、発生遅らせている場合、発生するまで待っても良いのでは?とは思ったりも)
Emitter Duration Low
CountLowと似ていますが、こちらは-1などにしても、無効化されません、またデフォルトで0になっています
この下にある、Emitter Duration Use Rangeにチェックを入れると、有効化されます。
Duration Recalc Each Loop
これにチェックを入れると、ループする事に乱数を変えてくれるというもの
ループ無しの場合は、基本的に意味を成しません。
例えば、Loop数が5の場合
チェックを入れていない場合、このエミッターが生成された時点で、乱数が決定され、5回のループ中は発生間隔が同じになります。
チェックを入れると、この部分に対してランダム性が出てきます。
主にBurstと組み合わせて使うものになると思います。
Emitter Loops
そのままに、何回発生処理を行うか?というもの。
デフォルトで0になっていますが、0の場合無限に繰り返されてしまいます。
焚き火や、滝の水しぶきなどでは、この設定でいいのですが
ヒットエフェクトなどの場合、基本的には1に設定する事が多いと思います。
Delay
ディレイ、いわゆる発生を遅らせたりする要素です。
Emitter Delay
指定した秒数だけ、エミッターの発生を遅らせることが出来ます。
基本的なディレイです、Emitter Loopsのループさせる場合、ループ毎に発生を遅らせます。
Emitter Delay Low
Emitter Duration Lowと殆ど似たようなもので、遅らせる時間に、ランダム性
持たせます、デフォルトでは無効になっています。
有効にしたい場合はその下にあるEmitter Delay Use Rangeにチェックを
Delay First Loop Only
チェックを入れるとEmitter Delayで設定した遅延を、ループさせている場合、最初の発生のみにします、多段攻撃などのエフェクトなどにあっていると思います。
今回はここまでで、この辺が把握できてくると、タイミングや発生数の制御は大体出来ると思うので、自由に作れるようになるのでは?と。
【SD】FX-MAPの反復ノードで不規則に複製する
今回はFX-MAPの反復ノードを
本来なら、クワドラントだけで模様作っていくのが基本かなとは思うのですが、ちょっと調べてみたところ、反復ノードが便利だなと思ったので。
まず、複製する元になるものを用意します(これは基本なんでもいいです、ノイズ系は解りにくいですが...)
それにFX-Mapに繋ぎます。
また、複製したいものを繋ぐ場合、下の方に接続してください、上の接続は、中央に出てしまいます。
FX-Mapノードを右クリックすると、FX-MAPを編集というのがあるので、これからFX-Mapの中に入っていきます。
最初に、クワドラントというのが出ています。
ここに、反復ノードというのを出して、繋げます(右側の入力に繋いでください)、また反復ノードを右クリックからルートとして設定を選択してください。(出力ノードのようなものです)
また、FX-Map内では、ノードは下から上に流れます
まず、クワドラントの方の設定で、パターンをInputImageに、これでFX-Mapに接続しているノードの情報を取ってきます
パターンオフセット、パターンサイズ、パターンを回転
この三つは、空の関数から、関数を作ります。
次に、反復ノードの、反復回数のバーを動かすと、同じ位置に複製されているのがわかると思います(グラデーションがかかってるものだと、白くなっていくと思います)
この反復ノードは接続している情報を、複製する様なノードです、この段階だと全く同じサイズ、位置、角度で複製をしています。
ただこの状態だと複製はしていても余り使い道が薄いので(グラデーションの調整には使えるといえば使えますが)
位置などにランダム性を追加します。
ただ、反復ノードではなく、クワドラントの方でランダム性は作っていきます。
先ほど空の関数で用意した、クワドラントのパターンオフセット、パターンサイズ、パターンを回転、の関数を作っていきます。
パターンオフセット
まず、Floatで1の定数に設定し、それをRandomノードに繋げて
最後にVectorFloat2に接続、VectorFloat2を出力ノードに設定します。
Randomノードは、0~入力した数値までのランダムな数値を返します(もし間違ってたらすみません...)なのでこの場合、入力が1の定数なので、0~1の数値が出力されます
Randomノードが二つあるのは、ノード毎に出力される乱数が変わるのでRandomノードが一つになると、XとYが同じ数値になってしまいます。
これにより、斜めの線のような形になります。
最後に、パターンオフセットは、XとY軸の情報、つまり二つの数値なのでVectorFloat2でXとYにそれぞれ数値を入れて、出力ノードに設定します。
パターンサイズ
パターンオフセットと殆ど一緒です、Randomに接続しているのが0.1なので、0~0.1のランダムな数値を、XとYに出力しています。
パターンを回転
角度は、1つの数字なので、VectorFloat2は必要ありません。
後は、反復ノードの反復回数を増やせば、ここの数値の数だけ大きさと、位置と角度がランダムに複製する事が出来たかと思います。
システム変数とかを使った作り方などは、色々良さそうなのが見つかったら記事書きたいと思います。