株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • 爆発シミュレーションの制御

爆発シミュレーションの制御

2015/4/20

Tag:

皆さん、こんにちは。開発部の川田です。

映像表現の中で比較的よく目にする爆発に関して、その形状や流れを細かく制御する方法を、私が過去に関わった
次の論文を取り上げて説明していきたいと思います。

Procedural Fluid Modeling of Explosion Phenomena Based on Physical Properties
(日本語に訳すと、物理特性に基づく爆発現象における流体の手続き的なモデリング手法、とでもなりましょうか)
この論文の著者のサイトからも、論文がダウンロードできます

この論文の方法を使うと、次のように制御された爆発を生成できます(1つ目の画像の上端のように、爆発の流れの指定をして制御した結果です)。


論文から引用(上:起爆から10フレーム目、下:起爆から55フレーム目(爆発が終了し、火炎から煙に変化))

この方法では、爆発が広がって最大になるまでの時間、起爆時の圧力の強さといった、爆発の移動速度や特徴に関する数個のパラメータをユーザが与えるだけで、比較的爆発らしくリアルな動きで進んでいく火炎を作成することができます。

また、以下のように爆発がどのような方向に伝播して行き、どのような形になるかも、ユーザが具体的に細かく自由に指定できます。


論文から引用(左:起爆から25レーム目、右:起爆から70フレーム目)

左図の隅にあるような制御パスというものを使って火炎の動きの軌道を指定して、ラクダの形状の爆発を生成できています。
ここでは、爆心はラクダの体の中心付近です。

以下のような結果動画も、公開されています(1:37あたりでラクダの例があります)。

この論文の著者のサイトには、解像度の高い格子を使った結果動画もあります。

今回の論文の内容そのものの計算時間は、流体シミュレーションの部分に比べてかなり少ないですし、この方法を使えば細かい制御の指定ができるので、欲しい形状や流れを持った爆発を得るための作業時間が格段に少なくて済みます。

そもそも、ラクダの形になるようなパラメータを探すには気の遠くなるような試行錯誤が必要ですし、ラクダの首のように大きくカーブするような爆発の流れを作り出すことは通常、かなり難しいです。
高速で大きな渦を伴って動く流体の制御の場合は特に、パラメータのちょっとした変更で大きく計算結果が変わってしまうので、この論文のようにパスを使って、より直接的に火炎の動きを指定して制御できるのは便利です。

論文のアイデアとしては簡単に言うと、流体の動きを爆発の物理的な特徴を考慮しながら、近似的に作り出すということです。
以下では、興味がある人のために、このアイデアについて紹介してみます。


流体系の研究に興味がある人のために、もう少し論文のアイデアや技術的な説明をしてみます。
あくまで、考え方や研究のモチベーション、手法のエッセンスについて主に書いてみたつもりです。
考え方の説明の仕方等、ニュアンスが実際の論文とは異なるかもしれないので、詳細は論文自体も確認して頂けると幸いです!

爆発のシミュレーションについて

爆発は通常はCG用の流体シミュレーションで、爆発を表現するような速度場を計算して、その速度場に火炎を沿わせて移動させることで生成します。火炎のような爆発現象における流体を、格子法では密度として定義し、計算をします。以後、密度を移動させるというような表現が出てきますが、一般的なイメージとしてのどのくらい濃いかという意味よりは、単に火炎のような具体的に移動する流体という風に、密度については考えて下さい。
また、流体シミュレーションの中でも、渦やうねるような流れの表現が作りやすいためグリッドを使った格子法が、爆発には一般的によく使われていると思います。格子法の詳細については、以前の記事をご覧ください。

今回の論文では特に、圧縮性の爆発について取り上げています。
圧縮性の爆発とは、爆薬などが起爆して高い圧力が中心に生じて気体が膨張し、それによって、火炎が周囲に放射状に広がり(伝播し)、そして、圧力が収まって伝播が収束するまでのフェーズについての現象です。非圧縮性の爆発は、収束後に、火炎や煙が高温であるために上昇していく次のフェーズの現象(キノコ型のものを含む)で、これについては別の機会に説明できればと思います。

