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に向かっていく部分で

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

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

 

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

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



 

 

 

 

 

 

【GameSynth】Modularモデルでカーブを使って制御する

f:id:tktknkyo:20190905171903p:plain



Verは2019.2です

少し前に2019.2の更新が来ました。

とはいえ、今回は新しく増えた機能使ったりはしておりません...

 

Modularモデルにて、カーブのデータを使って音の制御をしていこう、という内容になります。

 

f:id:tktknkyo:20190905162447p:plain

 

Control Signalsに入ってる青いノードなどが、一つの例だと思います。

 

f:id:tktknkyo:20190905162711p:plain

 

今回は、このEnvelopeを使っていきます。

制御としては比較的にやりやすいのかな?というのが理由です。

 

f:id:tktknkyo:20190905162726p:plain

このノード、初期状態で開いてみると、このようになっています。

 

Loopingはそのまま、カーブをループ処理するか

Variationはランダム性

Durationは時間(単位はおそらく秒?)

 

Envelopeの入出力ピン

 

このノードの入力ピンは

Trigger

ここに接続していると、いつ発生するのかを制御します。

f:id:tktknkyo:20190905163215p:plain

例えばLogicの中のClockというノードと、こう繋いだ場合

Clockは出力にTriggerを持っており、これが発生する事に

Envelopeが再生されます。

 

 

f:id:tktknkyo:20190905163339p:plain

出力に赤ピンがありますが、これはTriggerではなく

Stoppedです。

これは再生時にトリガーとして発生します。

 

f:id:tktknkyo:20190905163459p:plain

このようにした場合

上の再生が終わる時に、Stoppedからトリガーとして発生し

それを受け取り、下が再生されます

つまり上の再生が終わると下が再生されます。

同じピンでも、名前によって内容変わってくるので、この辺は注意です。

 

最後の左下はOutputです。

単純に出力ですね。

 

実際にカーブを適応してみる

 

ではここから実際にカーブを使っての制御をしていきます。

ただ、これはあくまでカーブのデータとして見ます。

細かく言うと、音声そのもののデータとしては見ないものとします。

 

なので、まずは音をループで流しておきましょう

f:id:tktknkyo:20190905170030p:plain

折角なので2019.2で実装されたFireを今回使います。

(ここは基本的に音が鳴るものなら大体何でも問題ないです)

 

 

まずは、音量を調整する為にGainというノードを出します。

f:id:tktknkyo:20190905170144p:plain

 

f:id:tktknkyo:20190905170229p:plain

この赤色のノードになります。

このノードは音量を調整できるノードです。

 

f:id:tktknkyo:20190905170358p:plain

このように、FireとMonoの間に入れる事で

音量を調整できます。

 

f:id:tktknkyo:20190905170428p:plain

このノードのパラメータは一つのみで非常にシンプルです。

ここの数値によって、音量の上げ下げのできる、シンプルなノードになります。

単体としての機能はこのようになります。

 

 

f:id:tktknkyo:20190905170229p:plain

そしてこのノードには左側に青色のピンがあります。

この意味合いとしては、音量の調整ができる、という内容です。

つまり、ここに接続した情報を使って音量を調整する事が可能です。

 

f:id:tktknkyo:20190905170748p:plain

 

ここで、Envelopeで設定したカーブで調整できる、という事になります。

Loopingにチェックを入れると、1秒感覚で、音量がループするように大きくなったり小さくなったりします。

 

このカーブを設定する事で、同じ音量で流れていたものを、後半は音量小さくしてフェードアウトしたりする事ができるようになります。

 

また、青ピンでも種類がものによって変わります。

 

f:id:tktknkyo:20190905171408p:plain

例えば、Pitch Shifterというノードでは

青ピンはありますが、接続名の名前が変わります。

なので、当然同じカーブを使っても、出力される内容も変わってきます。

 

なので、ピンの色だけでなく、ピンの接続名の方も見ながら、使っていくのが大切なのかな、と思います。

 

 

f:id:tktknkyo:20190905172026p:plain

今回ベースの音として使ったこのFireノード

上には1つの赤ピンと

5つもの青ピンがあります。

 

基本的にベースの音源になったりもする緑のノードは

このように、上に複数の青ピンが付いていることが多いです。

 

f:id:tktknkyo:20190905172449p:plain

