moyasiエフェクト館

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


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

【UE4】マテリアルでディゾルブエフェクト

f:id:tktknkyo:20180607204825p:plain

Verは4.18です

こういうオパシティマスクと、発光を組み合わせた様なものを、ディゾルブエフェクトというらしいです。

 

 

実際の動きはこんな感じになります。

また、カスケードなどで使いやすい様に、1~0の数値だけで調整できるようにしてます。

このエフェクトの作り方自体は載っていたのですが、数値の調整まではなかったので、その辺は自分で色々調べました。

 

全体の構図

f:id:tktknkyo:20180608052620p:plain

全体の構造はこの様になっています。

 

動きとしては、ノイズを元にオパシティマスクで消えていく部分と

消える前に、エミッシブカラーにより発光させています。

 

各パラメーターの動き

f:id:tktknkyo:20180608052937p:plain

ScalaParameterにしているのは、この3箇所です

 

1.全体の欠け具合を調整するパラメーター

名前はBaseParameter

こちらは主にParticleColorなどで1→0に動かすことを想定しています。

f:id:tktknkyo:20180608053655p:plainf:id:tktknkyo:20180608053715p:plain

左が0.6で、右が0.3です。

 

2.発光部分面積の大きさを調整するパラメーター

名前はEmissiveLine

こちらは、主にマテリアルインスタンスなどで、設定するのを想定しています。

f:id:tktknkyo:20180608053951p:plainf:id:tktknkyo:20180608054022p:plain

左が0.1で右が0.3です

この例では0.1と0.3ですが、実際に使う場合は0.1~0.2位が綺麗に見えやすくなるかと思います。

 

3.発光の掛かり具合を調整するパラメーター

名前はEmissiveLerp

こちらも、主にマテリアルインスタンスなどで、設定するのを想定しています。

f:id:tktknkyo:20180608054412p:plainf:id:tktknkyo:20180608054430p:plain

左が0で右が1です

変化が若干解りにくいパラメーターでもあるので、0か1のどちらかを推奨します。

体感的には、発光する面積を調整するパラメーターが小さい場合は高くしたほうが、大きい場合は小さくしたほうが綺麗に見えやすいと思います。

また、拡大すればするほど、数値は小さいほうが自然に見えやすくはなると思います、この辺は使う用途によって使い分けてください。

 

中身の解説

f:id:tktknkyo:20180608190822p:plain

まずはこの部分、この部分に、基準となる数値と、発光する幅を設定するパラメータが入れてあります。

3種のパラメータは解りやすいように省略します

・BaseParameter(以下BP)

・EmissiveLine(以下EL)

・EmissiveLerp(以下ELerp)

 

f:id:tktknkyo:20180608191110p:plain

赤枠にある、IFは、最初の発光部分のみなのか、オパシティマスクで消すのかどうかを判定しています。

Addの部分は、ELとBPを加算しています、その結果が1以上なのかどうかを判定。

1以上であれば、発光のみとなります(ELが0.2であれば、BPは0.8まではオパシティマスクで消さないことに)

 

1を切った場合に、IFの判定が代わり、ここからオパシティマスクで消していくことになります。

ただし、そのままでは0~1の数値で調整できないのでノードであれこれしてます。

f:id:tktknkyo:20180608192051p:plain

具体的にはこの部分です、ELを反転させたものを、BPから割り、その後Clampで0~1に

ELが0.2と仮定した場合、オパシティマスクでの消滅はBPが0.8→0で完全消滅させる必要があります(1~0.8は発光のみにする必要が)

反転で0.8にした数値を割ると0.8以上が1以上になります(超えた分はClampで消してます)

これにより、BPが0.8であれば1になり、0であれば0になります、同じ数値で除算すれば1になります。

これを、IFのA<Bに繋げることで、BP+ELが1を切るまでは、ELの発光のみを行い、1を切るとBPの数値により消滅していくようになります。

 

ELの数値によって、消え始めが遅くなる関係上、この数値が大きいほど、消える速度も速くなります、これは全ての数値を0~1で調整しやすくする為です。

 

今回、オパシティマスクが0で消滅させたほうがわかり易いので、オパシティマスクに繋ぐ直線に、0.3333をAddにより加算しています。

f:id:tktknkyo:20180608194004p:plain

 

発光部分

 

次はエミッシブで発光させる部分です。

f:id:tktknkyo:20180608194401p:plain

この部分のノードはこうなっています。

発光Lerp-AとBがありますが、これはELerpでの発光の2種類になります、切り替える必要が無ければいりませんが、どうせならと作ってみました。

 

f:id:tktknkyo:20180608200030p:plain

まずはLerp-Aの部分から

発光させる部分を0~1の数値で取得して、エミッシブカラーと乗算する事で、グラデーションの掛かった発光を作ります。