爆発の制御における問題

制御の際に主に問題となる事柄を、簡単に説明します。
どの様な問題があると思いますか?
爆発ではその物理的な特徴や流れが、問題の原因となることが多いのです。

●制御をすると爆発らしく見えなくなってしまう
具体的には、火炎の伝播速度が時間の経過と共に変化していくという特徴を爆発は持っています。ですので、この特徴が制御の影響で変えられてしまうと、結果として特徴が弱まってあまり爆発らしく見えなくなってしまうのです。

●流れや圧力の状態が複雑で制御が難しい
爆発のシミュレーションではその性質上、大きな渦や圧力、あるいは流れの干渉などがたくさん発生しているので、基本的には流れが複雑になっています。なので、特定の部分を制御してもその複雑さゆえに制御の効果があまり出ないこともしばしばあります。

●格子法の特性上、細かい制御が難しい
例えば、カーブしたりするような動きの表現は、単に外力と言った速度場で望む方向に曲げればよいと言うわけにはいかず、曲げた時点で渦が発生して流れが変わったりと、制御がとても難しいのが現状です。

いずれにしても、上のような色々な問題から制御がとても難しいのが、爆発のシミュレーションの課題と言えると思います。そして、このような問題がありつつも、爆発の制御を扱う論文は過去にあまりなかったことも事実です。
これらの問題に対して、次で説明するようなアイデアを使って爆発を制御するのが、今回紹介する論文です。

→ この節で説明した問題の詳細については、末尾の「補足」爆発の制御が難しい理由(論文の研究背景)を参照下さい。


論文のメインアイデア

この論文で最も特徴的な点は、爆発における火炎の流れを”手続き的”に作り出だすというアイデアです。流体シミュレーションだけでなくそれに加えて流れを近似する計算も使って、ものが流れて移動していく状態を作ります。

このアイデアを使うことで、爆発の制御における問題に共通する、意図通りに流体が動いてくれずに制御が難しいという問題に取り組んでいます。

論文のタイトルにあるように端的に言うと、どのように爆発の流体が広がっていくかを時間(フレーム)ごとにモデリングしていくという考え方をとっています。
流体をモデリングする?
ちょっと聞きなれないとは思いますが、基本的には流体を手続き的な方法で具体的にどんどん作り出していくと言う意味です。また、すでに説明したように、流体を制御パスに沿って作り出していきます。

ここでいう手続き的な方法とは、通常の流体シミュレーションのように密度を速度でそのまま動かす純粋な格子法とは異なる、別の方法のことを指しています。手続き的とは、爆発の火炎(密度)が移動するという状態遷移を、速度を含めた爆発の流れの特徴も含めながら、間接的な計算で近似的に作り出してしまうと言う意味です。
また、ここでは、通常イメージする関数的という意味とは異なるニュアンスで、手続き的という表現をしている事に注意下さい。

結果的に、速度によって密度が移動したときの流れに近い、一連の状態を制御パスに沿ってフレーム毎に作り出すことが出来ます。もちろん、このように作り出した密度の移動自体は、純粋な格子法のみによって作り出す流れと同じ精度とはいきませんが、手続き的な方法をとることで、もっと大きな強制力によって密度が移動した状態を生成します。
なので、密度(火炎)の移動を、より意図通りに制御できるようになります。しかも、手続き的に計算された速度や密度の場は、爆発の火炎の伝播に関する物理的な特徴を考慮しています。その特徴とは主に、火炎の伝播速度が時間の経過と共に変化していくことです。

さらに、手続き的な処理の最後に格子法も利用し、格子法で流体らしい密度(火炎)の挙動、渦や流れがうねるような特徴も加わります。しかしながら、ここでの格子法はあくまで、このような特徴を出すためのもので、密度の主たる動きそのものは、密度と速度の場の配置によって、すでに手続き的に決められ、作り出されていることが重要です。

ですので、手続き的な方法で制御パスに沿って密度の移動を作成(モデリング)しつつも、爆発の物理的な特徴と格子法も同時に組み合わせることで、結果的に制御しつつ、同時に物理的なリアリズムも出来るだけ維持した爆発を作り出しています。このような方法をとる事で、比較的意図するように爆発を制御できるようになるので、作業の試行錯誤が格段に少なくて済むようになります。