ただ、Fireの場合、上の青ピンにある接続と、同じパラメータがノードそのものの設定でも存在します。

なので、ノードのパラメータを弄って、どんな感じに変化するのかを確認しながら

必要に応じてカーブのデータを接続するのが良いかと思われます。

 

 

効果音製作自体はまだまだ慣れないので、作例みたいなのを書けるのはまだまだ先になると思いますが。

作ったエフェクトに合った効果音を作れるようになりたいところですね。

【Niagara】発生位置をクォタニオンで制御する

f:id:tktknkyo:20190723191207p:plain

 

tktknkyo.hatenadiary.jp

 

この記事の続きというか、派生のような内容になります。

 

こちらでは、クォタニオンで変更する角度をつかって、位置を制御しよう、という内容になります。

 

こちらの方は、最初からモジュール作って処理作りました

f:id:tktknkyo:20190807214630p:plain

全体図としては、こうなっています。

 

f:id:tktknkyo:20190807214711p:plain

エミッター側から設定するためのパラメータは4つあります

BaseLocation

ベースとなる座標になります。

基本的にはParticle.Positionとなります

 

Angle

そのまんま角度ですね

 

R

これは半径となります

 

AddAngleByVector

角度を加算するベクトル、という意味で

具体的には、BP側で設定した、RotationをVectorとして、ここに適用します

 

f:id:tktknkyo:20190807220319p:plain

重要そうな部分だけを拡大するとこんな感じになります。

 

まず、Angle、つまり角度から方向を示す回転軸をつくります。

 

角度から、SinとCosを取ってきて、そこからVectorを作ります。

これの時点で、Z軸が0で正規化されているVectorにする事ができます。

 

次に、BPから持ってきた角度の情報をクォタニオンに変換します。

AddAnglebyVectorを一回BreakVectorで分解します

その後、Euler to Quaternionでクォタニオンに変換します。

 

その後、Multply Vector with Quaternionを使い、Vecorをクォタニオンで回転させます。

 

これにより、元々あった方向のVectorがクォタニオンで回転したので

そこに半径であるRを乗算します。

 

最後に、元の座標であるBaseLocationと加算して完成です。

 

 

最終的に何をしたのかっていうと。

Floatの角度からVectorを作ります。

そのVectorにBPから取ってきた角度ベクトルで回します。

最後に半径を掛けます。

 

内容としてはこの三つになります。

 

 

f:id:tktknkyo:20190807222209p:plain

モジュールの名前は変わってはいますが

これが先ほどの手順で作ったモジュールになります。

 

半径を200、角度を0~360のランダム

そしてBPから取ってきたUser.Rotationの角度を代入すると

 

f:id:tktknkyo:20190807222433p:plain

f:id:tktknkyo:20190807222519p:plain

 

このように、斬撃のメッシュと角度が同じになるように作ることができます。

(この白い粒子がそうです)

 

また、BPからとってくるので、同じ数値を使えば、連動させるような挙動にすることも可能です。

 

次に発生する角度の制御をしていきます。

とはいえ、設定そのものは時間を取ってこればいいだけなので、非常に簡単です。

 

f:id:tktknkyo:20190807224250p:plain

Angleの部分に、Emitter.Ageなどの、エフェクトそのものが発生してからの、時間を取得してくるデータを入れてしまえばうまくいきます。

 

 

前の記事の続きということで、今回は短いですがここまでになります。

最近は更新頻度下がってきているので、何かしら更新続けていきたい所です。

【Niagara】メッシュの角度をクォタニオンで制御する

f:id:tktknkyo:20190723191853p:plain



VerはUE4.22.3です。

 

今回は、Niagaraでクォタニオンを使ってちょっとした制御の方法を。

サムネイルが一つの例です。

モーションと合わせる部分は、割とゴリ押しなので、そこはご了承ください。

 

f:id:tktknkyo:20190723191540p:plain

 

こちらが、Niagara上で表示されているこのエフェクトです。

エフェクト単体としては、水平に斬ってるだけの角度となっています。

 

今回のこの斬撃のエフェクトは、モーションに合わせて角度を変更したい。というのがありまして。

なので、固定の角度だけでなく、角度を変更しやすい作りにする必要がありました。

また、管理面も考えて、一つのエフェクトに対して、BPに制御する事でモーションにあった角度で発生させる

というのを目指しました。

 

