• ベストアンサー

花火のアルゴリズム

 何をいまさらといった感じかもしれないのですが、VBを使って、花火が炸裂する様子を再現したいと思っています。  描画法ではなく、火の粉一つ一つがどのように散乱していくかを再現する方法を探しています。  3次元で考えるんだろうなぁ…とは思うのですが、そこから先に考えが及びません。  どなたか、参考になるサイトなどご存知ありませんでしょうか?  検索してもなかなか出てきませんでした。(キーワードに問題があったかもしれないですが…)  具体性に乏しい質問で申し訳ないですが、お心当たりのある方、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★私も『花火プログラム』には興味があります。 ・ただ、どこまで忠実に再現するのかな? ・まず火薬が下のほうから昇っていきますが、物理法則の重力加速度なども計算に入れて、  上に昇るほど速度を遅くします。そして、ある地点で速度がゼロ(無重力)状態になるので  ここで『炸裂』するタイミングになります。 ・『炸裂』するときは同心円状に外側に点線で円を描いていきます。でもね、乱数をちょっと  だけ使って拡散します。この『拡散』の仕方で『花火プログラム』の見栄えが決まると思います。 ・それから、拡散と同時に重力により『火の粒』が下へ落下する処理もちょっとだけ加えます。  よって、『拡散中』には外側に『火の粒』が広がりますが、しばらくしたら下方向への落下を  取り入れます。→物理法則の重力加速(9.8g)を参考に時間のタイミングを計算します。 ・また花火の種類によっては、下から『火の玉』が昇って無重力状態の時に一瞬だけ消えて  一気に『拡散』した円(スプレー状)をちらちらと描画していけば『爽快な花火』を再現できると  思います。 最後に: ・重要なのは『重力』という概念をプログラム上で再現することと、『花火』の種類によって  アルゴリズムを変える必要があることです。物理法則の重力加速度を使わなくても感覚的に  徐々に速度を遅くして打ち上げたり、重力を再現すれば良いのです。 ・以上。おわり。→上記のは 2D でのお話です。3D でも考え方は同じだと思います。

Seigfried
質問者

お礼

 ご回答ありがとうございます。  主に炸裂した後の話ですが、火の粉一つ一つについて現在位置、各方向への速度、各方向への加速度、輝きの強さをその都度計算して表示するということですね。  なるほど、これはかなり悩み甲斐のある命題ですね。  ありがとうございました。

その他の回答 (2)

  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.3

面白そうなことをやっていますね。がんばってください。 花火のアルゴリズムなんか全く考えたことはないですが、火の粉の拡散のアルゴリズムは、重力、爆発時の斥力とかを考慮すれば大体うまくいくのではないでしょうか。あとは火の粉がさらに小さい火の粉に拡散したりするので、再帰的なアルゴリズムにしなければならないかもしれませんね。 それはさておきグラフィックのインタフェースは何を使用されるのでしょうか。3次から2次へ変換とか書かれていますし、VBを使うということなので、GDIを使って描画するということでしょうか?GDIは普通に四角形とかを描画するだけでも結構時間がかかるのでお勧めしません。 DirectXがいやなら、OpenGLでも使ってみてはいかがでしょうか。

Seigfried
質問者

お礼

 回答ありがとうございます。  やはり、GUIは標準のAPIだけでは難しいでしょうか?  そうしようと思っていたのですが…  3D→2D変換は、古くから知られている行列の掛算?でしたか、あれを使おうと思っています。内容は忘れているのでこれからなんですが、火の粉の拡散状況を3Dで計算→2Dに座標変換→GDIで描画といった手順で考えてます。  ずいぶん昔、まだWindows3.1だったころ、多重の円をVB2で描画したことがありますが、あの時のように画面がチラチラして使い物にならないでしょうか?  いづれにせよ、まだ頭の中で考えているだけなので、何か具体的な問題が勃発したらまた質問させて頂こうと思っています。  なので、その時はまたよろしくお願いします。  ありがとうございました。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★追記。 ・花火以外に『湖』に反射した花火を描画してみるのはどうでしょうか?  『湖』の場合は、上下でミラーのように『上』から『下』に火の玉が昇っていく  タイプになります。また、『湖』の場合は『円』ではなく横長の『楕円』にして  描画すると『光の屈折』などを表現できると思います。 ・あと背景にはちょっとした『建築物』などを薄く(半透明)で描くのも良いでしょう。 ・さらに打ち上げのときに火の玉の『軌道』を再現して残像のような形で消えるまでを  タイマーなどで遅延処理します。また『炸裂』した『火の粒』も消えるまでの時間を  乱数などでばらつかせて、落下と同時に消えるように工夫すると臨場感が出るかもね。 最後に: ・複数の花火を同時、あるいは左から順番に遅延処理で打ち上げるなどのパターンも  取り入れると良いでしょう。→オプション設定で変更したり、定義ファイルで記述  出来るようなインターフェイスも面白いです。 ・それから、手前と奥行を花火の大きさと小ささで表現するとかなり『リアルな花火』  になると思います。 ・私も去年の 8 月に簡単な『花火ソフト』を作成しようと思いましたが、上手く仕様が  決まりませんでした。そのため保留になっていましたが、この質問を見てやっぱり今年  『ミニ花火ソフト』を作ろうと思いました。 ・以上。おわり。→お互いに頑張りましょう。

Seigfried
質問者

お礼

 度々ありがとうございます。  飛んでゆく火の粉の軌道を残すことは私も考えていました。炸裂して飛んでゆく火の粉も、打ち上げられた花火から残る火の粉も同じ理論で計算できますね。ひとつの花火で数百個の火の粉が出るとして、そんなにたくさん一度に描画できるのかというところが心配です。(DirectXは使いたくないですし…)  何れにせよ、ありがとうございます。やっぱり私は3D空間で計算して描画する方向で考えて見ます。3D⇒2Dの座標変換を勉強しなければいけないですが…  Oh-Orangeさんの創作意欲にも火をつけてしまったようで…  まぁ、ぼちぼち頑張りましょう。

関連するQ&A

専門家に質問してみよう