2023年9月23日土曜日

Particle3 魔法陣

前回に引き続きパーティクルの拡張をする。

今回は魔法陣の演出をやってみたい。


円盤メッシュ


まずパーティクル用メッシュに用意したのは矩形メッシュ。
今回はこれに加えて、円盤のメッシュを追加しようと思う。
ただ、今まで円盤のメッシュを扱ったことがない。
やりたいことは、テクスチャの画像が円に沿ってぐるっと張り付いて、UVのU方向のスクロールが回転、V方向のスクロールが中心に吸い込まれていく感じに動いてほしい。

円盤のUVの展開について色々調べたけど全然見つからなかった。
仕方がないので自分で考えた方法がこれ。

UV展開図


円の分割数を指定すると各頂点の位置を計算する。
x = cos( i ÷ 分割数 ✕ 2π ) ※ i は0~分割数までのループカウンタ
y = sin( i ÷ 分割数 ✕ 2π )
u = i  ÷ 分割数

この図の場合、分割数3で中心に点0、UVは点0が一番上の中心。
そこから半径 (x,y) ✕ 0.5の位置に点2、(x,y) ✕ 約10%の位置に1の点を置く。
Vは点2が1、点1が上から約10%の位置。
後は分割数分ループする。


謎のエネルギー


とりあえずはメッシュにテクスチャを貼り付けて確認してみる。

セルラーノイズにフラクタルノイズを掛けたもの

まずノイズテクスチャを用意する。


円盤メッシュにテクスチャ展開

メッシュに貼り付けた結果。
なんかうまく行ってるっぽい。

マスクイメージ

上記にこのマスクを掛けて


ひねりを加えるとこうなって


色をつけたらこうなる。


最後にUVスクロールでvのマイナス方向に動かすとこんな感じになった。

シェーダ


float2 uv = In.UV + float2( -0.7 * In.UV.y, 0.0 ) ;	// ひねり
Out.Col = Tex.Sample( Sampler, uv + float2( 0.0, -Param.Time )) ;	// マイナス:外側 / プラス:内側
float mask = ( 1 - cos( In.UV.y*2*3.14159265 )) * 0.5 ;
Out.Col = pow( Out.Col, 1.25 ) * mask ;
Out.Col *= In.Col ;
Out.Emissive = Out.Col ;




魔法陣


魔法陣テクスチャ

絵かきツールで適当に画像を用意して、背景をアルファ0になるようにして保存。


シェーダ


Out.Col = Tex.Sample( Sampler, In.UV + float2( Param.Time*-(( step( 0.5,In.UV.y ) + step( 0.5,In.UV.y ) - step( 0.75,In.UV.y ))*2-1)*0.1, 0.0f )) ;
Out.Col *= float4( 0.25f, In.Col.gba ) ;
Out.Emissive = Out.Col * 2 + In.Col.r * float4(1,1,1,1) ;

3つの階層に分かれているので、中心を時計回り、真ん中を反時計回りで高速、外側も反時計回りで低速で回すようにしてみた。
あと、出現時にEmissiveを最大にして光らせるようにした。
更新関数から受け取るrの値で制御している。


魔法陣




0 件のコメント:

コメントを投稿