赤枠は、接続先が見えませんが、ELと繋がっています、ELは0.2として進めていきます。

基本左から右にどんどん繋いでいます

最初はELを反転します、これで0.8に

その次のAddは

f:id:tktknkyo:20180608200340p:plain

この部分の出力と繋がっています

 

 

その後のClampで0~1(1を超えた分を切り取り)の後に反転します

これで1以上になった部分は全て0になります

その後に、ELを割ったものをエミッシブカラーのベースと乗算して完成です。

 

内容がややこしそうだと思うので、中身を細かく...

最後の反転までは、エミッシブカラーで発光させる部分を取得する為の処理です、0は一切発光しないが、それ以上は発光させる。

発光させる部分というのは、オパシティマスクで消滅させる数値より、ELの数値(今回は0.2)高い以下という事です。具体的には0~0.2が該当します。

 

なので、ノイズと減算してる部分から、0~0.2の範囲を取得する必要があります、これ以上を切り取る必要があります。

 

この為に、反転したELを加算します、0以下は、オパシティマスクで消しているので、考慮する必要がありません、なので必然的に0.8を加算するので、0.8以上になります。

(0以上の数値に0.8を加算します)

ただ、0.8以上で上限があまりないので、Clampにより、0.8~1の間に抑えます

その後反転する事で0~0.2の数値を取ってくる事が出来ます、この数値だと少ないので、元のELで割る事で0~1になるので、これをエミッシブカラーと乗算します。

 

 

f:id:tktknkyo:20180608204642p:plain

つづいて、Lerp-Bの部分です。

赤枠は、エミッシブカラーで発光させる基本の色と接続しています

黄枠は、ELと接続しています

こちらは、グラデーションが殆ど無い版です。

 

真ん中にあるIFで、まず発光させる部分であるかどうかを判定します。

判定基準はノイズを引いた数値がELの数値以下であるかどうか、判定基準としてはLerp-Aとは変わりません、以上かどうかによって、定数の0or1を出力します。

 

f:id:tktknkyo:20180608210119p:plain

IFの後のこの三つのノード

発光させるだけであれば、IFとエミッシブカラーを乗算させるだけでもいいのですが、反転も組み合わせると、ちょっとだけグラデーションが出てきます。

この辺は好みでいいかと思います。

f:id:tktknkyo:20180608210721p:plainf:id:tktknkyo:20180608210758p:plain

ELが0.5でこの位の差になります、ほんのりグラデーションを与えます。

 

最後に、作ったLerp-Aと、BをLerpに繋げば完成です。

f:id:tktknkyo:20180608211144p:plain

 

今回は、エフェクトで使いやすいように0~1で調整できるように、を主体でしたが

0~1といえば当然テクスチャもそうなるので、ELやELerpな

どにも、ノイズテクスチャを適用してみれば、面白い模様にもなるのでは?と思っています。

 

f:id:tktknkyo:20180608212108p:plain

例えばこちら、ELerpに、 texturecoordinateのR情報を取ってきて適用したものです

中心付近でクッキリ変わっているのが解ると思います。

 

 

 

 

 

【SD】オーラっぽいテクスチャを作る

f:id:tktknkyo:20180603092738p:plain

Verは2018.1.1です

以前に作ったものなので、一部記事内でノード差し替えてます

SubstanceDesignerでオーラっぽいテクスチャを。

 

全体の構造

f:id:tktknkyo:20180603093819p:plain

大きく4つに分けます

1・全体の明暗を調整する部分

2・一番のベースとなる模様

3・タイリングの誤魔化しとして、ベースに混ぜる模様

4・1~3の要素の合成&最後の調整

 

1.全体の明暗を調整する部分

f:id:tktknkyo:20180603094328p:plain

 

ノイズのこのノードをベースにします

f:id:tktknkyo:20180603094442p:plain

このノードを二つ作り、数値を調整して違うパターンにします

これを、指方向ブラーで上下にブラーを掛けます、角度の回転を0.25にすると、上下のブラーに変化します。

 

その後、トランスフォームのこのノードで角度を変更します。

f:id:tktknkyo:20180603094723p:plain

 

最後に、ブレンドノードで、乗算で接続します。

f:id:tktknkyo:20180603094851p:plain

所々黒っぽい部分を作りたいので、片方は全体が白っぽく、もう片方はちょっと明暗を強くすると、綺麗になりやすいです。

ベースのノイズのコントラストや、座標を調整していきます。

 

2.ベースとなる模様

f:id:tktknkyo:20180603095509p:plain

一番の下地となる模様です。

 

f:id:tktknkyo:20180603101411p:plain

 

Perin Noise1がVerで無くなったようなので、差し替えてます。

ノイズのこちらを

パターン違いで同じノードを二つ使います

