moyasiエフェクト館

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


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

【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に関してはまだまだ解っていない部分が多いので、判明次第色々情報纏めていこうかと思います。

 

 

【UE4】Materialで極座標の処理を自作してみる

f:id:tktknkyo:20190426104909p:plain

はじめに

今回の記事はかなり憶測部分が多いので、間違っている部分が有ると思いますのでご了承下さい

(コッソリ教えて頂けれると幸いです)

 

VerはUE4.21.2です

 

画像の加工などで便利な極座標の処理

便利なので、デフォルトの時点で関数で極座標の処理をするノードが用意されています。

f:id:tktknkyo:20190426105354p:plain

Vector To Radial Value というマテリアル関数です

基本はこれで問題無いのですが、スクロールなどの
ほかの移動などと合わせる際に、どうしてもややこしくなりやすい、うまく制御しにくい。

という部分が多少あったので
極座標の処理そのものから作れば制御しやすくなるのでは?

となったのが、今回処理を自作した理由となります。

 

 

そもそもマテリアルのUVs接続について

 

変形の処理を作る際に、このUVsの接続する情報をある程度把握する必要があるのかなと

 

 

f:id:tktknkyo:20190426110055p:plain

まずはタイリングさせたりする基本である

TextureCoordinateをそのまま接続
単体では全く変化がありません。

 

f:id:tktknkyo:20190426110236p:plain

加算すると、座標が動きます、スクロールの処理を入れたりするときに

使ったりする手段でもあります。

 

f:id:tktknkyo:20190426110412p:plain

乗算すると、タイリングされます。

インスタンスでタイリング数を制御したい場合などに使う手段でもあります。

 

f:id:tktknkyo:20190426110907p:plain

加算でノイズテクスチャを混ぜることで

マテリアルそのものの歪み処理なんかも。

ただ、ちゃんと制御するには、ある程度仕組み解ってないと厳しい部分はあるのでは?と。

 

処理内容としては、恐らくですが、UVsに接続されたRとGチャンネルをそれぞれXとYに置き換え

どこの位置にある数値を取得してくるのか?を定義しているのかなと思います。

 

f:id:tktknkyo:20190426112058p:plain

例えば、RとGが0.5の場合は、ちょうど中心を指定します
そして、このように定数を繋げる場合
Texの情報のXとYが0.5の位置にある数値を、TextureSampleに適用する事になります。

定数を接続する場合、色の情報を、一箇所からとってきて、それを全ての場所に適用する事になります。

 

 

極座標を掛ける処理を考える

 

f:id:tktknkyo:20190426115529p:plain

こちらはHoudiniで作ったものですが
極座標で、いわゆるこの様な処理を作ります。

 

X軸を半径

Y軸を角度

にするようにUE4のマテリアルで処理を作ります。

 

半径の処理を作る 

まずは半径から

 

UVsの接続に使われる情報は、接続している情報の座標をもってきます
なので、Xを半径にしたい場合

 

f:id:tktknkyo:20190426120253p:plain

この右側のグラデーションの数値が、そのまま半径にします。

つまり左側が中心に、右側が外側になるようにします。

左側の数値の低い部分を中心に
右側の数値の高い部分を外側に持ってくるので

円を描くようにすれば大丈夫です。

 

f:id:tktknkyo:20190426120814p:plain

0~1の数値になっていますが、黒い部分を中心に持ってきたいので
0.5を減算する事により、-0.5~0.5になり、中心に0が来るようになります。

 

次に、円を作る手段としては、三平方の定理を利用し、中心からの距離を取得します。

但し、三平方の定理には、XとYが両方必要になってくるのでGチャンネルも必要となります。

 

f:id:tktknkyo:20190426121019p:plain

三平方の定理は、高さと幅を2条し、その平方根が距離となるので

XとYを2条し、それぞれを加算のあと、平方根を出します
そうすると、中心からの距離を取得が可能となります。

この数値はそのまま半径として使用できます。

 