メインアイデアを使った具体的な処理

流れを近似する計算も使って、ものが流れて移動していく状態をつくるというメインアイデアを、図で表現してみると以下のようになると思います。メインアイデアと流体シミュレーション(格子法)だけの方法の2つを比較しています。

格子法で密度を速度で移動させるという処理を、密度の配置 → 速度の配置 → 格子法、のようにして代わりに近似しています。

具体的に説明すると、図の右端(2.格子法のみ)は、速度場に沿って密度(火炎)を流れさせて、密度を移動させていくという格子法ですが、複雑な流れや大きな圧力や渦の影響で、意図通りに密度が移動してくれないといったことが決して少なくありません。
→ 詳細は「補足」爆発の制御が難しい理由(論文の研究背景)

一方、図の左(1.密度の移動を手続き的に生成)のような論文の方法では、速度によって密度がどのように移動するかを事前に決める形で、計算に基づいて移動先に密度を配置します。密度の移動を表現する密度場を計算(格子法を使った流体計算という意味ではなく)する訳です。これが手続き的な処理にあたる部分です。そして、その密度が沿っていく軌道が、茶色い太線の制御パスになります。

ここで行っている重要なことは、事前計算と配置で、意図したように密度の移動が行われることを基本的に保証させて、尚かつ、結果的に火炎の伝播速度が時間の経過と共に変化していくという特徴についても、できるだけ確保することです。
イメージしづらいでしょうか?
密度が移動して欲しいように進むよう、事前計算と配置の処理をうまく利用している訳です。
こうすることで、爆発の複雑な流れに大きく影響されずに、比較的意図するように密度をパス上に制御して動かせるようになります。

また、図の左(1.密度の移動を手続き的に生成)の速度場についても、密度を実際に移動させるいう方法(手続き的ではない)をとったときに、移動のために必要であると予測される速度として、あくまで計算で作り出しているだけである、ということに注意してもらえればよいと思います。
さらに論文のメインアイデアで、格子法はあくまで、流体らしい挙動、渦や流れがうねるような特徴を出すためで、密度の主たる動きそのものは、密度と速度の場の配置によってすでに決められている、というように説明しました。
ようするに、上で説明した密度の配置 → 速度の配置 → 格子法の部分の、特に、密度の配置 → 速度の配置のところが密度の主たる動きを決めているという意味なのです。

この論文の方法では、速度によって密度がどのように移動するかは、物理的な特徴を使って求めています。また、密度(火炎)の伝播速度の変化を、爆発の火炎の伝播に関する物理的な特徴を考慮しながら計算しています。この速度についても図の左(1.密度の移動を手続き的に生成)から分かるように、密度と同様の方法で上の図のように、制御パスに沿って速度場として配置して作り出します。

よって、密度と速度の両方を爆発の物理的な特徴を使って計算して作り出すことで、火炎の伝播速度が時間の経過と共に変化していくという特徴を実現しています。結果的に、爆発らしい特徴を持ちつつ、また、その爆発らしい特徴があまり失われることなくパス上を移動していく密度を手続き的に作り出せます。ですので、どのように密度を移動させたいかという意図をできるだけ反映しながら、制御できることになるのです。


爆発の制御の全体像

メインアイデアで説明した方法を使って、設定した爆発の収束までの時間に、指定した形状になる爆発を作り出します。ステップごとに、制御パス上に手続き的に流れを作り、また、爆発の特徴も追加されながら処理が行われます。

処理の開始後は、1フレームごとに以下の図のような5つの処理を繰り返します(以下のような、フレーム毎の処理の全体像を論文から引用させてもらいます)。

Process 1, 2は、メインアイデアを使った具体的な処理に対応している部分で、密度の移動を手続き的に生成しています。
また、Process 5は密度の移動を手続き的に生成するときに、格子法を使って流体らしい挙動を作り出している部分に当たります。