f:id:tktknkyo:20190723192204p:plain

タイミングの関係で判りにくいですが、水平に斬るモーションに合わせて、水平に角度を調整しています。

 

f:id:tktknkyo:20190723192549p:plain

ちょっとした応用として、このように、前方にそのまま飛ばしたりする処理も作ることができます。

飛ばしてるエフェクトは、別途新しく作る必要はあります。

 

【そもそもクォタニオンについて】

 

まずクォタニオンについてですが、原理としては4元数とか、3つの虚数が、とかはありますが、ちょっと使う程度なら、原理的な所まではそこまで知る必要はないと思います。

UE4などでクォタニオンを使う場合で知っておいたほうがいい事としては。

4つの数値を持つ型である、という事

4つの数値のうち、3つは回転軸を指定し、もう一つで角度を指定している、という事。

 

原理から知ろうとするとややこしいですが、使うだけなら結構簡単です。

 

 

【Meshをクォタニオンで回転させる】

今回は、この斬撃のをメインに例を出していきます。

なので、まずはNiagara上で、水平に回転するという挙動を作っていきます。

 

f:id:tktknkyo:20190723195335p:plain

まずは、このようなメッシュがあったとします。(メッシュは使いたい物で大丈夫です)

 

f:id:tktknkyo:20190723195548p:plain

メッシュを回転させる為のモジュールは最初から入っています。

このMesh Rotation Rateなどがその一つですね。

 

これを、Particle Updateに入れて、Yawに-360と入れてみると、水平方向に回転するようになります。

 

Rotation Rate というパラメータがありますが、これは回転の速度を制御します。

数値を大きくするほど、高速で回転するようになります。

f:id:tktknkyo:20190723200027p:plain

ここに、カーブを入れる事で、回転をだんだん遅くしたり、早くしたりする事も可能です。

 

このモジュール自体がクォタニオンで回転させています。

中身としてはこのようになっています。

f:id:tktknkyo:20190723200240p:plain

デフォルトのモジュールはこれに限らず、結構複雑な事も多いです。

 

f:id:tktknkyo:20190723200428p:plain

特に重要になりそうなのは、この辺でしょうか

内容としては、Yow、Pitch、Rollで指定した角度を元にクォタニオンを作っています。

Euler to Quaternuonという関数が一番重要となります。

 

f:id:tktknkyo:20190723200938p:plain

また、設定したクォタニオンは、Particle.MeshOrientation

に設定する事で、角度が決まります。

このパラメータは、クォタニオンの型なので、クォタニオンで計算したら、そのまま適用出来る、というワケです。

 

特にモジュール自体を使わなくても、この型のパラメータにすれば、角度の制御ができます。

 

f:id:tktknkyo:20190723201250p:plain

Updateに、この型のパラメータを追加します

 

f:id:tktknkyo:20190723201333p:plain

モジュールだけでなく、Dynamic Inputにも、クォタニオン専用のデータがデフォルトであります。

こちらは、回転軸と回転角度から指定すもので、こちらの方がイメージしやすいかもしれません。個人的にはこちらのほうが解りやすいとは思います。

 

ただ、回転角度に固定値を入れても、そのままでは回ってはくれません。

 

f:id:tktknkyo:20190723201657p:plain

このように、カーブを入れる事で回転をしてくれるようになります。

 

 

【クォタニオンでの回転の制御】

ここまでは、単純にクォタニオンで回転させてただけなので

ここから制御出来るようにしていきたいと思います。

 

今回としては、モーションなどと合わせて回転させるのを目標とします。

 

結論から言ってしまうと、回転軸をモーションに合わせて差し替えるだけですが。

 

モーションから角度をとってくる部分は、ちょっとゴリ押しになります、そこはご了承ください。

 

f:id:tktknkyo:20190723202733p:plain

発生位置を、キャラに持ってきて、再生すると、このように真横に振ります。

 

f:id:tktknkyo:20190723202917p:plain

角度を制御する下準備として、Spawn System at Locationの後ろに、Set Niagara Variable(Vector 3)

を繋ぎます。

ただ、これ単体では動きません。

f:id:tktknkyo:20190723203109p:plain

Niagaraの、パラメータの部分で、このようにパラメータを追加します。

User. までは固定なので注意してください、頭のみ大文字にしないと上手く反応してくれないようです。

 

