• ベストアンサー

花火のアルゴリズム

 何をいまさらといった感じかもしれないのですが、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

  • 保育所の現状と課題について

    非常に具体性のない質問で、申し訳ありません。 上司から、端的に調べるようにと言われたのですが、 自分に子供がいないので、どういったことが問題になっているのか、 具体的に挙げることができず、困っています。 検索する際のキーワードなど、教えていただけたら助かります。 また、参考になるサイトなど教えていただけると、尚助かります。 よろしくお願いいたします。

  • FDTDにおける遠方電磁場について

    私は、現在大学の研究において、散乱場の電磁界を調べるプログラムを開発しています。 そこで、遠方界の電磁場解析が必要なのですが、プログラムがうまくできません。宇野先生の「FDTD法による電磁界およびアンテナ解析」という本を参考にしてプログラムを組んでいるのですが以下のような疑問がでてきました。 二次元での解析プログラム(TE、TM)を構築しましたが、本に載っているのは三次元。私のプログラムはΔx、Δyは定義されてるがΔzは定義されてない。宇野先生の参考書では二次元は使えないのでしょうか?特に時間更正の部分が混乱しています。 説明がわかりにくくて申し訳ないのですが、どなたか回答よろしくお願いいたします。

  • VBでの二次元流体解析について

    Visual Basic 初心者です。流体解析をしようと考えています。本来であればC++を使った方が良いと聞きますが、訳あって、VBを使用しなくてはいけません。 VBで二次元流体解析をした際に出た時間変化する数値を、動画のように、流れている現象を可視化出来るようにしたいです。 自分でも調べてみましたが、どのキーワードで調べていいのかも全く分からないので、行き詰っています。 なにかヒントを頂ければありがたいです。 Visual Studio2010proを使用しています。 よろしくお願いいたします。 参考に: 下記URLに記載されているような動画を作成したいです。 http://ja.wikipedia.org/wiki/カルマン渦

  • 物理エンジンの自作はできるのでしょうか?

    物理エンジンの自作はできるのでしょうか? よくゲームとかに使用される物理エンジンですが、 ゲームに使うほど高レベルでなくて、ちょっとしたサンプルを作る程度なのですが、 それに使う物理エンジンを自作すると言うことはできるのでしょうか? 目標としては立方体や長方体をある程度積み上げてその崩れていく様子を3Dで再現擦る程度です。 必要ないかもしれませんが、一応使える言語はC,C++,VB.net(VC#)です。 とりあえずDirectXやOpenGLを3D描画に使用するつもりです。 できれば3Dですが、難しいなら2Dでもおkです。

  • 量子力学、熱力学の参考書について・・・

     量子力学または、熱力学の参考書でお勧めの物ありますか?大学院の受験の参考書として探しています。特に量子力学の参考書のお勧めを教えて頂ければ本当にありがたいです。それぞれ1冊程持っているのですが、以下に関する記述が少ない(特に量子力学)ので困ってます。  キーワードの羅列で申し訳ないのですが、    量子力学では、ハミルトン演算子、フェルミ準位、フェルミ分布関数、フェルミ気体、ハミルトニアン、ヘルムホルツ自由エネルギ、ボルツマン定数、1次元調和振動子、1次元井戸方ポテンシャルに関して...  熱力学では、サイクル系、ファンデルワールス状態式に関して... 問題集でも参考章でもいいのでよろしくお願いいたします。

  • 歯数42以上の平歯車

    はじめまして。 当方某大学の卒業制作で歯車の描画プログラムをVBで作っているのですが、標準歯車にて歯底円>基礎円となったときの歯形の描画の仕方が解らず困っています。 知り合いに聞いたところ、とりあえずそれらしく見せるだけならインボリュート曲線と歯底円の交点座標を算出して、そこからインボリュート曲線を描けばいいのでは?とのアドバイスをもらいました。 しかし、こちらのサイトを色々調べたところ、歯数42以上よりこの現象が起こることを知り、「この場合は無理に描画をしないほうがいいのでは?」などと考えるようになりました。 このような場合はどうしたらいいのでしょうか? 稚拙な文章で申し訳ありませんが、どうかご教授おねがいします。 新しく解らない点が出たので追加で質問します。 歯数42以上で歯底円>基礎円となるのは解りましたが、作成したプログラムに歯数41、モジュール5と入力すると歯形の描画がうまくいきませんでした。 具体的に説明すると、最初に描かれる歯と最後に描かれる歯がくっついてしまうのです。いくつか歯数を変えて試したのですが、今現在でその状況になると解っているのは歯数41の時だけです。これはどうしてこのようになってしまうのでしょうか? プログラム中の計算方法としては、 一対のインボリュート曲線を円の中心より(360/歯数)度回転させて描画しています。 つまらない質問とは思いますがよろしくお願いします。

  • 最小値探索アルゴリズム(修正POWELL法、準ニュートン法、修正ニュートン法)

    f(x)=100(x2-x1^2)^2+(1-x1)^2 のバナナ関数において、 初期点(-2 4)から ・修正POWELL法 ・準ニュートン法 ・修正ニュートン法 の収束の様子をプログラミングし考察しなければならなくなりました. ですが、全く検討が付きません.(^^;) まず、修正POWELL法を考えたのですが、 参考文献やサイトが見つからず、 唯一見つけた文献で、始めの 「1次独立なn個の長さ1の直交座標方向ベクトルd」 の意味が分からず止まっています. 修正POWELL法のそれ以降の意味はなんとなく理解してきました. どなたか、上記の3つの方法を解説をしていただけませんでしょうか? 申し訳ありません. また、もしソースを公開しているサイトがあれば、助かります 当方、C&C++、VBが理解できます.

  • X Window上でのOpenGLの使用

    お世話になっております. C++で書いたOpenGLを用いたプログラムをlinux上で演算させ, x WindowでWindowsのPC上に3次元描画をするために, 現在,試行錯誤をしております. (3次元描画と格好いい文言ですが,所詮,点列や辺の描画なんですが・・・) そのプログラムの実行過程で, 描画関数において,エラーが出ていて,それに関する質問です. 現在の状況として, プログラムのコンパイルは出来ております.一応,コンパイラはicpcを使ってます. で,実行エラーとして, freeglut (./a.out): OpenGL GLX extension not supported by display '***.***.***.***:0.0' と出ております. このエラーは,glCreatWindow()という関数でエラーが返されており, X Windowを用いて表示するためには,他のライブラリが必要であると考えました. そこで,調査したところ, XGLというライブラリの存在を知りました. 私の理解では, XGLとは,X WindowでOpenGLを使用するためのドライバー的なライブラリだと理解しております. そこで,使い方を調査しているのですが, ネット検索の段階で,全く掲載ページがない, (書籍の調査は明日以降かなと・・・) ということで,ここに質問させていただきました. 具体的なプログラミングの仕方,参考Webページ,書籍等 や, そもそも,XGLなんて間違っていて,他に使用すべきライブラリがある, とか... 出来れば,C++で書いた現在のプログラムに, 少しだけの変更で収められるようなモノが良いな...と欲張りなことも思っています... ご存じであれば,教えていただきたく,お願い申し上げます. ソースコードは... 数千行のプログラムなので,ちょっと勘弁願いたく...

  • 公益事業経営

    今日やったテストで考えても、まったくできなかったものです。よかったらあなたの考えを今後の勉強の参考にさせてください。→規制緩和が公益事業に及ぼす様々な影響にについてできる限り具体的な事例を挙げながら、価格規制 参入、退出規制、兼業規制、料金水準、サービス、多角化のキーワードを一回以上使用し、述べなさい。2000字以上というものです。 お願いします。

  • textboxの二次元配列で質問

    textboxの二次元配列で質問 Visual Web Developer 2008を使いWebアプリケーションの入力フォームを開発中です。言語はVBです。  複数行のtextboxに入力された文字を連結する方法が分かりません。ネットでいろいろ検索して二次元配列をすれば可能なようですが、分かりやすく書いてあるサイトが見つからず、苦戦しています。列数は10列。行数は50行ぐらいあります。 ↓(サンプル)  例えば、下のような入力フォームのtextboxにあ・い・う・え・お・か・き……と入力された文字列で、buttonをクリックしたら「あいうえおかきくけこ…」と文字列の連結した実行結果を出したい場合です。       列   あ|い|う|え|お| | |   か|き|く|け|こ| | | 行 さ|し|す|せ|そ| | |   た|ち|つ|て|と| | |   な|に|ぬ|ね|の| | |    | | | | | | |    | | | | | | |    textboxが多いので、二次元配列と繰り返し処理(文字がなくなるまで繰り返す)を使って、簡単にできないでしょうか? 初心者なので分かりづらい質問で申し訳ありません。 参考になるページやコードがあったら教えて下さい。 よろしくお願いします。