さらに、Process 3, 4については基本的には、爆発の物理的な特徴をさらに加えるために、
・圧力強度から圧力場・温度場を生成
・爆轟現象を考慮した、非常に高い圧力も表現した大きな流れの生成
・燃焼を考慮した大きな渦の生成
といったことを行っている部分です。

ユーザ指定と爆発の物理的な特徴の作成

この論文では基本的に、圧力強度曲線というものを使って、爆発の物理的な特徴を作り出します。この特徴が手続き的に流れを作るときにも利用される訳です。

圧力強度曲線において、爆発が伝播して収束するまでの時間、圧力の初期強度、圧力の減衰の度合いという数個のパラメータをユーザが与えることで、手続き的な密度(火炎)の移動の生成のときに用いる伝播速度の時間変化を、自動算出します。これによって比較的爆発らしい、リアルな火炎の動き(流れ)を作成することができます。

さらに言うと、この曲線が一旦決まると、密度や速度の時間ごとの特徴がそれぞれ導き出されるので、基本的にはこの圧力強度曲線だけをユーザが指定してあげればよいことになります。また、これらのパラメータを自由に設定しても、いぜんとして爆発らしいリアリズムは基本的に維持されることになります。

実際には、パラメータを決めてあげた圧力強度曲線が、密度伝播曲線、密度濃度曲線および圧力伝播曲線という、爆発の伝播を特徴付ける曲線を導出することになります。また、これらの3つの曲線は自動で計算されます。
これらの曲線を利用して、爆発の制御の全体像で説明したように、制御しながら爆発を生成していきます。

また、すでに説明したように、爆発がどういった流れで周囲に伝播し、どのような形に徐々に変化していくかも、すなわち、動きや形状もユーザが具体的に細かく指定できます。この指定は、爆心から爆発が収束する到達点までの流れの軌道を表現する制御パスというものを使って行います。全体としては放射状の爆発の形状を作りながら、かつ、部分的に飛び出ているようなものを指定したいときは、飛び出ている部分だけを別途指定して簡単に表現できます。

また、先ほどのラクダの例では体の部分については、爆心位置を指定するだけで、自動的に爆心からラクダの体の表面各所へと、火炎を移動させるような複数の制御パスを生成できます。大きい単位の流れの火炎が、ラクダの体の表面へと伝播していくような表現をしたい場合は、制御パス上を移動していく密度のかたまりの大きさについても自由に指定できます。

以上のような圧力強度曲線と制御パスの指定の入力のみで基本的には、制御パスに沿って制御されて火炎を動かすことが出来て、意図するような形状で収束するような爆発を作成できます。

まとめ

以上のように、この論文の基本的な考え方について主に紹介してみました。

また、この論文の方法では、設定した時間に指定した形状になるだけでなく、火炎の伝播速度が時間の経過と共に変化していくという特徴を考慮できているので、火炎が伝播していく過程における、火炎の伝播タイミング(途中経過)についても、爆発らしいリアリズムを可能な限り維持したものになります。このタイミングも、ユーザ指定された圧力強度曲線に従って決めることが出来ます。
以上のように、
●制御をすると爆発らしく見えなくなってしまう
●流れや圧力の状態が複雑で制御が難しい
●格子法の特性上、細かい制御が難しい
というそれぞれの問題に対して、
○流れ自体は制御パスで3次元的にどのように動いていくか自由に指定できつつも、同時に、制御パス上を手続き的に生成されていく火炎の流れと伝播速度は、爆発の持つ特徴に基本的に従う(制御しても爆発らしさを保つ)
○手続き的に流れを生成するので、爆発では流れや圧力の状態が複雑であるにも関わらず、あまり影響を受けずに流れを作れる
○部分的に大きく飛び出し、しかもカーブしているような爆発の流れも、制御パスに従って意図するように手続き的に生成できる
というように、1つの手法で解決策を提案できているのではと思います。
→ 問題そのものの詳細は「補足」爆発の制御が難しい理由(論文の研究背景)

本論文では、物理シミュレーションをベースにした手法との比較も行っています。

論文から引用(左:本論文の手法、右:物理シミュレーションをベースにした既存手法)

