流体シミュレーションの応用
![](https://gdep-sol.net/wp-content/uploads/2020/08/cover-cgno3-1500x600-1.jpg)
流体シミュレーションの応用
土橋 宜典 先生
北海道大学 大学院情報科学研究院 教授、プロメテックCGリサーチ 副所長
1. はじめに
CGを用いてリアルな映像を生成するためには、色と動きをリアルに再現しなければなりません。
前回は色の計算方法に関して紹介しました。本稿では、もう一つの要素である動きについて私たちの研究を紹介します。
表題にもあるとおり、私たちは流体シミュレーションを応用した映像生成手法について研究しています。
流体の動きは複雑で、シミュレーションの難易度も高いものですが、CGによって流体を再現できれば迫力のある映像表現を実現できます。
そのためにCG分野ではここ10年以上にわたって重要な研究課題として挙げられ、多くの研究者が効率的な映像生成や複雑な現象の再現に挑戦しています。水や煙、炎の表現から始まり、ハチミツやチョコレート、クリームなどの粘性流体まで様々な表現が可能となりつつあります。
私たちは、そういった現象の再現手法だけでなく、流体シミュレーションを応用した新しいCG表現を中心に研究しています。
2. 流体シミュレーション
プロメテックグループ会社から依頼されたこの記事で、ナビエ・ストークス方程式(以下、NS方程式)方程式の数値計算の解説をすることは気が引けますが、
せっかくですので、流体シミュレーションについて復習しておきます。
CGでは非圧縮性のNS方程式が多用されています(図1)
運動方程式と非圧縮性を満足するための連続の式からなっています。これらの式を解いて速度uと圧力pを求めます。
![図1:非圧縮性ナビエ・ストークス方程式とその意味](https://gdep-sol.net/wp-content/uploads/2021/08/image1-cgno3-03_orig.png)
運動方程式の左辺は流体中の一点の加速度を表しており、右辺はその点にかかる力です。
右辺第一項は流体自身の速度場によって流体が移動する効果を表しています。
第二項は圧力の高い領域から低い領域へと流体が移動する効果を表し、第三項は流体の粘性による速度の減衰を表しています。
連続の式はある領域に流入する流体と流出する流体の量が等しいことを表します。
これらの方程式を解析して各点の速度uおよび圧力pの値を更新します。各点ごとの更新は並列に計算できるため、この計算には GPU が多用されています。
NS方程式の数値解析には粒子を用いる方法と格子を用いる方法がありますが、本稿で紹介する研究は格子を用いる方法を採用しています。
格子を用いる方法は、1999年にStam氏が発表したNS方程式を高速かつ安定に解くための方法* が有名で、私たちの研究もこの方法を基礎としています。
この方法は実装が簡単で、Stam氏のホームページ ではサンプルコードも公開されています。
わずか100行程度のCプログラムで流体シミュレーションを体験できます。
プログラミング経験がある方であれば簡単に利用できると思います。
図2はこのプログラムをもとに GPU で並列化をしてシミュレーションを行ったのものです。
PROMETECHの文字から流れに従って徐々に形が崩れていきます。こんな効果も簡単に作ることができます。
* Jos Stam, Stable Fluids, Proc. ACM SIGGRAPH 1999, pp. 121-128
![図2:2次元流体シミュレーション](https://gdep-sol.net/wp-content/uploads/2021/08/image2-cgno3-01_orig.png)
3. 剛体と煙の相互作用
剛体と煙の相互作用を効率的に計算する研究について紹介します。
煙の動きのシミュレーションには格子を用いる方法が適しています。液体のように表面の複雑な変形を表現する場合には、粒子による手法が主流ですが、煙のようなフワッとしたガス状の物体を扱う場合には格子を用いる方が効率的です。
格子を用いる方法は GPU での並列化が容易であるという利点もあります。しかし、その計算コストは格子数に比例して増加し、剛体と流体の相互作用を計算する場合に問題になります。
物体の形状を表現するために十分な解像度の格子を用いなくてはならず、必要以上に計算コストの増加を招くことがあるからです。
物体形状に応じてアダプティブに格子間隔を変更することも考えられますが、物体が移動すると格子を作りなおさなくてはなりません。また、非一様な格子になってしまうため、特別な補間処理が必要になるなど計算が煩雑になり、実装が容易という利点が損なわれます。
このような問題を解決するため、互いに重なり合う複数の格子を用いて流体解析を行う手法について研究を行っています(図3)。
いわゆる重なり格子と呼ばれる手法で数値流体力学の分野で考え出された方法です。私たちは重なり格子をCGによる映像生成に応用しています。
シミュレーション空間全体を覆う一つの格子(全体格子)に加え、物体周辺にその複雑さに応じた適切な解像度の局所的な格子(局所格子)を別途用意します。
![図3:重なり格子法](https://gdep-sol.net/wp-content/uploads/2021/08/image3-cgno3-02_orig.png)
局所格子は物体ごとに用意します。そして、局所格子と全体格子、あるいは、局所格子同士の間で情報交換しながら別々にシミュレーションを実行します。
局所格子は物体の動きとともに移動・回転するため、物体の移動に伴って格子を作り直す処理は発生しません。
また、それぞれの格子は一様格子で表現するため、アダプティブな格子を用いるよりもはるかに実装が簡単で GPU による並列化にも適しています。
さらに、局所格子内の計算に関しては、物体は静止していると考えて解析を行うことができ、その意味でも処理が簡単になります。
私たちの研究では、視覚的な重要性を考慮した更なる効率化も行っています。
各物体について解像度の異なる局所格子を複数用意しておきます。そして、視点からの距離に応じて適切な解像度の格子に切り替えてシミュレーションを行います(図3の物体A)。
視点から遠方にある物体は細かな流れは知覚されにくいため、格子間隔の大きな局所格子を用いて粗い計算を行っても問題ないと考えましたが、話はそう単純ではありませんでした。
物体周りの流れの変化が大きい場合、その影響が周辺に及ぶため単純に視点から遠いからといって格子間隔を大きくしてしまうと、それによる誤差が周囲に伝播して視覚的にも問題が生じてしまいます。
また、逆に、視点からの距離が近くても流れが単純な場合には、格子間隔を大きくしても視覚的には問題ありません。
そこで、視点からの距離だけでなく、局所格子内の流れの複雑さを考慮して適切な格子間隔の局所格子を選択する方法を考案しました。
流れの複雑さはレイノルズ数と呼ばれる数を用いて評価します。レイノルズ数は流体の粘性効果と慣性効果の比を表しており、レイノルズ数が大きいと乱流のような複雑な流れになります。
これらの工夫によって数倍から数十倍の高速化を実現しています。
図4はこの方法による計算例を示しています。
![図4(a):煙により舞い上がる文字](https://gdep-sol.net/wp-content/uploads/2021/08/image4a-cgno3-01_orig.png)
(a):煙により舞い上がる文字
図4(a)は2次元シミュレーションの例で、学会のロゴ(EUROGRAPHICS)が下部から発生する煙に押し上げられて宙に舞う様子です。
GPU によってシミュレーションしています。
![図4(b):戦闘機の撃墜シミュレーション](https://gdep-sol.net/wp-content/uploads/2021/08/image4b-cgno3-01_orig.png)
(b):戦闘機の撃墜シミュレーション
図4(b)は3次元シミュレーションの例で、戦闘機がミサイルによって撃ち落される様子をシミュレーションしたものです。
一番左の図は格子配置の様子を示しています。
この例では、視点の周辺にも特別な格子を設定し、視覚的な画質の向上を図っています。
4. 流体音のリアルタイム生成
画像ではなく、効果音の生成に流体シミュレーションを応用した研究を紹介します。
CGの主な目的は画像の生成ですが、それだけではリアルな仮想世界を表現することはできません。
最近ではVRという言葉も広く浸透しつつありますが、真にリアルな仮想世界を再現するためには、画像と同じく音の表現が重要になります。
視覚情報だけでは表現できない臨場感やリアリティの向上が期待できるためです。
そこで、私たちは流体によって生じる音を数値シミュレーションによって生成することを試みました。
流体によって生じる音は、風の音、水の音、爆発音など数多くあります。私たちはその中でも風切り音や爆発音の再現に取り組んでいます。
風きり音は空力音とも呼ばれ、身近なところでは、「ヒュー」といった風の音や「ヒュッ」といった剣をすばやく移動させた際の音が挙げられます。
これらの音が発生する原因はいずれも物体の後方に生じる渦であり、物体の振動に起因するものではありません(図5)。
流れの中に物体が存在すると、物体の後方に周期的に渦が形成されます(カルマン渦)。そして、渦の発生に伴って空気圧に微小な変化が生じます。
そのため、周期的に渦が発生するとその発生周期に一致する周波数にピークを持つ音が生成されます。これが風切り音の正体です。
![図5:風切り音の発生原理](https://gdep-sol.net/wp-content/uploads/2021/08/image5-cgno3-02_orig.png)
この音を再現するためには流体(つまり、空気)の挙動を解析しなければなりません。
数値流体力学の分野では、精密な計算によって風切り音を解析する研究が行われています。
この分野の目的は新幹線のような高速な交通機関や空調機のファンなどによる騒音対策が目的で、数時間から数十時間もの非常に長い時間をかけて解析が行われます。
しかし、私たちの目的はVRなどへの応用で、リアルタイムでの音の生成が求められます。
そこで、実験的に得られている風切り音の定性的な性質と数値流体解析を組み合わせ、事前計算を導入することで風切り音のリアルタイム生成を実現しました。
実験的な性質というのは、風切り音の周波数が流速に比例し、音の大きさは流速の6乗に比例するというものです。
ストローハルという人が発見しました。そこで、ある基準の流速における風切り音を数値流体解析により求めます。これには時間がかかりますが、事前に一度だけ行っておけばよいので問題ありません。
そして、物体の動きや風の強さに応じて事前に計算した波形を変調することでリアルタイムに風切り音を生成することができます。
さらに、剣のような断面図が同一の形状については、2次元の流体解析のみでリアルな音が再現できることもわかりました。
図6はこの方法によって風切り音の再現を行った例です。
図6(a)は棒状の物体の断面図を用いた流体解析により風切り音の波形を求めている様子で渦の形成が見て取れます。
画像の下部に示されている白い波形がこのときに発生する風切り音です。
![図6(a):風切り音の数値解析](https://gdep-sol.net/wp-content/uploads/2021/08/image6a-cgno3-01_orig.png)
(a):風切り音の数値解析
![図6(b):剣を振ったときの音](https://gdep-sol.net/wp-content/uploads/2020/08/image6b-cgno3-01_orig2.jpg)
(b):剣を振ったときの音
![図6(c):隙間風の音](https://gdep-sol.net/wp-content/uploads/2020/08/image6c-cgno3-01_orig2.jpg)
(c):隙間風の音
図6(b)・(c)は風切り音のシミュレーション例です。
図6(b)は戦士のゲームキャラクタが二本の剣を振り回した際に発生する音、図6(c)は窓の間の隙間を通過した風によって発生する音をシミュレーションしたものです。
いずれも剣の動きや風の強さに応じた音がリアルタイムに生成されます。
この風切り音の考え方を応用し、炎や爆発の音をリアルタイムに生成する手法についても研究しています。
炎や爆発の場合は前述のカルマン渦と呼ばれる周期的な渦ではなく、乱流が音の発生原因になります。乱流中に生じる様々な大きさの渦の発生や衝突および消滅によって音が発生するといわれています。このような音は乱流の渦度を求めることによって見積もることができます。この計算にもやはり時間がかかるため、風切り音と同様に事前計算を導入することでリアルタイム処理を実現します。
様々な流速の乱流をシミュレーションし、その際に発生する音を計算して保存しておきます。
この事前計算には高解像度の格子を用いて流体シミュレーションを行います。そして、リアルタイムシミュレーションでは、粗い格子を用いて大まかな流体シミュレーションを行い、事前に求めておいた音を再利用することで炎や爆発の音を生成します。
図7はこの方法によって計算した音の例を示しています。
図7:乱流による音のシミュレーション
![図7(a):焚火の音](https://gdep-sol.net/wp-content/uploads/2021/08/image7a-cgno3-01_orig2.jpg)
![図7(b):ガスバーナーの音](https://gdep-sol.net/wp-content/uploads/2021/08/image7b-cgno3-01_2.jpg)
![図7(c):爆発音](https://gdep-sol.net/wp-content/uploads/2021/08/image7c-cgno3-02.jpg)
5. シミュレーションの制御
最後に、シミュレーションの制御に関する研究について紹介します。
流体シミュレーションを利用することで複雑な現象をリアルに再現できますが、その計算コストは依然として高いものです。
加えて、計算結果を予測することは不可能で、目的の映像表現を実現するためにさまざまな試行錯誤が行われます。
特に、映画やゲームなどのエンターテインメントへの応用では、場面に適したビジュアルエフェクトの作成が求められます。
しかし、目的のビジュアルエフェクトが表現されるようシミュレーションのパラメータを調整することは困難で非常に手間のかかる作業となり、大きな問題となっています。
私たちはこの問題を解決するため、シミュレーションを制御する方法の開発に取り組んでいます。物理法則に則った自然な動きを保ちながらもユーザの意図した形状や動きを実現することを目指しています。
私たちの開発した雲のシミュレーションの制御法について説明します。雲は以下のような物理過程を経て生成されます。
まず、太陽熱によって地面が温められ、地上付近の空気塊が熱浮力によって上昇し始めます。空気塊の上昇に伴ってその温度は低下し、ある高度になると空気塊に含まれる水蒸気が水滴へと相転移を起こします。この水滴が雲の正体です。
私たちはこれらの物理過程を数値的にシミュレーションするプログラムを開発しました。
そして、目的の形状の雲を生成するため、このシミュレーションを制御するシステムを構築しました。
このシステムでは、ユーザは雲の目標形状をスクリーン上に描画します。そして、シミュレーションが開始されると、指定された目的形状の雲が生成されるようフィードバック制御という考え方に基づいて雲のシミュレーションを制御します(図8)。
![図8:雲のシミュレーションの制御の考え方](https://gdep-sol.net/wp-content/uploads/2021/08/image8-cgno3-01_orig.png)
いくつかの実験の結果、潜熱量と水蒸気量を調整することで雲の形状を制御することがわかりました。
潜熱というのは水蒸気から水滴(雲) への相転移の際に放出される熱のことで、雲の鉛直方向への発達を促す浮力を生み出します。
目標形状とシミュレーションによって生成された雲との差に応じて潜熱量と水蒸気量を制御することで、雲の高さを調整することができます。
この制御方法には、PID制御と呼ばれる自動制御の分野で用いられている方法を利用しています。
私たちの方法の特徴として、人工的な外力を用いていないことが挙げられます。人工的な外力ではなく、潜熱量という物理パラメータの一つを制御することで、雲が発生する力学的なメカニズムを破壊することがなく、その結果、雲の自然な成長を促しながら目的の形状へと収束させることができます。
図9はこの方法によって生成した雲の例です。ピンク色の曲線がユーザにより指定された形状を表しています。
上段は実際にありそうな積乱雲の形状を指定しています。下段は二つの穴を設け、ドクロっぽい雲の生成を試みた例です。
![図9:雲のシミュレーションの制御例](https://gdep-sol.net/wp-content/uploads/2021/08/image9-cgno3-01_orig.png)
同様の考え方を炎のシミュレーションにも応用しています。
この方法では、ユーザの指定した制御点と炎の境界が一致するようシミュレーションを制御します(図10)。
ユーザが制御点を移動した方向に外力を発生し、その大きさを調整することで制御を実現しています。
![図10:炎のシミュレーションの制御の考え方](https://gdep-sol.net/wp-content/uploads/2021/08/image10-cgno3-01_orig.png)
しかし、実験の結果、それだけでは不自然な流れが発生することがわかりました。そこで、炎の発生源の温度も併せて制御する方法を開発しました。
両者を同時に制御することで自然な炎の動きを実現できます。
図11はこの方法によってドラゴンの吐く炎をデザインした例です。
左に示す図は GPU を用いたシミュレーションと組み合わせてインタラクティブに炎の動きを設計している様子で、右側は最終的なレンダリング結果です。
迫力のある炎が表現されています。
![図11:炎のシミュレーションの制御例](https://gdep-sol.net/wp-content/uploads/2022/02/image11-cgno3-01_orig.png)
6. おわりに
流体シミュレーションは GPU の活用が有効なアプリケーションの一つです。
本稿では、流体シミュレーションのCG応用に関する私たちの研究を紹介しました。
流体シミュレーションに関する研究はいま現在も世界中の研究者が取り組んでおり、より複雑な現象の再現が次々と実現されています。
一方、それに伴って計算コストも指数関数的に増大していくと考えられ、GPU はますます重要な役割を果たしていくと思います。
機械学習を使ってデータドリブンにて計算の高速化を図る研究も現れています。
近い将来、複雑な流体現象の映像をリアルタイムに生成することも可能になるでしょう。
私たちもこの流れに遅れることなく、新しい流体表現やCG映像への応用を模索していきたいと思います。
【参考サイト】
本稿で紹介した手法の計算例は以下下のサイトによりご覧いただけます。
・剛体と煙のインタラクション
https://ime.ist.hokudai.ac.jp/~doba/projects/overlapping_grid/overlapping_grid.htm
・風切り音
https://ime.ist.hokudai.ac.jp/~doba/projects/aerodynamic_sound/aero_sound.htm
・炎・爆発の音
https://ime.ist.hokudai.ac.jp/~doba/projects/fire_sound/fire_sound.htm
・雲の制御
https://ime.ist.hokudai.ac.jp/~doba/projects/cloud_control/cloud_control.htm
・炎の制御
https://ime.ist.hokudai.ac.jp/~doba/projects/fire_control/fire_control.htm
著者紹介
![土橋 宜典 先生](https://gdep-sol.net/wp-content/uploads/2021/06/photo-yd-150x200_4.jpg)
土橋 宜典 先生
北海道大学 大学院情報科学研究院 教授
プロメテックCGリサーチ 副所長
1992年 広島大学工学部卒業.1994年,同大大学院工学研究科博士課程前期修了.
1997年 同大博士課程後期修了.同年,広島市立大学情報科学部助手.
2000年 北海道大学大学院工学研究科 助教授.
2004年 同大大学院情報科学研究科 助教授.
2008年 同大大学院情報科学研究科 准教授.
2020年 同大大学院情報科学研究院 教授.工学博士.
主としてコンピュータグラフィックスに関する研究に従事.
Eurographics Best Paper Award,芸術科学会国際CG大賞特別賞,文部科学大臣表彰科学技術賞他.