f:id:tktknkyo:20180603101517p:plain

比較的大きくした後に、レベル補正で明暗をある程度はっきりするように調整します。

f:id:tktknkyo:20180603101623p:plain

大体こんな感じでしょうか。

 

レベル補正したものを、両方ブレンドノードに繋ぎ、合成方法は最小(暗)で。

 

f:id:tktknkyo:20180603101806p:plain

この時点で、一番左のようなのになると思うので、再びブレンドノードで

今度はOverlayで合成します、これでコントラストがハッキリします。

 

その後はトランスフォーム2Dで、高さを20%にする事で、細長くしてタイリング処理を行います。

 

f:id:tktknkyo:20180603102020p:plain

最後の微調整の部分

 

使うノードはパターンのこちら

f:id:tktknkyo:20180603102548p:plain

Rotationで横から縦にして、タイリング処理を切った後、Tilingのパラメータで細くしていきます。

その後、トランスフォーム2Dで左右に分かれるように位置を調整した後にブレンドノードで減算して、左右を暗くします。

不透明度は少し低めに(今回は0.25にしています)

 

3.ベースに混ぜるノイズ

f:id:tktknkyo:20180603131100p:plain

 

ベースになるのはこのノイズです

f:id:tktknkyo:20180603131516p:plain

f:id:tktknkyo:20180603131601p:plain

綺麗に見せるコツとしては、赤枠の部分の様な大きめの黒い部分を極力なくす事です。

 

続いて、調整のこのノードで、白黒を反転させます

f:id:tktknkyo:20180603132205p:plain

 

その後は、このノードを二つブレンドノードで、加算させて白を強くします

最後にトランスフォーム2Dの、高さを25%にしてタイリングさせます。

 

4.合成&調整

 

f:id:tktknkyo:20180603133203p:plain

この部分は、1,2,3で作った部分です、それらの合成です

下側のブレンドは最大(明)

右側のブレンドはSoftLightです。

 

f:id:tktknkyo:20180603133411p:plain

この状態だと、タイリングがやや目立ってしまってもいるので、ちょっと誤魔化します。

 

トランスフォームのこのノードを

f:id:tktknkyo:20180603133512p:plain

斜めにズラすようなノードで、これによってタイリング部分を多少誤魔化します。

 

その後、指方向ブラーで左右にブラーを掛けます(この部分は、個人によって好みが別れそうです)

 

最後にトランスフォーム2Dで回転させて完成です。

 

なお、最後に極座標変換するトランスフォームのこのノードを使えば

f:id:tktknkyo:20180603133859p:plain

 

f:id:tktknkyo:20180603133936p:plain

この様な見た目に、

 

 

f:id:tktknkyo:20180603133959p:plain

 

その後、パターンのこのノードなどで円を作り 

f:id:tktknkyo:20180603134028p:plain

 ブレンドノードで乗算すればこの様にもできます。

 

単純な板ポリに貼る場合には、中々使い勝手があると思います。

 

 

 このエフェクトのメインの部分に使ってます

 

極座標掛けずに、モデルに貼る使い方だとこちら

 中心の柱部分の模様みたいな部分に使っています。

【Houdini】行列を使って外側に向ける

f:id:tktknkyo:20180601082603p:plain

Houdiniでのモデリング関連の記事です。

Houdiniでメッシュ作るときに便利そうなものを、メモ代わりにも書いていこうかなと。

というわけで今回は、行列とか使って外側に向きを向けようかなと。

 

下準備とか色々

f:id:tktknkyo:20180601083207p:plain

ノードツリーとしてはこんな感じ、Tubeでベースを作って、CopyToPointで複製します。

 

f:id:tktknkyo:20180601083303p:plain

Fuseは、ポイントが重なってる部分を結合しています。

ポリゴン数を無駄に増やさない為にはあったほうがいいですが、処理自体はなくても特に問題はありません、ただ若干乱数入れる場合はあったほうがいいかもしれません。

 

また、形を作る関係上、頂点の部分をグループに入れておきます。

f:id:tktknkyo:20180601152259p:plain

if(@P.y != 0){@group_ypos = 1;}

コードとしてはこちら、内容としては

ポイントのY軸が、0でないなら、yposというグループに入れる、という処理です。

 

行列を使った動き

 

f:id:tktknkyo:20180601153153p:plain

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で取得した角度にて、クォタニオンを作ります。

f:id:tktknkyo:20180601153807p:plain

Y軸が赤線部分で、Y軸に回転させるばあい緑の矢印の回転をするようになります。

角度は、atan2により中心からの開き角度をとってきます、2チャンネルの情報で、XとZ軸のみとってきています(Y軸は無視してます)

f:id:tktknkyo:20180601154044p:plain