角度の処理を作る

次に角度を生成します。

Y軸が角度になるように処理を作りましょう

先ほどの半径は、中心からの半径を出しました

同じように、こちらは中心からの角度を出しましょう。

 

この時にピッタリなArctangent2というノードがあります。

Atan2と検索すれば出てきます。

 

f:id:tktknkyo:20190426125137p:plain

 

Atan2には、XとYの情報から開き角度を取得してくれるノードとなります。

RがXでGがYなので、合うように設定します。

上半分が真っ黒の理由は、0以下の数値になっているからです。

ほかのツールでもそうですが、Atan2は角度を0~360ではなく、-180~180で取得する事が多いので

上半分が0以下になってしまう、というワケです。

また、真っ白の範囲が広いですが、これは角度をラジアン単位で持ってきているのが原因となります。

 

ラジアン単位の場合、-180~180は、-π~π に変換されます。 

 

この状態では非常に扱いにくいので、扱いやすい数値に変換しましょう。

 

f:id:tktknkyo:20190426125544p:plain

 

左下の3.142とあるのが、πの変わりとなります。

表示上では3.142とありますが、数値的には3.141592になっています(これ以上の小数点以下は設定できないようです)

これを加算する事で、全て正の数となります。

(0~2π)

この数値を0~1にしたほうが扱いやすいので

2πで除算する事で、0~1に変換する事が可能です。

 

最終合成

 

f:id:tktknkyo:20190426130857p:plain

作った角度を半径の処理を、それぞれ合わせて、UVsに接続する事で、極座標の処理が完成します。

 

f:id:tktknkyo:20190426131122p:plain

半径の処理のみで接続すると、このようになります。

これは、RとGが同じ数値になるので、中心からの距離が同じ位置には、同じ場所の情報を参照してくる為です。

 

f:id:tktknkyo:20190426131300p:plain

角度の処理のみで接続すると、このようになります。

半径は、同じ半径の部分に同じ情報を持ってきていましたが

こちらは、同じ角度の部分に同じ情報を持ってくるのでこのようになります。

 

調整部分

最後に調整の部分です。

最初の方で、持ってくる位置の情報は、小数点以下の数値を参照して持ってくる。

とありました。

なので、この仕様を使えば、中心から外に動いたり、回したりする処理が簡単に作れます。

 

f:id:tktknkyo:20190426131822p:plain

半径の処理に、Timeで数値を加算すると、外側から中心に移動するようなスクロールとなります。

ここの数値は、そのまま中心からの距離を取得しています。

その数値が増えると、取得する距離が、どんどんと遠くなっていきます。

一番中心であれば、0→0.25→0.5→0.75→1(小数点以下取得なので0)となる為です。

 

f:id:tktknkyo:20190426132231p:plain

こちらは角度の処理にTimeで数値を加算したものです

こちらは左回りとなります。

原理的には、半径のと同じとなります。

 

原理が分かってくれば、非常に色々流用できる部分はあると思います。

 

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

 

 

 ここから追記です(2019/10/22)

 

実際のデータがこちらになります

中身を開いて、全て選択からマテリアル内に貼り付けてください。 

Dropbox - UE4極座標.txt - Simplify your life

 

【Houdini】途中からシミュレーション結果に切り替える

f:id:tktknkyo:20190421100728p:plain

Verは17.5.173です

 

少し久しぶりな気もする、Houdiniの内容です。

タイトルの通り、途中のフレームからシミュレーション結果を読み込みます。

サムネイル見たら予想はできそうですが、RBDによるシミュレーションを今回使用しました。

 

 

具体的にはこの様なものを作りました。

 

 

 

今回の動き、最初の伸びる部分は、SOPで動きを作っています。

高さなどを、操作できるようにしておいて、キーフレームで、時間に応じて変形するように作っています。

 

今回、例えとしてBoxを使います。

 

今回の目的としては

