今回は「炎」をモデリングしてみようと思います。
流体力学とかで計算するパーティクル等に挑戦する訳ではなくて、それっぽく見えるように何とな〜くモデリングします(1^^;)。
炎が燃える様子や、アニメマンガなどの炎の表現などを観察しながら、以下の様に分析・モデル化してみました。
このモデルに従って、5個の部品を描画してみました(下図)。
たったの5個なので、まだ「ミミズが這った」様にしか見えないのですが、これで数を増やして行ったら、それらしく見えるのではないかと思います。試しに2Dグラフィックで作成してみた動画を以下にリンクします。
最後にリンクするデータ2)で作成した動画です。単純な正弦波だけでモデリングしたにしては、それらしく見えませんか?
上の動画で、球体数400個です。
モデリングした炎が不自然ではないシーン全体をモデリングしていきます。キャンプなどで焚き火をしている様子が良さそうです。
キャンプ場によっては、地面に直に薪を置いて焚き火することが禁止されている場所もあるらしい(fromゆるキャン△情報)ので、キャンプ道具のファイアスタンドを作ります。ファイアスタンドの中に、薪を丸く山の様に積んで、そこに火を灯し、焚き火を表現します。
前節でモデリングした炎の頭頂部付近に、見えない局所光線源を設置して、炎の光で辺りが照らされ、影がゆらゆらと揺れる様子を表現したいと思います。
読み込んだ座標データによって、炎を表現する球体を配置して行きますが、この時、各球体の座標値の平均と、一番高い位置に配置した球体の高さを記憶しておき、この座標値を使って、局所光線源の座標にゆらぎを持たせることで表現します。
完成したデータをリンクしておきます。
1) | Xi-TRACEデータ | flame.xitr |
2) | 座標計算用スクリプト | flame_2d.xitr |
3) | マッピングデータ | flame_stain.jpg |
flame_wood.jpg |
1)で、焚き火をモデリングしたレイトレーシングを実行します。1)の実行には、2)で生成した座標ファイルが必要となりますので、先に2)を実行して、座標ファイルを生成しておく必要があります。3)はマッピングデータで、1)から読み込んで使います。
2)を実行する時、先頭付近の変数に「var save_avi=true;」を設定しておくと、2D版で試行した動画を生成することが出来ます。
完成した動画を以下にリンクしておきます。
ランダムに球体を発生させているので、一部を切り出した動画は、本来互いに繋がりません。
上の動画では、レイシレーシングして作成した10秒の動画を最後まで再生した後で、適切な時間に巻き戻して繰り返しています。このため、巻き戻ったタイミングで一瞬不自然につながる個所が存在するのですが、気が付きましたか?注意深く見て居ると気が付くかも?です。
一応、つなぎ目は前後1秒ほど重ねてブレンドしてあるので、違和感は最小限で繋がっているはずです。