2023年10月1日日曜日

Particle5 Trail

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

今回は、トレールのメッシュを追加する。


トレールメッシュ


今までのメッシュはVertexBufferに書き込んで、そのあとメッシュデータを書き換えることはしなかった。
トレールメッシュの場合は毎フレーム書き込むため、今までの仕組みとは別にする必要がある。

通常のパーティクルは1つのオブジェクト=1パーティクルに対応しているが、トレイルの場合はどうしようか悩んだ末、複数オブジェクト=1パーティクルとした。
複数のオブジェクトはトレイルの軌跡を表す位置として利用する。

パーティクル内の複数データの管理は今まで名称で行ってきたけど、これは最初に考えたキャラクタ管理用のデータだったから。
ただ、パーティクルでもそのまま使っていたけど、ユニークな名称にする必要があるし、そもそも名前で管理してもあとから名前で参照することもないしメモリが無駄になる。
また、トレールの場合データのインデックスが重要になってくるが、今のデータ構造だとインデックス順に取り出すことが出来ないため、管理方法を変えることにした。

いろいろ考えた結果、Listで管理することにする。
トレールの場合、オブジェクトの追加を先頭にしていく必要がある。
Vectorだと追加の度にデータ全体をずらす必要が発生するためListのほうが都合がよい。
ただ、データの参照に不安が残るが、実際参照する場面では先頭から順番にアクセスする使い方しかないため問題にならなさそう。

頂点データを順番に、とりあえずy座標を-0.5、+0.5したものを並べていく。

表示してみると、なんとなくうまく行っているように見える。
しばらく動かしてみると、当然のことながら上下から見ると完全に見えなくなる場所が出てくる。


トレールのビルボード


視線のベクトルと、ノード間のベクトルの外積を使えば視線とトレールの線に直交する方向が得られるので、それに幅を掛けて+とー方向に足せばいい。


視錐台カリング


通常の仕組みに乗せて、各点単位に視錐台カリングを行う。
頂点バッファを作る際に、すべての点がカリング対象になっていたら描画をスキップする。


ホーミングレーザ


仕組みが出来たので、ホーミングレーザを作ってみる。
昔、Catmull–Rom Spline補間でレーザの軌跡を作ったけど、今回はこの記事を参考した。


パーティクルオブジェクトの位置を、この計算式で算出して追加するだけで、予定時間にその点を通るような加速度を算出してくれる。
予定時刻を過ぎたら、1秒間で徐々にアルファを0にして消す。
実際には命中して爆発などを起こすんだろうなぁ。



初速は視線のベクトルで、2秒後に赤い四角の的を射抜くホーミングレーザ。





0 件のコメント:

コメントを投稿