SOPで横に移動する動きの後に
DOPのシミュレーションによって、Boxが落下してバラバラになる
というのを作ります。

 

f:id:tktknkyo:20190421102742p:plain

f:id:tktknkyo:20190421103220p:plain



Boxの下にTransformを接続し
TranlateのZを時間で動くようにしました。

当然ですが、Z軸に向かってBoxが動きます。

この後にシミュレーションも入れるので、大きめにして、宙にも浮かせています。


f:id:tktknkyo:20190421103409p:plain

シミュレーションなので、ボロノイで割る処理も追加しておきます。

Scatterのポイント数は100にしています。

 

f:id:tktknkyo:20190421103617p:plain

この時点でシミュレーションを追加します。

シェルフから作りました。

 

f:id:tktknkyo:20190421103746p:plain

DOPの中に衝突用のメッシュは置いておきましょう、特に理由がなければ
GroundPlaneで良いと思います。

 

 

f:id:tktknkyo:20190421103923p:plain

SOPに戻り、シミュレーションを確認すると、このように割れています...が
Transformによって、時間で移動させていた部分が、シミュレーション結果に入っていません。

右上のワイヤーフレームが、Transformにて移動させた部分になります。

 

 

シミュレーションに読み込む際に、最初のフレームの情報を読み込んで

そこからシミュレーションを開始する用な仕様になっている様です。

 

シミュレーションの結果の後から、動きをSOPで追加はできるのですが。
場合によっては、それでは不都合な場合がどうしても出てくると思います。

 

f:id:tktknkyo:20190421104709p:plain

なので、TimeShiftというノードを使います。

このノードの下にある三つのノードは、シェルフでシミュレーション追加したときに自動で追加されてものです。

 

f:id:tktknkyo:20190421104852p:plain

ここのFrameという部分は、何フレーム目を表示するか?を設定する事ができます。
デフォルトでは、現在のフレーム数と連動しています。

 

ここを、30の固定にすると、常に30フレーム目の情報を持ってくることができます。

今回のように接続すると
OUTの前にあるノードで30フレームの位置から、シミュレーションを開始してくれます。

 

但し、TimeShiftで表示するフレーム数を固定してしまうので。
Transformで横に動かした動きは、30フレーム目を常に取得してしまうので
横への移動が一切なくなってしまいます。

 

なので、1~29フレーム目は、Transformで動かす挙動を作ることができません。

また、シミュレーションが1フレーム目から始まってしまうので
横に移動してから、という動きも作れなくなってしまいます。

 

f:id:tktknkyo:20190421105853p:plain

TimeShiftはフレーム数を固定してしまっているので。

最初の1~29フレーム目では、TimeShiftを通らないように、この様にしました。

 

新しくOUT_simが出来ていますが

これはシミュレーションの結果を参照しやすくするために作りました。

 

switchノードによって、1~29フレームと、30フレームで読み込むノードを切り替えます。

 

f:id:tktknkyo:20190421110234p:plain

29フレーム目に設定したら、switchノードのSelectInputに0のキーフレームを打ちます。

続けて、30フレーム目に1のキーフレームを打ちます。

これにより、フレーム数により、接続情報が切り替わるようになります。

 

f:id:tktknkyo:20190421110518p:plain

切り替わるまでは出来ましたが

シミュレーションは1フレーム目から始まっていますので

動きが可笑しくなると思います。

上のBoxが29フレーム目の位置で

下のBoxが30フレーム目の位置になります。

 

これは、シミュレーションの結果を途中から表示してしまっているのが原因となります。

 

 

f:id:tktknkyo:20190421110912p:plain

これの対処の為に、もう一つTimeShiftを追加しましょう。

今回は、30フレーム目から、1フレーム目のシミュレーション結果が欲しいので

 

f:id:tktknkyo:20190421111027p:plain

$F - 29

と設定します、$Fが現在のフレーム数なので、そこから29を引き算しています。

これにより、30フレーム目にシミュレーションの1フレーム目を読み込むことができます。

 

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