今回は、User.Rotationというパラメータを追加して、ここに角度を入れていきます。

 

このパラメータを使っている部分に、BPで指定した数値が入ってくる、という事になります。

 

tktknkyo.hatenadiary.jp

 

ここの制御法は、以前の記事で書いています、そちらも参照してください。

 

ここから、このRotationのVector型のパラメータを使って、角度を制御していく必要があります。

 

クォタニオンに変換する必要があります。

今回は新規でモジュールを作成しました。

f:id:tktknkyo:20190723203656p:plain

内容としてはVectorをクォタニオンに変換しています。

Particles.InitialRotation というパラメータもありますが。

 

これはMesh Rotation Rateのモジュール内を見ると解りますが

 

f:id:tktknkyo:20190723204608p:plain

クォタニオンの角度の合成をする際に使用されています。

なので、ここで入れておくことで、綺麗に角度の合成をしてくれるようになります。

 

f:id:tktknkyo:20190723203920p:plain

モジュールが完成したら、Particle Spawnに追加します

中身は、BPから取得してきたUser.Rotationを入れます。

 

f:id:tktknkyo:20190723204813p:plain

 

今度は、角度を合成する必要があるので、Mesh Rotation Rateの方で回転させるようにしましょう。

 

f:id:tktknkyo:20190723205615p:plain

XYZをそれぞれ30に設定すると

 

f:id:tktknkyo:20190723205556p:plain

 

このように角度が更新されました。 

 

f:id:tktknkyo:20190723205707p:plain

 

ただし、XYZを固定値で入れて編集しているだけなので、キャラの向きを考慮してくれません。

 

f:id:tktknkyo:20190723205922p:plain

キャラクターが、地面に立っている状態、つまり2次元での角度のみで良いのであれば。

自分はこのように設定して制御しています。

 

まず攻撃を出すアクターの角度を取得し、そこからZ軸だけを変数に格納します。

これにより、キャラの向きの動きを取得してこれるので

そこに固定値を足して、常に出したい向きにエフェクトが出るように調整します。

 

 

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

次は、クォタニオンを使って、発生位置の制御をやっていきたいと思います。

 

 

【GameSynth】Whooshモデルで少し効果音に触れてみる

f:id:tktknkyo:20190604200021p:plain

今回は久々になりますがGameSynthの内容を

 

今回はWhooshモデルという、風系の音を作るモデルでちょっとした作り方を

というワケで簡単にいくつかの機能に触れてみようかと思います。

機能の一部のみ触れる形になります、ご了承ください。

 

デフォルトの時点でから、ある程度線をサムネのように引っ張ってあげるだけでも

ある程度それらしい効果音が作ったりはできます。

 

f:id:tktknkyo:20190604200530p:plain

画面の左下にある、ここのアイコン

これは、引いた線をランダムに配置しなおすような機能です

ランダムに配置しなおすといっても、引いた線の数などは色々引き継がれます。

 

f:id:tktknkyo:20190604200636p:plain

例えば、このような太さがある程度違い、比較的に長めの線が複数ある

という場合にこの機能で配置をしなおすと

 

f:id:tktknkyo:20190604200741p:plain

この様になりました。

向きなどはかなり変わっていますが、線の長さや本数などは、比較的維持されています。

 

なので、ある程度本数を引いたら、この機能を配置を変えて音を調整して、ある程度いい感じになったら、それをベースに使う...

といった事が比較的にやりやすいです。

 

線を引いて音を作れるといっても、どうやって引けばいいのか?となった場合に

この機能を使っていけば、比較的につくりやすいと思います。

 

また、これで配置を変えたあとに、更に追加で線を加えたりもできるので

最初のベースはランダムで配置し、その後自分で新しく線を引いたりする、というのも便利です。

 

 

f:id:tktknkyo:20190604201240p:plain

画面の左上にあるこのグラフは、時間と音量を設定しています。

デフォルトがこの状態で

右側に並んだアイコンから、ここを自動で変えることができます。

自分自身で微調整も可能です。

 

右側に6種類アイコンが並んでいますが。

使い勝手がいいのが、特に下の二つになります。

 

f:id:tktknkyo:20190604201648p:plain

このグラフの上部にあるここが、効果音全体の長さになります。

作るものによって、長さもだいぶ変わりやすいので

再生しながら、ちょうどいい長さにここで調整しましょう。

 