このように並んでいるジオメトリの、頂点の部分が、中心から見て何度の位置にあるのかを取得します(距離は関係ないです)

 

vector pivot = @P; //行列回転のために、位置を変数に保存

@P -= pivot; // 行列回転の為に、一旦原点に移動

行列の回転させる場合、Pの位置情報を元に回転させます。

なので、例えばXが10の位置であれば、自転ではなく公転の様な動きになってしまいます、今回だとこれでは都合が悪いので、一旦変数pivotに保存してから、原点に移動させます。

 

matrix m = ident();// 単位行列を生成

ここで単位行列を作ります、行列関係では基本的に必要になってくるものです。

それをmという名前の変数に保存します。

 

vector dir = set(0,0,ch("R")); // 開き角度をシリンダーから取得

ここでは、どの位移動するのか?を定義します、今回はZ軸のみで、移動量は後から変更しやすくしたいので、シリンダーから取得します。

f:id:tktknkyo:20180601154631p:plain

入れる数値は定数でも問題ありません。

 

translate(m,dir); //開き角度から移動行列を生成

先ほどの、シリンダーから取得したZ軸の移動から、移動行列を作ります

作った単位行列と、先ほどの移動値の情報から、移動行列を生成します。

 

matrix m2 = qconvert(q); //クォタニオンを回転行列に変換

今度は、先ほど作ったクォタニオンから、回転行列をm2という変数名で作ります。

クォタニオンでつくる場合は、単位行列を事前に作る必要がありません。

 

@P *= m; // 移動行列を乗算
@P *= m2; //回転行列を乗算

先ほど作った、二つ(移動と回転)を乗算させて動かします。

行列同士の乗算では、後ろの方から計算されるのでこの場合

回転行列により回転させたあとに、移動行列で動かしています

移動はZ軸のみですが、その前に回転行列で角度を変えるので、変えた角度からZ軸動くことにより移動する方向が変わってきます。

 

外側に向くような方向に移動させている内容としては

回転行列を作るときにatan2にて、角度を取得していてその角度を使うのが理由です。

 

@P += pivot; // 位置を元に戻す

最後に、位置を元に戻します。

 

 

前のHoudiniの記事ではごっちゃになってしまったので

これからは少ない部分を細かく書いていけたらな、と思います。

【Houdini】氷柱用のモデルを作る

f:id:tktknkyo:20180527191009p:plain

Houdiniのモデリングの記事です。

 

UE4に入れてマテリアルを設定したら、こんな感じになります

結構綺麗かなと、この角度になっているのは、ライディングの影響が解りやすい角度を探した結果です。

f:id:tktknkyo:20180527191817j:plain

 

全体の構図

f:id:tktknkyo:20180527192420p:plain

 

大体の役割としてはコメント参照にて

流れとしては、6角錐を合わせたような図形を作ります。

f:id:tktknkyo:20180527192722p:plain

 

この時点でUV展開をして、まず細長くし、それを基本の形とします。

それを、複製して、角度を外向きに変更します。

f:id:tktknkyo:20180527193029p:plain

 

これと、中心のを合成させて、その後ポリゴンを、割ったり位置を変えたりで形を整えます、最後に仕上げて下を切り取ります。

f:id:tktknkyo:20180527193142p:plain

 

中心の基本となる部分

 

f:id:tktknkyo:20180527193533p:plainf:id:tktknkyo:20180527193611p:plain

 

この部分はすぐできそうな形ですが。

基本形状となる、六角錐を合わせたような形は、Sphereで作ります

Polygon Meshに変更して、あとはポイント数などを調整します。

f:id:tktknkyo:20180527194254p:plain

 

続いて、UVTextureでUV展開します、設定は初期設定です。

その次に、uvquickshadeを繋ぎます、これでUV座標が表示されると思います。

f:id:tktknkyo:20180527195025p:plain

 

次にPointWrangle

if(@P.y == 0){@P.y += ch("Height");}

コードはこちらを

f:id:tktknkyo:20180527195201p:plain

その後、赤枠の部分をクリックすると、赤線の部分が出てくるので自由に動かしてください、大体0.45位が良いかなと。

 

コードの内容としては、IF文でY軸が0のポイントを判定して

そのポイントのY軸を、このスライダーの数値分加算しています。

Y軸が0になるのは、周りの部分のみなので、この部分のみ座標を変化させます。

 

続いてTransformノード

f:id:tktknkyo:20180527195659p:plain

こちらは、外からパラメータを弄れるようにしてあります、線の色が同じ部分は同じパラメータです。

 

このパラメータの参照箇所としては色々ありますが、後から調整しやすくする為に、SubNetworkノードに纏めています。

f:id:tktknkyo:20180527200014p:plain

SubNetworkノードは、ノードの中にノードを入れることができ、このノードツリーも全てSubNetworkの中に入っています。

