管理人syogeki            主にCG日記。


by g-sp
カレンダー
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

レンズフレア付き点光源をパーティクルでばら撒く

パーティクル一粒一粒の位置に点光源を配置し、レンズフレアシェーダーに接続するスクリプト。
つかえればいい人向け。
原因不明の動作がいくつかあったりしますがとりあえず使えます。
ガンダム用に作ったけど他にも使い道はありそうです。

<ダウンロード>

2008/02/05 公開



使い方

スクリプトはボタンなりショートカットなりに登録しておきます。
まずはパーティクルを作ります。
何でもいいのでテキトーに。
f0106593_17265456.jpg


レンズシェーダー「StarburstFlare」をカメラに接続します。
f0106593_1727546.jpg


パーティクルクラウドを選択してスクリプト実行!
こんなのがでます
f0106593_17292688.jpg



基本的には上から順番に実行していくことになります。

「パーティクル数をカウント」
 現在のフレームのパーティクル数を記憶するスクリプトオペレーターをクラウドに適用します。
現在の値よりも大きかった場合にどんどん更新されます。
エミッターなどでパーティクルを生成している場合には最初にコレを使います。
パーティクルIDの最大数を調べる為なので、最初のフレームから最後のフレームまで再生して最大数とそのフレーム位置を記録します。
一度やればあとはやらなくてもいいですが、パーティクルのレートなどの設定をいじった場合にはカウントしなおしてください。

「パーティクル数最大のフレームへ移動」
 そのまんまです。
パーティクルの数が一番多い時でないと、あとから新しいIDのパーティクルが生まれてきてしまうのでこれも必要でした。

「パーティクルにライト生成」
 ここから本番です。
フリーズされてる動かないパーティクルなら前の二つの処理はべつにやらなくてもOKです。
レンズシェーダーは自動で検索します。
StarbarstFlareシェーダーが複数ある場合には選択するウィンドウがでます。
その後、こんなのがでてくるので、ライトの色を決めます。
リンクを有効にすると、クラウドのカラーを変えることでライトの色を変えられます。
f0106593_1743335.jpg

OKするとディフューズとスペキュラが両方無効なライトが生成され、そのままレンズシェーダーに接続されます。
パーティクル自体の色は一番最初のフレームに戻さないと反映されないので注意です。
レンダリングするとこんな感じに。
f0106593_1747556.jpg

後でも書きますが、ビュー内のオブジェクトが真っ黒に表示されてしまうのは仕方が無いです。
ヘッドライトを使うなどすればなんとかなります。
クラウドを非表示にするとライトも消えます。
また、パーティクルの移動にしたがって少しチカチカと明るさが変わるようになってます。


「遮蔽判定オブジェクトの登録」
このままだとまだ問題があり、カメラとライトの間に物があっても無視して光が描かれます。
f0106593_1801453.jpg

隠れているかどうかの判定をするオブジェクトを一つだけ登録することができます。
複数ある場合はマージオペレーターで一つにまとめたダミーを用意しておき、レンダリングしない設定にしておけばOKかとおもいます。
コレで隠れている光は影響しないようになりました。
f0106593_1815074.jpg

ビューポートでみると線みたいなものが見えると思いますが、ものすごく細いポリゴンメッシュです。
f0106593_18224312.jpg

遮蔽判定に使用しているのですが、非表示にするとスクリプトオペレーターが更新されないため常時表示しておきます。
レンダリングはされません。
ただ、これを表示してると結構重くなるので、パーティクルクラウドに作成されているLightParticleInfというプロパティを開きHideというパラメータをONOFFすることで非表示にしたりできます。
ただし非表示にすると隠れているかどうかの判定が更新されないところに注意してください。

分かっている不具合
・ビューでオブジェクトが真っ黒に見える
今のところ解決不能。
ヘッドライトを使うしかないです。
・遮蔽判定を適用している時、パーティクルを非表示にしてもライトの強度0にならない。
何故そうなるのか不明。
なるはずなのにならない。
というか、シェーダー自体の設定で非表示にしても消えなくなる。
どうしても消したい場合はパーティクルのレートを0にするか、色を真っ黒にするか、シェーダーそのものを削除してしまう・・・くらいしか==

まぁいらないときはクラウドの中にできたLightParticlesというヌルをブランチ選択して消してしまって、必要な時に生成し直すのが一番いいかも。
フレーム位置とかの情報は別の場所にあるので、ライト自体は消してしまっても問題ないです。
フレアの形自体の変更はシェーダー側で行うことになるし。
上の二つの問題はコレでギリギリフォローできます。
[PR]
by g-sp | 2008-02-05 19:51 | XSI