f:id:tktknkyo:20190604201908p:plain

画面右上にはパラメータが並んでいます。

LFO という項目の中には、4つ並んでいます。

 

LFO Rate

こちらは、音に加えるノイズの間隔です

右側になるほど、ノイズの間隔が狭くなります。

 

LFO Amount

こちらは、音に加えるノイズの強さになります。

強くすると、荒ぶるような音になります。

強くすると、かなり濁った感じで目立ちやすくなります。

 

LFO Delay

こちらは、音に加えるノイズの発生遅延になります。

最初は綺麗だけど、あとから荒ぶるようにしたい、という場合などに

 

LFO Attack

こちらは、上げると恐らくですが、ノイズが滑らかになる、という感じでしょうか

RateやAmountが高くても、こちらも高くすれば
ノイズでの荒ぶり感は比較的に小さくなります。

ただ、こちらは微調整というイメージになると思います。

 

 

最初に重要になってきそうなのは、恐らくこの辺の機能だと思います。

まだまだ機能が多くて自分自身理解できていないところも多いですが

定期的に記事に書いていけたらな、と思います。

 

 

【UE4】ノイズ+スクロールによるフェードアウト

 

f:id:tktknkyo:20190528161312p:plain

Verは

UE4.21.2

となります。

 

今回作ったものは、このような動きを作るためのものとなります。

 

 

調整していくと、このようにグラデーションでのフェードアウトに対して

ノイズを混ぜたような描画を作ることが可能となります。

 

 

 

f:id:tktknkyo:20190528164936p:plain

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

 

 

構造の解説

 

f:id:tktknkyo:20190528165521p:plain

 

まずは左側のこの部分から

ここは、フェードアウトに使うノイズの調整となります。

 

今回は、ベースと歪み用は、同じテクスチャを使用しています。

上部の方は、タイリング数をXとYでそれぞれ調整する為の場所となります。

 

TexCoordに、定数を乗算すればその分がタイリングされるので
XとYをそれぞれパラメータ化して、インスタンス側でもいじれるように設定し。
それをタイリング数となるようにしているので

インスタンス側から、自由にタイリング数を変更させる事ができます。

 

下側は、テクスチャに追加するノイズとなります。

歪みには、XとYがRとGのみ必要になるので、この二つのチャンネルを取り出します。

ノイズはそのまま歪みに適用すると、大きすぎる事が多いので

低めの定数を乗算して、ノイズの強度を調整しておくと綺麗になりやすいです。

 

今回は、インスタンス側でも調整できるように、パラメータ化してあります。

 

 

こうして出来上がった、タイリングと歪みの処理を加算してから

テクスチャのUVsに接続します。

 

 

f:id:tktknkyo:20190528170249p:plain

 

次にこの部分となります。

ここは、グラデーションとノイズを混ぜ合わせる役割となっております。

 

テクスチャからSqrtに接続しています、これは必須ではありません

使用するテクスチャに大きく影響しますが、フェードアウトの調整として、入れたほうが自然になりやすいかなと思います。

 

TexCordからGチャンネルを抜き出しているのは、単純にグラデーションを持ってくる為です。

当然ですが、ここを自身で容易したテクスチャを使っても構いません。

 

その後は、ノイズとグラデーションを乗算します。

その後に再度Sqrtに接続します。

 

2回Sqrtを使っていますが、このノードは平方根を出してくれます。

最後に平方根を入れているのは

グラデーションとノイズを乗算すると、かなり色が黒くなってしまうので、そこからの調整をする為となります。

f:id:tktknkyo:20190528171406p:plain

グラデーションとノイズを混ぜた結果がこのようになっています。

ノイズの模様も維持しつつ、グラデーションが掛かっているのが解ると思います。

 

f:id:tktknkyo:20190528171030p:plain

 

最後にこの部分となります

 

OPMとなるパラメータが、フェードアウトさせる場合の基準となる部分になります。

エフェクトで使う場合は、ここを動かすことになるので

DynamicParameterに置き換えてください

BPで制御する場合は、ScaleParameterで問題ありません。

 

OPMは基本的に0~1でフェードアウトの範囲を決定します。

そこに対して、先ほど作ったノイズとグラデーションを合成したものも、0~1の数値になっています。

また、グラデーションを混ぜているので、上は数値が低く、下が数値が高くなっています。

 