f:id:tktknkyo:20180527200206p:plain

ここから、パラメータを追加することができます、ドラッグ&ドロップで右側に移します。

f:id:tktknkyo:20180527200310p:plain

ここで、パラメータの下限と上限を設定できます、ただしこの上限などは、スライダーでどこまで変化できるかで、数値を直接入れる場合には特に影響ありません。

 

f:id:tktknkyo:20180527200438p:plain

今回のパラメータの全体図はこちらに、Floatと、Float2とInt型を使っています。

 

f:id:tktknkyo:20180527200532p:plain

パラメータの部分を右クリックから、コピーして

f:id:tktknkyo:20180527200612p:plain

貼り付けたいところでは、右クリックからこれで貼り付けます。

なお、この部分の数値は基本的に直接指定しても問題は特にないです、あとで作り変えたいときなどは、作っておくと便利になります。

 

途中でパラメータの説明入りましたが、ここで中心の元は完了

 

周りの氷柱

f:id:tktknkyo:20180527201122p:plain

f:id:tktknkyo:20180527201200p:plain

次はこの部分です

左上のTransFormと、PointWrangleから

f:id:tktknkyo:20180527201308p:plain

基本サイズを調整する用です。

f:id:tktknkyo:20180527201322p:plain

if(@P.y == 0){@P.y -= ch("Height");}

コードはこちら

中心の位置をずらす処理、中央のにもあるのと同じパターンです、ただこちらは逆さま向きです、理由は、コピーした時に、向きが変になった対処、理由はちょっと解ってないです。

 

右上側の、SphereとPointWrangle

f:id:tktknkyo:20180527203055p:plain

コピーするためのポイントの元になるジオメトリです

文字列の部分は、ポイント数です、ここを弄れるようにすれば、周りの氷柱の数を調整できるようになります。

 

f:id:tktknkyo:20180527203156p:plain

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

f:id:tktknkyo:20180527204457p:plain

この次に、行列などで回転させたりするので、このチェックでPack化します。

f:id:tktknkyo:20180527204606p:plain

 

@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を解除します

 

 

合成、仕上げ

f:id:tktknkyo:20180527205709p:plain

ノードは上からMerge、Subdivide、Pointwrangle、Subdivide、Clip

Mergeは、中心のと外側のを合成します。

 

Subdivide

f:id:tktknkyo:20180527210752p:plain

ポリゴンの分割数だけを増やします。

 

PointWrangle

f:id:tktknkyo:20180527211231p:plain

@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

f:id:tktknkyo:20180527211628p:plain

ここで更に分割します、Crease Weightのパラメータで、分割した部分を調整する事ができます、ここも外部から操作できるようにするのも良いかなとは。

 

最後にClipを繋げば完成です。

 

外部のパラメータ参照が多くて結構わけわからなくなってきそうなので、一応データ置いておきます。

www.dropbox.com

 

ちょっと雑な説明になってそうですが、次から記事書く事考えてファイルも作っていけたらなと思います。

 

 

 

 

 

【UE4】インプットデータ~Paticle Relative Time

f:id:tktknkyo:20180526142848p:plain

マテリアルのノードの一つである「Particle Relative TIme」

名前の時点で、大体想像つきそうな気がします

マテリアルでの詳細としては

f:id:tktknkyo:20180526143146p:plain

この様な事になります。寿命によって0→1に変化する数値ですね。

ただ説明なだけだと、公式を見れば済む、の一言で終わってしまうので、自分なりに考えたり、サンプルのアセット覗いて知った事などを、書いていこうと思います。

 

Lerpと繋ぐ

f:id:tktknkyo:20180526143517p:plain

とりあえず、で解りやすい内容だとLerpと繋ぐのが非常に解りやすいかと思います。

単純にAからBに変化します

 

Scala Parameterと併用すれば、何処から何処まで変化させるか、をマテリアルインスタンス側で制御できるようになります、当然BPで変化させるのも可。

f:id:tktknkyo:20180526143701p:plain

 

 

f:id:tktknkyo:20180526144723p:plain

Texture Sampleと合わせると、画像を変化させる結果に。

 

Paticle Relative Time自体は、基本的に0から1に変動させているだけなので、DynamicParameterで基本的に代用が出来ます。

Dyamic Parameterについてはこちらの記事で。

tktknkyo.hatenadiary.jp

tktknkyo.hatenadiary.jp

ただDyamicParameterが使えないGPUの場合を考慮すると。(DyamicParameterの数値を変化させる、Parameterモジュールが機能しない為)

 

f:id:tktknkyo:20180526145112p:plain

GPUタイプでしか作用しない、Particle Randon Valueとの併用。

