【Niagara】発生位置をクォタニオンで制御する
この記事の続きというか、派生のような内容になります。
こちらでは、クォタニオンで変更する角度をつかって、位置を制御しよう、という内容になります。
こちらの方は、最初からモジュール作って処理作りました
全体図としては、こうなっています。
エミッター側から設定するためのパラメータは4つあります
BaseLocation
ベースとなる座標になります。
基本的にはParticle.Positionとなります
Angle
そのまんま角度ですね
R
これは半径となります
AddAngleByVector
角度を加算するベクトル、という意味で
具体的には、BP側で設定した、RotationをVectorとして、ここに適用します
重要そうな部分だけを拡大するとこんな感じになります。
まず、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から取ってきた角度ベクトルで回します。
最後に半径を掛けます。
内容としてはこの三つになります。
モジュールの名前は変わってはいますが
これが先ほどの手順で作ったモジュールになります。
半径を200、角度を0~360のランダム
そしてBPから取ってきたUser.Rotationの角度を代入すると
このように、斬撃のメッシュと角度が同じになるように作ることができます。
(この白い粒子がそうです)
また、BPからとってくるので、同じ数値を使えば、連動させるような挙動にすることも可能です。
次に発生する角度の制御をしていきます。
とはいえ、設定そのものは時間を取ってこればいいだけなので、非常に簡単です。
Angleの部分に、Emitter.Ageなどの、エフェクトそのものが発生してからの、時間を取得してくるデータを入れてしまえばうまくいきます。
前の記事の続きということで、今回は短いですがここまでになります。
最近は更新頻度下がってきているので、何かしら更新続けていきたい所です。
【Niagara】メッシュの角度をクォタニオンで制御する
VerはUE4.22.3です。
今回は、Niagaraでクォタニオンを使ってちょっとした制御の方法を。
サムネイルが一つの例です。
モーションと合わせる部分は、割とゴリ押しなので、そこはご了承ください。
こちらが、Niagara上で表示されているこのエフェクトです。
エフェクト単体としては、水平に斬ってるだけの角度となっています。
今回のこの斬撃のエフェクトは、モーションに合わせて角度を変更したい。というのがありまして。
なので、固定の角度だけでなく、角度を変更しやすい作りにする必要がありました。
また、管理面も考えて、一つのエフェクトに対して、BPに制御する事でモーションにあった角度で発生させる
というのを目指しました。
タイミングの関係で判りにくいですが、水平に斬るモーションに合わせて、水平に角度を調整しています。
ちょっとした応用として、このように、前方にそのまま飛ばしたりする処理も作ることができます。
飛ばしてるエフェクトは、別途新しく作る必要はあります。
【そもそもクォタニオンについて】
まずクォタニオンについてですが、原理としては4元数とか、3つの虚数が、とかはありますが、ちょっと使う程度なら、原理的な所まではそこまで知る必要はないと思います。
UE4などでクォタニオンを使う場合で知っておいたほうがいい事としては。
4つの数値を持つ型である、という事
4つの数値のうち、3つは回転軸を指定し、もう一つで角度を指定している、という事。
原理から知ろうとするとややこしいですが、使うだけなら結構簡単です。
【Meshをクォタニオンで回転させる】
今回は、この斬撃のをメインに例を出していきます。
なので、まずはNiagara上で、水平に回転するという挙動を作っていきます。
まずは、このようなメッシュがあったとします。(メッシュは使いたい物で大丈夫です)
メッシュを回転させる為のモジュールは最初から入っています。
このMesh Rotation Rateなどがその一つですね。
これを、Particle Updateに入れて、Yawに-360と入れてみると、水平方向に回転するようになります。
Rotation Rate というパラメータがありますが、これは回転の速度を制御します。
数値を大きくするほど、高速で回転するようになります。
ここに、カーブを入れる事で、回転をだんだん遅くしたり、早くしたりする事も可能です。
このモジュール自体がクォタニオンで回転させています。
中身としてはこのようになっています。
デフォルトのモジュールはこれに限らず、結構複雑な事も多いです。
特に重要になりそうなのは、この辺でしょうか
内容としては、Yow、Pitch、Rollで指定した角度を元にクォタニオンを作っています。
Euler to Quaternuonという関数が一番重要となります。
また、設定したクォタニオンは、Particle.MeshOrientation
に設定する事で、角度が決まります。
このパラメータは、クォタニオンの型なので、クォタニオンで計算したら、そのまま適用出来る、というワケです。
特にモジュール自体を使わなくても、この型のパラメータにすれば、角度の制御ができます。
Updateに、この型のパラメータを追加します
モジュールだけでなく、Dynamic Inputにも、クォタニオン専用のデータがデフォルトであります。
こちらは、回転軸と回転角度から指定すもので、こちらの方がイメージしやすいかもしれません。個人的にはこちらのほうが解りやすいとは思います。
ただ、回転角度に固定値を入れても、そのままでは回ってはくれません。
このように、カーブを入れる事で回転をしてくれるようになります。
【クォタニオンでの回転の制御】
ここまでは、単純にクォタニオンで回転させてただけなので
ここから制御出来るようにしていきたいと思います。
今回としては、モーションなどと合わせて回転させるのを目標とします。
結論から言ってしまうと、回転軸をモーションに合わせて差し替えるだけですが。
モーションから角度をとってくる部分は、ちょっとゴリ押しになります、そこはご了承ください。
発生位置を、キャラに持ってきて、再生すると、このように真横に振ります。
角度を制御する下準備として、Spawn System at Locationの後ろに、Set Niagara Variable(Vector 3)
を繋ぎます。
ただ、これ単体では動きません。
Niagaraの、パラメータの部分で、このようにパラメータを追加します。
User. までは固定なので注意してください、頭のみ大文字にしないと上手く反応してくれないようです。
今回は、User.Rotationというパラメータを追加して、ここに角度を入れていきます。
このパラメータを使っている部分に、BPで指定した数値が入ってくる、という事になります。
ここの制御法は、以前の記事で書いています、そちらも参照してください。
ここから、このRotationのVector型のパラメータを使って、角度を制御していく必要があります。
クォタニオンに変換する必要があります。
今回は新規でモジュールを作成しました。
内容としてはVectorをクォタニオンに変換しています。
Particles.InitialRotation というパラメータもありますが。
これはMesh Rotation Rateのモジュール内を見ると解りますが
クォタニオンの角度の合成をする際に使用されています。
なので、ここで入れておくことで、綺麗に角度の合成をしてくれるようになります。
モジュールが完成したら、Particle Spawnに追加します
中身は、BPから取得してきたUser.Rotationを入れます。
今度は、角度を合成する必要があるので、Mesh Rotation Rateの方で回転させるようにしましょう。
XYZをそれぞれ30に設定すると
このように角度が更新されました。
ただし、XYZを固定値で入れて編集しているだけなので、キャラの向きを考慮してくれません。
キャラクターが、地面に立っている状態、つまり2次元での角度のみで良いのであれば。
自分はこのように設定して制御しています。
まず攻撃を出すアクターの角度を取得し、そこからZ軸だけを変数に格納します。
これにより、キャラの向きの動きを取得してこれるので
そこに固定値を足して、常に出したい向きにエフェクトが出るように調整します。
今回はここまでとなります。
次は、クォタニオンを使って、発生位置の制御をやっていきたいと思います。
【GameSynth】Whooshモデルで少し効果音に触れてみる
今回は久々になりますがGameSynthの内容を
今回はWhooshモデルという、風系の音を作るモデルでちょっとした作り方を
というワケで簡単にいくつかの機能に触れてみようかと思います。
機能の一部のみ触れる形になります、ご了承ください。
デフォルトの時点でから、ある程度線をサムネのように引っ張ってあげるだけでも
ある程度それらしい効果音が作ったりはできます。
画面の左下にある、ここのアイコン
これは、引いた線をランダムに配置しなおすような機能です
ランダムに配置しなおすといっても、引いた線の数などは色々引き継がれます。
例えば、このような太さがある程度違い、比較的に長めの線が複数ある
という場合にこの機能で配置をしなおすと
この様になりました。
向きなどはかなり変わっていますが、線の長さや本数などは、比較的維持されています。
なので、ある程度本数を引いたら、この機能を配置を変えて音を調整して、ある程度いい感じになったら、それをベースに使う...
といった事が比較的にやりやすいです。
線を引いて音を作れるといっても、どうやって引けばいいのか?となった場合に
この機能を使っていけば、比較的につくりやすいと思います。
また、これで配置を変えたあとに、更に追加で線を加えたりもできるので
最初のベースはランダムで配置し、その後自分で新しく線を引いたりする、というのも便利です。
画面の左上にあるこのグラフは、時間と音量を設定しています。
デフォルトがこの状態で
右側に並んだアイコンから、ここを自動で変えることができます。
自分自身で微調整も可能です。
右側に6種類アイコンが並んでいますが。
使い勝手がいいのが、特に下の二つになります。
このグラフの上部にあるここが、効果音全体の長さになります。
作るものによって、長さもだいぶ変わりやすいので
再生しながら、ちょうどいい長さにここで調整しましょう。
画面右上にはパラメータが並んでいます。
LFO という項目の中には、4つ並んでいます。
LFO Rate
こちらは、音に加えるノイズの間隔です
右側になるほど、ノイズの間隔が狭くなります。
LFO Amount
こちらは、音に加えるノイズの強さになります。
強くすると、荒ぶるような音になります。
強くすると、かなり濁った感じで目立ちやすくなります。
LFO Delay
こちらは、音に加えるノイズの発生遅延になります。
最初は綺麗だけど、あとから荒ぶるようにしたい、という場合などに
LFO Attack
こちらは、上げると恐らくですが、ノイズが滑らかになる、という感じでしょうか
RateやAmountが高くても、こちらも高くすれば
ノイズでの荒ぶり感は比較的に小さくなります。
ただ、こちらは微調整というイメージになると思います。
最初に重要になってきそうなのは、恐らくこの辺の機能だと思います。
まだまだ機能が多くて自分自身理解できていないところも多いですが
定期的に記事に書いていけたらな、と思います。
【UE4】ノイズ+スクロールによるフェードアウト
Verは
UE4.21.2
となります。
今回作ったものは、このような動きを作るためのものとなります。
#UE4
— moyasi@マテフォの中の人 (@torisutamoyasi) May 13, 2019
漸くやりたいことが、いい感じでできるように
メインは上から消えていくのですが
そこにノイズを混ぜてみました。 pic.twitter.com/IG5Ujdev7i
調整していくと、このようにグラデーションでのフェードアウトに対して
ノイズを混ぜたような描画を作ることが可能となります。
全体の構造はこのようになっています。
構造の解説
まずは左側のこの部分から
ここは、フェードアウトに使うノイズの調整となります。
今回は、ベースと歪み用は、同じテクスチャを使用しています。
上部の方は、タイリング数をXとYでそれぞれ調整する為の場所となります。
TexCoordに、定数を乗算すればその分がタイリングされるので
XとYをそれぞれパラメータ化して、インスタンス側でもいじれるように設定し。
それをタイリング数となるようにしているので
インスタンス側から、自由にタイリング数を変更させる事ができます。
下側は、テクスチャに追加するノイズとなります。
歪みには、XとYがRとGのみ必要になるので、この二つのチャンネルを取り出します。
ノイズはそのまま歪みに適用すると、大きすぎる事が多いので
低めの定数を乗算して、ノイズの強度を調整しておくと綺麗になりやすいです。
今回は、インスタンス側でも調整できるように、パラメータ化してあります。
こうして出来上がった、タイリングと歪みの処理を加算してから
テクスチャのUVsに接続します。
次にこの部分となります。
ここは、グラデーションとノイズを混ぜ合わせる役割となっております。
テクスチャからSqrtに接続しています、これは必須ではありません
使用するテクスチャに大きく影響しますが、フェードアウトの調整として、入れたほうが自然になりやすいかなと思います。
TexCordからGチャンネルを抜き出しているのは、単純にグラデーションを持ってくる為です。
当然ですが、ここを自身で容易したテクスチャを使っても構いません。
その後は、ノイズとグラデーションを乗算します。
その後に再度Sqrtに接続します。
2回Sqrtを使っていますが、このノードは平方根を出してくれます。
最後に平方根を入れているのは
グラデーションとノイズを乗算すると、かなり色が黒くなってしまうので、そこからの調整をする為となります。
グラデーションとノイズを混ぜた結果がこのようになっています。
ノイズの模様も維持しつつ、グラデーションが掛かっているのが解ると思います。
最後にこの部分となります
OPMとなるパラメータが、フェードアウトさせる場合の基準となる部分になります。
エフェクトで使う場合は、ここを動かすことになるので
DynamicParameterに置き換えてください
BPで制御する場合は、ScaleParameterで問題ありません。
OPMは基本的に0~1でフェードアウトの範囲を決定します。
そこに対して、先ほど作ったノイズとグラデーションを合成したものも、0~1の数値になっています。
また、グラデーションを混ぜているので、上は数値が低く、下が数値が高くなっています。
OPMのパラメータから減算する事により
1から0になるにつれて、全体の数値が少なくなります。
グラデーションが混ざっているので、下のほうから少しづつ0になる領域が増えていきます。
最後に、Clampを使い0~1からはみ出た部分を0~1に収めます。
エミッシブカラーは今回はあくまで機能説明なので、単色を使っています。
是非ParticleColorやノイズを混ぜたりしてみてください。
マテリアルとしては終わりですが、最後に一つやることがあります。
デフォルト設定の場合、オパシティマスクの数値は、1/3以下で消される設定になっています。
今回の、この設定の場合では、制御がどうしてもしにくいので
ここを変更しておきます。
作成したマテリアルから、インスタンスを作り
下にある、ここのパラメータを変更してください。
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する必要があります。
シェルフの部分の、UpdateでDL出来るはずです。
ただ、具体的な手順が若干解っていない所もあります、ご了承下さい
また、自身はsteamのIndie版です
ここが違うと、DLの仕方も変わってくるかもしれません。
まずはシミュレーションを作ってみる
とりあえず、定番のシミュレーションを作ります。
とりあえず、でBoxを作ります。
上空から落とすので、Centerをとりあえず2程度に設定しておきましょう。
その後の設定はこのようにします。
ノードの設定そのものは初期設定で問題ありません。
最後はNUllノードを作り、解りやすくする為に、名前を「OUT」にしています。
その後、OBJまで戻り
ここのシェルフにてシミュレーションを作ります。
シミュレーションを作る際に
この様なメッセージが出てきます。
左側をクリックしておきましょう。
VATでもっていくには、シミュレーションをパック化しておく必要があります。
ほかのシェルフなどで作る場合、UE4にもって行ったときに変な動きになることがあります。
OBJネットワーク上に、DOPのノードが作られるので、中に入ります。
今の段階で再生しても、ただ重力で落ちるだけとなっています。
地面が作られていないので、地面を作ります。
これで、地面に落ちて割れるシミュレーションが作られました。
次に、VATに変換してUE4に組み込みます。
VATの作成
まずは、破壊したBOXを作ったノードに入ります
OUTの下が、シェルフでシミュレーションを作った時に自動で作られたノードです。
このままでは、若干解りにくいので
最後にNULLノードを接続しておきます。
名前はOUT_Simとしました。
OUTネットワークに移動し、VATを作るノードを作成します。
今回はRBDのシミュレーションを作ったので
Rigid、を選択します。
Export Nodeは、変換するノードを選択します。
シミュレーション自体はDOPで作っていますが。
DOPで作ったシミュレーションは、SOPで読み込んでいます
なので、SOPの方のパスを選択しておきます。
最後に作ったOUT_Simを設定しておきましょう。
設定できたら、Renderのボタンで出力します。
プロジェクトのExportというフォルダに出力されたデータが出てくると思います。
UE4への組込み
RBD用の場合は、メッシュと最後にPOSとあるテクスチャとROTとあるテクスチャが書き出されます。
ここは書き出す種類によって変わってきます。
まずは、この書き出した三つのデータをUE4にインポートします。
次にマテリアルが必要になるので、新規でマテリアルを作ります。
HoudiniのVATを作ったノードにこの様な部分があります。
+のボタンを押すと開くので、この中身をコピー&ペーストでUE4に持っていきます。
コードをコピーしたら、UE4のマテリアル上で貼り付けをすると、ノードが作られます。
詳細設定の、ここの矢印をクリックで展開して
ここの設定を3にしておきます。
Houdiniから持ってきたノード群には
コメントで何処に接続すればいいのか?が書いてあるので
それに従い設定していきます。
マテリアルは完成ですが
VAtで動かすには、インスタンスを作っておきます。
作ったマテリアルからインスタンスを作成します。
インスタンスのこの5つのパラメータは編集する必要があるので
チェックを入れて編集します。
ここに入れる数値は
Houdini側の、この部分と同じ数値を入れる必要があります。
インスタンスにある、ここの部分も編集する必要があります。
Houdiniで生成したテクスチャを、ここでそれぞれ設定していきます。
最後に、メッシュに、このインスタンスを設定すれば完成です。
カスケードにて調整する
では次に、カスケード側で調整できるようにしていきます。
まず、VATの動きが、どこで動いているのか、という部分ですが
左の方にひっそりとTimeのノードがあり、ここで制御されています。
なので、ここをDynamicParameterに差し替えればできます。
ただし、時間の制御は、フレーム数ではなく、秒数なので注意が必要です。
ここで一つ問題が出てきます。
恐らくこの時点でそのまま読み込むと、変な形になると思います。
地面に落ちて割れるシミュレーションのはずが
カスケードで読み込むと、変な動きをするようになります。
原因は大きさで、InitialSizeを1に設定すると解決します。
ただ、大きさが完全固定では面倒なので、制御できるようにします。
おそらくですが、カスケード側で大きさを変えると、移動量の計算がおかしくなるようです。
マテリアル側で、ここの大きさを制御してる部分に、DynamicParameterを乗算します。
こうする事で、カスケード側で大きさを変えれる...ようにはなりますが。
InitiarSizeの大きさと同じにする必要が出てくるようです。
ちゃんと乱数で制御したい場合は、どうしてもBPでの制御が必要になってきそうではあります。
今回はここまでになります、VATに関してはまだまだ解っていない部分が多いので、判明次第色々情報纏めていこうかと思います。
【UE4】Materialで極座標の処理を自作してみる
はじめに
今回の記事はかなり憶測部分が多いので、間違っている部分が有ると思いますのでご了承下さい
(コッソリ教えて頂けれると幸いです)
VerはUE4.21.2です
画像の加工などで便利な極座標の処理
便利なので、デフォルトの時点で関数で極座標の処理をするノードが用意されています。
Vector To Radial Value というマテリアル関数です
基本はこれで問題無いのですが、スクロールなどの
ほかの移動などと合わせる際に、どうしてもややこしくなりやすい、うまく制御しにくい。
という部分が多少あったので
極座標の処理そのものから作れば制御しやすくなるのでは?
となったのが、今回処理を自作した理由となります。
そもそもマテリアルのUVs接続について
変形の処理を作る際に、このUVsの接続する情報をある程度把握する必要があるのかなと
まずはタイリングさせたりする基本である
TextureCoordinateをそのまま接続
単体では全く変化がありません。
加算すると、座標が動きます、スクロールの処理を入れたりするときに
使ったりする手段でもあります。
乗算すると、タイリングされます。
インスタンスでタイリング数を制御したい場合などに使う手段でもあります。
加算でノイズテクスチャを混ぜることで
マテリアルそのものの歪み処理なんかも。
ただ、ちゃんと制御するには、ある程度仕組み解ってないと厳しい部分はあるのでは?と。
処理内容としては、恐らくですが、UVsに接続されたRとGチャンネルをそれぞれXとYに置き換え
どこの位置にある数値を取得してくるのか?を定義しているのかなと思います。
例えば、RとGが0.5の場合は、ちょうど中心を指定します
そして、このように定数を繋げる場合
Texの情報のXとYが0.5の位置にある数値を、TextureSampleに適用する事になります。
定数を接続する場合、色の情報を、一箇所からとってきて、それを全ての場所に適用する事になります。
極座標を掛ける処理を考える
こちらはHoudiniで作ったものですが
極座標で、いわゆるこの様な処理を作ります。
X軸を半径
Y軸を角度
にするようにUE4のマテリアルで処理を作ります。
半径の処理を作る
まずは半径から
UVsの接続に使われる情報は、接続している情報の座標をもってきます
なので、Xを半径にしたい場合
この右側のグラデーションの数値が、そのまま半径にします。
つまり左側が中心に、右側が外側になるようにします。
左側の数値の低い部分を中心に
右側の数値の高い部分を外側に持ってくるので
円を描くようにすれば大丈夫です。
0~1の数値になっていますが、黒い部分を中心に持ってきたいので
0.5を減算する事により、-0.5~0.5になり、中心に0が来るようになります。
次に、円を作る手段としては、三平方の定理を利用し、中心からの距離を取得します。
但し、三平方の定理には、XとYが両方必要になってくるのでGチャンネルも必要となります。
三平方の定理は、高さと幅を2条し、その平方根が距離となるので
XとYを2条し、それぞれを加算のあと、平方根を出します
そうすると、中心からの距離を取得が可能となります。
この数値はそのまま半径として使用できます。
角度の処理を作る
次に角度を生成します。
Y軸が角度になるように処理を作りましょう
先ほどの半径は、中心からの半径を出しました
同じように、こちらは中心からの角度を出しましょう。
この時にピッタリなArctangent2というノードがあります。
Atan2と検索すれば出てきます。
Atan2には、XとYの情報から開き角度を取得してくれるノードとなります。
RがXでGがYなので、合うように設定します。
上半分が真っ黒の理由は、0以下の数値になっているからです。
ほかのツールでもそうですが、Atan2は角度を0~360ではなく、-180~180で取得する事が多いので
上半分が0以下になってしまう、というワケです。
また、真っ白の範囲が広いですが、これは角度をラジアン単位で持ってきているのが原因となります。
ラジアン単位の場合、-180~180は、-π~π に変換されます。
この状態では非常に扱いにくいので、扱いやすい数値に変換しましょう。
左下の3.142とあるのが、πの変わりとなります。
表示上では3.142とありますが、数値的には3.141592になっています(これ以上の小数点以下は設定できないようです)
これを加算する事で、全て正の数となります。
(0~2π)
この数値を0~1にしたほうが扱いやすいので
2πで除算する事で、0~1に変換する事が可能です。
最終合成
作った角度を半径の処理を、それぞれ合わせて、UVsに接続する事で、極座標の処理が完成します。
半径の処理のみで接続すると、このようになります。
これは、RとGが同じ数値になるので、中心からの距離が同じ位置には、同じ場所の情報を参照してくる為です。
角度の処理のみで接続すると、このようになります。
半径は、同じ半径の部分に同じ情報を持ってきていましたが
こちらは、同じ角度の部分に同じ情報を持ってくるのでこのようになります。
調整部分
最後に調整の部分です。
最初の方で、持ってくる位置の情報は、小数点以下の数値を参照して持ってくる。
とありました。
なので、この仕様を使えば、中心から外に動いたり、回したりする処理が簡単に作れます。
半径の処理に、Timeで数値を加算すると、外側から中心に移動するようなスクロールとなります。
ここの数値は、そのまま中心からの距離を取得しています。
その数値が増えると、取得する距離が、どんどんと遠くなっていきます。
一番中心であれば、0→0.25→0.5→0.75→1(小数点以下取得なので0)となる為です。
こちらは角度の処理にTimeで数値を加算したものです
こちらは左回りとなります。
原理的には、半径のと同じとなります。
原理が分かってくれば、非常に色々流用できる部分はあると思います。
今回はここまでとなります。
ここから追記です(2019/10/22)
実際のデータがこちらになります
中身を開いて、全て選択からマテリアル内に貼り付けてください。
Dropbox - UE4極座標.txt - Simplify your life
【Houdini】途中からシミュレーション結果に切り替える
Verは17.5.173です
少し久しぶりな気もする、Houdiniの内容です。
タイトルの通り、途中のフレームからシミュレーション結果を読み込みます。
サムネイル見たら予想はできそうですが、RBDによるシミュレーションを今回使用しました。
途中でシュミレーションに切り替えるやつ pic.twitter.com/PJKY3HHpRu
— moyasi@マテフォの中の人 (@torisutamoyasi) April 21, 2019
具体的にはこの様なものを作りました。
今回の動き、最初の伸びる部分は、SOPで動きを作っています。
高さなどを、操作できるようにしておいて、キーフレームで、時間に応じて変形するように作っています。
今回、例えとしてBoxを使います。
今回の目的としては
SOPで横に移動する動きの後に
DOPのシミュレーションによって、Boxが落下してバラバラになる
というのを作ります。
Boxの下にTransformを接続し
TranlateのZを時間で動くようにしました。
当然ですが、Z軸に向かってBoxが動きます。
この後にシミュレーションも入れるので、大きめにして、宙にも浮かせています。
シミュレーションなので、ボロノイで割る処理も追加しておきます。
Scatterのポイント数は100にしています。
この時点でシミュレーションを追加します。
シェルフから作りました。
DOPの中に衝突用のメッシュは置いておきましょう、特に理由がなければ
GroundPlaneで良いと思います。
SOPに戻り、シミュレーションを確認すると、このように割れています...が
Transformによって、時間で移動させていた部分が、シミュレーション結果に入っていません。
右上のワイヤーフレームが、Transformにて移動させた部分になります。
シミュレーションに読み込む際に、最初のフレームの情報を読み込んで
そこからシミュレーションを開始する用な仕様になっている様です。
シミュレーションの結果の後から、動きをSOPで追加はできるのですが。
場合によっては、それでは不都合な場合がどうしても出てくると思います。
なので、TimeShiftというノードを使います。
このノードの下にある三つのノードは、シェルフでシミュレーション追加したときに自動で追加されてものです。
ここのFrameという部分は、何フレーム目を表示するか?を設定する事ができます。
デフォルトでは、現在のフレーム数と連動しています。
ここを、30の固定にすると、常に30フレーム目の情報を持ってくることができます。
今回のように接続すると
OUTの前にあるノードで30フレームの位置から、シミュレーションを開始してくれます。
但し、TimeShiftで表示するフレーム数を固定してしまうので。
Transformで横に動かした動きは、30フレーム目を常に取得してしまうので
横への移動が一切なくなってしまいます。
なので、1~29フレーム目は、Transformで動かす挙動を作ることができません。
また、シミュレーションが1フレーム目から始まってしまうので
横に移動してから、という動きも作れなくなってしまいます。
TimeShiftはフレーム数を固定してしまっているので。
最初の1~29フレーム目では、TimeShiftを通らないように、この様にしました。
新しくOUT_simが出来ていますが
これはシミュレーションの結果を参照しやすくするために作りました。
switchノードによって、1~29フレームと、30フレームで読み込むノードを切り替えます。
29フレーム目に設定したら、switchノードのSelectInputに0のキーフレームを打ちます。
続けて、30フレーム目に1のキーフレームを打ちます。
これにより、フレーム数により、接続情報が切り替わるようになります。
切り替わるまでは出来ましたが
シミュレーションは1フレーム目から始まっていますので
動きが可笑しくなると思います。
上のBoxが29フレーム目の位置で
下のBoxが30フレーム目の位置になります。
これは、シミュレーションの結果を途中から表示してしまっているのが原因となります。
これの対処の為に、もう一つTimeShiftを追加しましょう。
今回は、30フレーム目から、1フレーム目のシミュレーション結果が欲しいので
$F - 29
と設定します、$Fが現在のフレーム数なので、そこから29を引き算しています。
これにより、30フレーム目にシミュレーションの1フレーム目を読み込むことができます。
今回はここまでとなります。