OPMのパラメータから減算する事により
1から0になるにつれて、全体の数値が少なくなります。

グラデーションが混ざっているので、下のほうから少しづつ0になる領域が増えていきます。

 

最後に、Clampを使い0~1からはみ出た部分を0~1に収めます。

 

エミッシブカラーは今回はあくまで機能説明なので、単色を使っています。

是非ParticleColorやノイズを混ぜたりしてみてください。

 

マテリアルとしては終わりですが、最後に一つやることがあります。

デフォルト設定の場合、オパシティマスクの数値は、1/3以下で消される設定になっています。

今回の、この設定の場合では、制御がどうしてもしにくいので

ここを変更しておきます。

 

f:id:tktknkyo:20190528172006p:plain

 

作成したマテリアルから、インスタンスを作り
下にある、ここのパラメータを変更してください。

0にしたいところですが、0にした場合、うまく描画されないようなので
小さめの数値を入れておきます。

 

あとは、インスタンスのOPMのパラメータをいじると、ノイズが混ざったようなフェードアウトになってくれていると思います。

ただし、今回比較的に使用するテクスチャに依存する部分がどうしても大きいので、そこはご了承ください...

 

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

 

今回文字ばっかりで、解りにくくてごめんなさい...

 

 

【UE4】【Houdini】VATをカスケードで制御する

今回使用するVerは

UE4・・・4.21.2

Houdini・・・17.5.229

 

今回は、HoudiniとUE4の連携的な内容をしていきたいと思います。

 

UE4にVATで持っていく手段は、色々な所に情報はありますが

私のような知識の乏しい人の場合

書いてある手段とちょっとでもずれると、途端に解らなくなってしまい...

 

という事があったので、記事に書いておこうと思います。

 

今回は基本的なRBDによるシミュレーション前提となります。

ほかのシミュレーションなどの場合は手段も恐らく変わってくると思います。

 

 

VATについて

まずはそもそもVATについて

Vertex Animation Textureの略称です

Vertexは頂点

Animationはアニメーション、ざっくり言うと動き

Textureはテクスチャ、ざっくり言うと画像

 

3Dモデルの動きデータを画像に入れ込んだもの、と考えればいいと思います。

 

VATを使うには

 

VATを作る機能は、Houdiniに最初から入っているわけではないので

データをDLする必要があります。

f:id:tktknkyo:20190502181233p:plain

シェルフの部分の、UpdateでDL出来るはずです。
ただ、具体的な手順が若干解っていない所もあります、ご了承下さい

また、自身はsteamのIndie版です

ここが違うと、DLの仕方も変わってくるかもしれません。

 

まずはシミュレーションを作ってみる

とりあえず、定番のシミュレーションを作ります。

 

f:id:tktknkyo:20190502181708p:plain

とりあえず、でBoxを作ります。

上空から落とすので、Centerをとりあえず2程度に設定しておきましょう。

 

 

f:id:tktknkyo:20190502181916p:plain

その後の設定はこのようにします。

ノードの設定そのものは初期設定で問題ありません。

最後はNUllノードを作り、解りやすくする為に、名前を「OUT」にしています。

 

 

f:id:tktknkyo:20190502182215p:plain

その後、OBJまで戻り

ここのシェルフにてシミュレーションを作ります。

 

f:id:tktknkyo:20190502182314p:plain

シミュレーションを作る際に

この様なメッセージが出てきます。

 

左側をクリックしておきましょう。

VATでもっていくには、シミュレーションをパック化しておく必要があります。

ほかのシェルフなどで作る場合、UE4にもって行ったときに変な動きになることがあります。

 

f:id:tktknkyo:20190502182452p:plain

OBJネットワーク上に、DOPのノードが作られるので、中に入ります。

 

今の段階で再生しても、ただ重力で落ちるだけとなっています。

 

f:id:tktknkyo:20190502182641p:plain

地面が作られていないので、地面を作ります。

 

これで、地面に落ちて割れるシミュレーションが作られました。

 

 

f:id:tktknkyo:20190502183021p:plain

次に、VATに変換してUE4に組み込みます。

 

VATの作成

 

f:id:tktknkyo:20190502183259p:plain

まずは、破壊したBOXを作ったノードに入ります

OUTの下が、シェルフでシミュレーションを作った時に自動で作られたノードです。