Particle Randon Valueは、GPUタイプのみで機能する、発生ごとに0~1のランダムな数値を出力するノードです。

 

これとLerpを合わせると、AからBまでのランダムな数値を出力します、この例だと0.25~1.5の間でランダムに出力。

 

次のLerpにより、発生直後は0で0.25~1.5までの間に変化するようになります。

それでこの数値をどうするか?としては。

 

f:id:tktknkyo:20180526150252p:plain

例えばこんな感じに、この場合

左から0、0.25、1.5となります。

f:id:tktknkyo:20180526150941p:plainf:id:tktknkyo:20180526150918p:plainf:id:tktknkyo:20180526151000p:plain

実際に使う場合は、オパシティや、マスク用テクスチャなどで周りは切り取ると綺麗になります。

 

三角関数と合わせて

f:id:tktknkyo:20180526155641p:plain

三角関数であるサイン(sine)とあわせて使う方法

 

まずサインでどういう事が出来るか

とりあえずは角度を取って長さを返します

ノードに接続しているのは、Rotation型変数ではないですが(マテリアルエディタなのでこの型がそもそもない)

数値を角度と扱って習得します。

 

中心ズレてますが、円があって、緑がX、赤がY、中心の紫が原点があるとします。

f:id:tktknkyo:20180526160214p:plain

 

取得する角度というのは、中心から一本線があるとして、その開き角度です。

 

f:id:tktknkyo:20180526161019p:plain

この茶色が、入力する角度、そして左の黄色の線が、返す数値です。

線の長さは、黒丸の半径と同じです。

返す数値は割合で返します黒丸の半径と、黄線の長さの割合です、この場合大体50%位になると思います。

 

f:id:tktknkyo:20180526161254p:plain

また、このように180°を超えて下側に行くと、負の数値になります。

 

マテリアル側での数値的には、0だと0°で、1だと360°として扱います。

Paticle Relative Timeは、0から1に変化する値なので、丁度一周します、したがって0→1、1→0、0→-1、-1→0、の変化をします。

ただ負の数値になると少々面倒なので、半分の数値にしています。

これにより、0から1、1から0の変化するようになります。

 

f:id:tktknkyo:20180526161749p:plain

先ほどの、サインの処置が赤枠部分、続けて黄色の部分では

タイリング処理からRのみ取り出して、Addによる加算をすることで

横方向にスクロールさせています。

 

 

フェードインとアウトを作る

f:id:tktknkyo:20180526162032p:plain

実際の用途的に考えると、このように繋げば、フェードインとフェードアウトを作ることができます。

ただ、この状態では用途が限られるので色々弄っていきます。

 

f:id:tktknkyo:20180526162340p:plain

掛け算してから、Clampする方法。

この図では2倍しているので、0→2、2→0の変化ですが、Clampによって、1以上を強制1にします、従って1の期間が長くなります。

 

f:id:tktknkyo:20180526162734p:plain

具体的には、こんな感じの変化になります青枠は赤枠に比べて真っ白な部分が増えているのがわかると思います。

 

このままだと、フェードインとフェードアウトが一緒になってしまうので、IFで変える手段。

f:id:tktknkyo:20180526163923p:plain

Paticle Relative Timeと、0.5の定数で比較して、フェードインか、フェードアウトなのかを判定させ、それぞれ黄色枠と、青枠で、別々に設定することができます。

 

f:id:tktknkyo:20180526164203p:plain

今回の場合、こんな感じの変化となります、左右でグラデーションが変わっているのが解ると思います。

 

 

自分なりに色々用途考えた結果、この様になりました。

基本的にGPUタイプを使う場合のDynamicParameterの代わりとして使ったり、ピンが足りない場合などに使うかな?と思います。

後半の透明度に関しては、カスケード側でαのカーブを直接弄ったりするのが面倒なら、このカーブをインスタンスでも変えれるので使い道がありそうなのかな?と

 

三角関数と合わせると結構他にも用途はあると思います、良さそうな使い方があれば、教えていただけると大変助かります。

 

 

 

 

 

【Effekseer】2D風斬撃エフェクトを作ろう

f:id:tktknkyo:20180519135356p:plain

今回はちょっとした作例を、比較的にシンプルな斬撃エフェクトです。

f:id:tktknkyo:20180519135931g:plain

全体の動きとしてはこんな感じです。

 

f:id:tktknkyo:20180519140048p:plain

 

剣線メイン

最初の斜めのライン

剣線グロウ

最初の斜めのラインの、水色部分

衝撃纏め

衝撃部分を纏めるノード、発生タイミングなどの制御で、描画自体はしない

線 メイン

外に広がる細長いライン

線 グロウ

外に広がるラインの、水色部分

線 中心 メイン

中心にある、細長いライン

線 中心 グロウ

中心にある、細長いラインの、水色部分

