2023年12月5日火曜日

交差してても大丈夫! Curveでパーティクルをコントロール

こちらはHoudiniアドベントカレンダー2023↓ 6日目の記事です。
https://qiita.com/advent-calendar/2023/houdini

左がデフォルトのCurve Force 、右がこの記事で紹介する方法です。

デフォルトのCurve Forceも巷にあるチュートリアルのカスタムな方法も、交差したカーブだったり、パーティクルのスピードが速すぎると大体うまくいきません。

なぜなのか?
1つ目の理由は、パーティクルの粒それぞれが自分に一番近いカーブを空間ベースで参照しにいくので
交差した部分にはカーブが複数存在するので、ごちゃっとしてしまいます。

2つ目は、下の図の様に急カーブな位置でパーティクルが速すぎると次のフレームでカーブから遠い位置に移動してしまい、
カーブに近い位置に戻ってこれなくなったり、戻れたとしてもカーブに沿った形状を保てなくなります。

2つ目の理由はサブステップ数を上げれば解決する場合もありますが、交差しているカーブの場合は空間ベースでカーブを参照している以上解決できません。


上記の2つの問題を解決する方法は、@ageの値を使ってカーブ参照するというやり方です。

まずは、適当に交差する様描いたCurveをResample Sopで細かくします。(こんなに細かくしなくても大丈夫。結果を見ながらお好みで)
(クリック拡大)

カーブをpopnetの2番目に指しておきます。(1番目はスタート付近に置いたエミッターです。)

popnet_customの中

follow (POP Wrangle)


/////////////////////////////////////////////////////
float ageF = @age / @TimeInc; 
//@ageは単位が秒なのでフレームにします。

vector P0 = point(1,'P',ageF); 
vector P1 = point(1,'P',ageF+1);
vector moveDir = P1 - P0;
//ageFが0の時は、カーブの最初のポイントと次のポイントの位置を使い、動く分のベクトルを作ります。

@P += moveDir;
//その値をパーティクルのポジションに追加するだけです。

i@ageF = ageF;  //次のPop Killで使用、パーティクルがカーブの最後のポイントを参照したら消けすようにしています。
/////////////////////////////////////////////////////

通常のCurveForceはv@forceだったり、v@vをいじりますが、
それだとどうしても破綻が起きるので、パーティクルのポジション@Pを直接いじる結構強引なやり方です。

動きにノイズを加えたり、カーブを中心に回転させたりも@PをVex(POP wragle)で変更を行
う事で複雑な動きを作る事も可能です。

以上です。


hipファイルはこちら



Houdiniアドベントカレンダー2023全て埋まってるみたいで、素晴らしいですね。
Apprenticeの方のカレンダーがまだ空いているみたいなので、別の記事を書いてみようかと思います。

Houdiniアドベントカレンダー2016年から始まりもう8年目ですね。
Houdiniのテクニックは過去のものも古くならず有効なものが多いです。
是非こちらから過去のものやチェックしてみてください。


0 件のコメント :