このままでは、若干解りにくいので

f:id:tktknkyo:20190502183408p:plain

最後にNULLノードを接続しておきます。

名前はOUT_Simとしました。

 

f:id:tktknkyo:20190502183536p:plain

 

OUTネットワークに移動し、VATを作るノードを作成します。

 

f:id:tktknkyo:20190502183726p:plain

 

今回はRBDのシミュレーションを作ったので
Rigid、を選択します。

 

f:id:tktknkyo:20190502183857p:plain

Export Nodeは、変換するノードを選択します。

シミュレーション自体はDOPで作っていますが。

DOPで作ったシミュレーションは、SOPで読み込んでいます

なので、SOPの方のパスを選択しておきます。

 

最後に作ったOUT_Simを設定しておきましょう。

 

f:id:tktknkyo:20190502184054p:plain

 

設定できたら、Renderのボタンで出力します。

プロジェクトのExportというフォルダに出力されたデータが出てくると思います。

 

UE4への組込み

 

f:id:tktknkyo:20190502184258p:plain

RBD用の場合は、メッシュと最後にPOSとあるテクスチャとROTとあるテクスチャが書き出されます。

ここは書き出す種類によって変わってきます。

まずは、この書き出した三つのデータをUE4にインポートします。

 

次にマテリアルが必要になるので、新規でマテリアルを作ります。

 

f:id:tktknkyo:20190502184644p:plain

 

HoudiniのVATを作ったノードにこの様な部分があります。

+のボタンを押すと開くので、この中身をコピー&ペーストでUE4に持っていきます。

コードをコピーしたら、UE4のマテリアル上で貼り付けをすると、ノードが作られます。

 

f:id:tktknkyo:20190502185049p:plain

詳細設定の、ここの矢印をクリックで展開して

 

f:id:tktknkyo:20190502185228p:plain

ここの設定を3にしておきます。

 

f:id:tktknkyo:20190502185324p:plainHoudiniから持ってきたノード群には

コメントで何処に接続すればいいのか?が書いてあるので

それに従い設定していきます。

 

マテリアルは完成ですが

VAtで動かすには、インスタンスを作っておきます。

作ったマテリアルからインスタンスを作成します。

 

f:id:tktknkyo:20190502185637p:plain

インスタンスのこの5つのパラメータは編集する必要があるので

チェックを入れて編集します。

 

ここに入れる数値は

f:id:tktknkyo:20190502185747p:plain

Houdini側の、この部分と同じ数値を入れる必要があります。

 

f:id:tktknkyo:20190502185918p:plain

 

インスタンスにある、ここの部分も編集する必要があります。

Houdiniで生成したテクスチャを、ここでそれぞれ設定していきます。

 

最後に、メッシュに、このインスタンスを設定すれば完成です。

 

カスケードにて調整する

 

では次に、カスケード側で調整できるようにしていきます。

 

まず、VATの動きが、どこで動いているのか、という部分ですが

f:id:tktknkyo:20190502190346p:plain

左の方にひっそりとTimeのノードがあり、ここで制御されています。

 

f:id:tktknkyo:20190502190510p:plain

なので、ここをDynamicParameterに差し替えればできます。

 

ただし、時間の制御は、フレーム数ではなく、秒数なので注意が必要です。

 

ここで一つ問題が出てきます。

恐らくこの時点でそのまま読み込むと、変な形になると思います。

 

f:id:tktknkyo:20190502192220p:plain

 

地面に落ちて割れるシミュレーションのはずが

カスケードで読み込むと、変な動きをするようになります。

 

原因は大きさで、InitialSizeを1に設定すると解決します。

 

ただ、大きさが完全固定では面倒なので、制御できるようにします。

 

おそらくですが、カスケード側で大きさを変えると、移動量の計算がおかしくなるようです。

 

f:id:tktknkyo:20190502192833p:plain

 

マテリアル側で、ここの大きさを制御してる部分に、DynamicParameterを乗算します。

こうする事で、カスケード側で大きさを変えれる...ようにはなりますが。

InitiarSizeの大きさと同じにする必要が出てくるようです。

 

ちゃんと乱数で制御したい場合は、どうしてもBPでの制御が必要になってきそうではあります。

 

今回はここまでになります、VATに関してはまだまだ解っていない部分が多いので、判明次第色々情報纏めていこうかと思います。