歪み

加算合成での歪み

グロウ

うっすら背景にある、水色の部分

 

今回のテクスチャは、

f:id:tktknkyo:20180519140836p:plainf:id:tktknkyo:20180519140841p:plain

殆ど左側、歪みノードのみ、右側使ってます。

 

剣線メイン

f:id:tktknkyo:20180519151300p:plain

メインとなる斬撃部分。

f:id:tktknkyo:20180519145231g:plain

 

生存時間

30F

ここで生存フレーム数を調整します。

 

位置(イージング)

X7→X-5

高速2、低速3

今回は、X軸に動かして、剣線部分の動きを作ります。

 

生成方法(円、生成角度に影響にチェックを入れる)

開始角度60

生成位置種類、正順

ここで角度を調整します、開始角度が60、終了角度が360なので60~360の間になるのですが

生成位置種類を正順にすると、開始角度から順番に生成されます、発生数が1の場合、最初の開始角度からしか生成されません。

 

拡大(イージング)

X2,Y0.25→X3,Y0.1

高速2、低速3

段々と細長くなる動きにします。

 

描画

Z軸回転ビルボード

 

描画共通

ブレンド:加算

フェードイン:5

フェードアウト:10

加算合成にして、フェードイン、フェードアウトを設定

 

解りにくい場合は画像を参考にしてください。

f:id:tktknkyo:20180519142614p:plain

 

剣線グロウ

f:id:tktknkyo:20180519151328p:plain

f:id:tktknkyo:20180519145348g:plain

剣線メインと合わせて表示してます

共通

生存時間、30

メインと同じ生存時間にします

 

拡大

X2、Y1.25

剣線メインより、ある程度大きめにします

 

描画

配置方法:Z軸回転ビルボード

全体色

R0,G255,B255,A255

配置方法は、剣線メインと同じに、色は水色に設定します

 

描画共通

ブレンド:加算

フェードイン:5

フェードアウト:10

ここは剣線メインと同じに。

f:id:tktknkyo:20180519144921p:plain

 

衝撃纏め

衝撃部分の、発生タイミングの調整のみ

共通の、生成開始時間を8に

 

線 メイン

f:id:tktknkyo:20180519154002p:plain

f:id:tktknkyo:20180519154739g:plain

外側に広がるラインです。

 

共通

生成数: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

f:id:tktknkyo:20180519155055p:plain

 

線 グロウ

f:id:tktknkyo:20180519160434p:plain

f:id:tktknkyo:20180519160448g:plain

線メインと合わせて使うようのノードです。

 

共通

親削除時削除にチェック

生存時間:25

親である線 メインが消えた時に消えるように

 

拡大

X1.5

Y1.25

多少大きめに設定

 

描画

配置方法:Y軸固定

全体色

R0,G255,B255,A255

色を水色に

 

描画共通

ブレンド:加算

フェードイン:5

フェードアウト:10

f:id:tktknkyo:20180519160914p:plain

 

 

線 中心 メイン

f:id:tktknkyo:20180519161048p:plain

f:id:tktknkyo:20180519161059g:plain

中心に配置する衝撃部分

 

共通

生成数: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

加算合成にして、フェードイン、フェードアウト設定

f:id:tktknkyo:20180519161649p:plain

 

線 中心 グロウ

f:id:tktknkyo:20180519162037p:plain

f:id:tktknkyo:20180519162053g:plain

線 中心 メインのノードと合わせて使います

 

共通

親削除時削除にチェック

生存時間:25

線 中心 メインが消えたときに同時に消えるように

 

拡大

X:1.5

Y:1.25

線 中心 メインより大きめに

 

描画

配置方法:Y軸固定

全体色

R0,G255,B255.A255

色を水色に

 

描画共通

ブレンド:加算

フェードイン:5

フェードアウト:10

f:id:tktknkyo:20180519162454p:plain

 

歪み

f:id:tktknkyo:20180519162653p:plain

f:id:tktknkyo:20180519162729g:plain

※歪みは、単体では見えないので、このGIFでは歪みのチェックを外して表示しています

歪みってそもそも何?という方はこちらをどうぞ

tktknkyo.hatenadiary.jp

 

共通

生成数:3

生存時間:20~40

生成時間0.1

生成開始時間:-1

ランダム性を出すため、一度に複数発生させて、生存時間は長めで振幅も大きめに設定します

 

回転(角度・速度・加速度)

角度Z:0~360

Z軸の角度をランダムに

 

拡大(単一イージング)

5→12.5~17.5

高速2、低速3

ほかの要素を、全部覆うくらいの大きさになるように

 

描画

配置鳳凰:Z軸回転ビルボード

全体色:イージング

R255,G255,B255,A255→R255,G255,B255,A0

段々透明にしていく

 