この論文の方法では、制御パスが極端にカーブする場合には部分的に流体が飛び出てしまうことがあるので、爆発で勢いよく飛び出る高速の挙動との兼ね合いも考慮して微調整できれば、尚良いと思います。その具体案として例えば、制御パスの形状特徴(曲率など)に応じた圧力の制御といったものも論文では挙げられています。

今回の論文の内容にあたる爆発の制御部分の計算コストは、格子法の部分に比べてぜんぜん小さいですし、格子法についても一般的なStable Fluidsが使われています。
この方法に対して、自社開発しているアップレゾ手法(流体シミュレーションのアップレゾ(高解像度化)について)も適用できるかもしれませんし、いろいろと応用することで、さらにリアルな爆発を制御して作り出せるようになるかもしれないですね!

また、今回取り上げた方法の詳細についてさらに興味がある人は、論文をぜひとも見てみて下さい!



「補足」爆発の制御が難しい理由(論文の研究背景)

爆発を制御する上での、いくつかの大きな問題についてもう少し詳しく説明します。

まず一点は、
●制御をすると爆発らしく見えなくなってしまう、ということが挙げられます。

例を挙げると、物理ベースの流体シミュレーションで外力や圧力を使って流れをいろいろと変えて爆発を制御することによって、爆発の火炎が伝播していく過程が不自然に見えてしまうことがよくあります。
なぜなら、爆発は伝播して収束するまでの間に、火炎が伝播する距離が時間ごとに変化していくという独特の特徴があるからです。

制御をすることで爆発らしい動きを乱してしまうのです。

言い換えれば、火炎の伝播速度が時間の経過と共に変化していくという特徴を爆発は持っています。ですので、この特徴が制御の影響で変更されてしまうと、特徴が弱まってあまり爆発らしく見えなくなってしまうのです。したがって、爆発を制御したくても、リアルに見えるかどうか(物理的リアリズムを維持できているかどうか)とのトレードオフに悩まされてしまうことになります。

この特徴とは具体的には、爆発は起爆直後、大きな圧力で短時間で全体の伝播距離の大半を高速で移動し、その後、残りの時間で、それまでと比べて低速で伝播するといったものです(とはいっても、スピードはものすごく速いですが!)
この伝播の仕方は爆発を強く特徴付けるので、爆発を制御するときにこの特徴を維持できるかがとても重要になってきます。

物理的リアリズムを維持するという観点では、水のような流体の場合は、制御して流れるスピードや形状を変えても、基本的には水には変わりなくそこまで不自然には見えないので、制御と言う意味では爆発とは性質が異なると思います。
少なくとも、時間ごとの移動距離の変化は、決まってないですよね(一方で、水の表面の特徴を維持したりと言った、水特有の制御の難しさはもちろんありますが、、、!)。

とにかく、制御をすることで上のような爆発らしい動きを乱してしまうことになる、それが大きな問題の1つです。

●流れや圧力の状態が複雑で制御が難しい、と言う問題もあります。

特に、爆発のシミュレーションではその性質上、爆発が起こっている間は大きな圧力や燃焼が多く全体に存在していて、大きな渦や流れの干渉などが沢山発生しているので、基本的には流れがとても複雑になっています。
なので、特定の部分を制御しても制御の効果が伝わらず、なかなかそのまま制御の効果が出ないため、制御がやりにくいというのも爆発における大きな悩みの種です。

●格子法の特性上細かい制御が難しい、これもよく問題となります。
演出意図により、収束時に特定の形状になったり、途中で一部が飛び出たり、さらにはカーブしたりするというような爆発を表現したいこともあります。
しかしながら、例えばカーブしたりするような動きの表現は、流体を単純に外力と言った速度場である方向に曲げればよいと言う訳にはいかず、曲げた時点で渦が発生してその時点で流れが変わってしまったりするので、制御がとても難しいのが現状です。
放射状の爆発の一部分が飛び出すような表現についても、同じように流れが変わってしまうことが多々あります。

以上で説明したような様々な問題をできるだけ解決することで、物理的なリアルさを可能な限り維持しながらも爆発の制御をすることを目指し、提案されたのが今回取り上げた論文の手法なのです。


※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*