描画共通

ブレンド:加算

フェードイン:10

フェードアウト:10

歪みにチェックを入れる

歪み強度:0.2

 

歪みがあると、この位見栄えが変わってきます、ただ結構調整面倒な部分もあります

f:id:tktknkyo:20180519164344p:plainf:id:tktknkyo:20180519164356p:plain

f:id:tktknkyo:20180519171108p:plain

 

グロウ

f:id:tktknkyo:20180519171155p:plain

f:id:tktknkyo:20180519171209g:plain

背面に付けるグロウ

 

共通

生存時間:30

生存時間はやや長めに

 

拡大(単一イージング)

5→10

高速2,低速3

全体的に大きめに

 

描画

全体色

R0,G255,B255,A128

水色で半透明に

 

描画共通

ブレンド:加算

フェードイン:10

フェードアウト:20

f:id:tktknkyo:20180519171803p:plain

 

これで完成です。

f:id:tktknkyo:20180519172029g:plain

 

また、色合いにランダム性もたせたりすると、結構綺麗な色にもなったりします

f:id:tktknkyo:20180519172322g:plain

 

具体的には

線 グロウ

線 中心 グロウ

この二つの色を

f:id:tktknkyo:20180519172446p:plain

このように設定して

 

グロウのノードはR0G64B255A128にします(Gを255から64に)

 

f:id:tktknkyo:20180519172647p:plain

連番画像に出力するとこんな感じです。

 

 

【UE4】カスケード、発生数やフレーム関係

f:id:tktknkyo:20180518055208p:plain

サムネイルはやや適当です、ご了承ください。

 

今回は、以前よく解ってなかった発生数などに関する内容を。

 

カスケードでの発生数に関する部分は、必須モジュールである「Spawn」モジュールからが主です。

 

Spawnモジュール

f:id:tktknkyo:20180518060036p:plain

持続的に発生させる場合は、基本的にこちらを使うことになると思います

赤線の二箇所はデフォルト設定の20と1

この状態だと、1秒間に(20*1)の数だけ発生(Spawn)します。

数値が二つありますが、この二つは乗算されます、なのでRateに基本となる発生数を入れておいて、RateScaleで、%として調整したりする事もできます。

この場合の利点として、パラメータを公開してBPで発生数を変動させる場合。

発生数そのものを入れる必要がなく、基準の発生数からの割合で大丈夫になります。

これにより、基準からの割合のみで設定できるので、BPで発生数を変えたい場合に、元の発生数を直接入れたりする必要が無いのが楽です。

 

【UE4】Particle Instance Parameter について(解説)

 

パラメータ公開から、BPでの編集手順は、この方が書いてくださってますので、参考にしてください。

 

 

次に、Burstを使う場合

f:id:tktknkyo:20180518061125p:plain

 

BurstListの横にある、+のマークをクリックすると、この様なのが出てきます

Count

基本となる発生数。

 

CountLow

発生数にランダム性を与える場合に使います。

デフォルトの-1は、無効化されている状態です、0以上の数値を入力すると

発生数がCountからCountLowの間からランダムになります。

 

Time

発生するタイミングを時間で設定します、0.5なら0.5秒後に

ただし注意が必要なのは、エミッターが残っている状態でないと、発生されません。

デフォルトの状態で、1以上に設定すると発生しなくなります、恐らく仕様です。

 

BurstScale

RateScaleと同じく、Burstの発生数を一律調整出来ます。

Rateと違い、発生タイミングをずらして多数配置した場合に、全て調整したい場合などにも使えます。

ただしその場合、BPで全体の調整はしにくくはなるので注意。

 

 

発生のタイミングなどの調整などは、Spawnではなく、必須モジュールである「Required」で調整します。

 

Requiredモジュール

エミッターの継続時間などを制御するDuration

f:id:tktknkyo:20180518063008p:plain

 

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

f:id:tktknkyo:20180518065100p:plain

ディレイ、いわゆる発生を遅らせたりする要素です。

 

Emitter Delay

指定した秒数だけ、エミッターの発生を遅らせることが出来ます。

基本的なディレイです、Emitter Loopsのループさせる場合、ループ毎に発生を遅らせます。

 

Emitter Delay Low

Emitter Duration Lowと殆ど似たようなもので、遅らせる時間に、ランダム性

持たせます、デフォルトでは無効になっています。

有効にしたい場合はその下にあるEmitter Delay Use Rangeにチェックを

 

Delay First Loop Only

チェックを入れるとEmitter Delayで設定した遅延を、ループさせている場合、最初の発生のみにします、多段攻撃などのエフェクトなどにあっていると思います。

 

 

今回はここまでで、この辺が把握できてくると、タイミングや発生数の制御は大体出来ると思うので、自由に作れるようになるのでは?と。