1から始める流体シミュレーション~壱~

はじめに

はじめまして

こんにちは、tardigradeです。本記事が初投稿となります。高校生が隙間時間を使ってだらっと書いている記事ですので、あまり硬くならずに読んでいただければ幸いです。また、書いている記事の内容の正確性については保証しません。気になる間違いがございましたら、コメントかtwitterでご指摘いただければ修正いたします。

twitter.com

 

流体シミュレーションを実装したい

ある日突然、どうしても流体シミュレーションを実装してみたい気分になりました。CG用じゃなくで解析用で使うようなガチガチのやつです。どうにもこの衝動が抑えられそうになかったので、試しに「流体シミュレーション 方法」でググってみました。

……「粒子法」、「格子ボルツマン法」、「ラグランジュ微分」、どのサイトにも難しそうな用語が並んでいて一筋縄ではいかなそうです。まぁ前提として、流体力学や大学数学を学んでいないのに、流体シミュレーションを理解して実装しようというのは無理があるのですが。とはいえこのまま引き下がることなどできません。僕はどうしても流体シミュレーションを実装したいのです。

ブログを書くか

根気よくいろいろなサイトを読み進めていった結果、なんとなく実装の雰囲気だけはつかめた気がしました。あくまでも「気がした」だけです…。まぁ細かいことは置いといて一回は実装してみるべきだなと思い、パソコンと向かいあったのですが、ふと「これ自分の中だけで完結させるのもったいなぁ」という考えが頭をよぎりました。そこで、将来僕と同じような衝動に襲われるかもしれない中高生のために、ブログにその実装方法や考え方を詳細に記録していくことに決めました。僕としても考えを整理できるし、一石二鳥です。ちなみにこれを書いている時点で、まだコードは一行も書いていないので、この先きちんと実装しきれるかどうかは未定です…。あしからずご了承ください<(_ _)>

実装の方針について考える

どんなシミュレーションをしたい?

 何をするにもゴールを先に決めることは重要です。「流体シミュレーション」と聞いてぱっと思いつくのが、水柱(某有名作品とは関係ないです)が崩壊するやつだったので、今回はそれを実装してみます。数値だけの計算ではなく、計算結果を可視化するところまでが目標です。いまいちイメージがつかめない方は「流体シミュレーション」で検索すると下の図に似た画像が見つかると思います。

f:id:tardigrade:20210108233540p:plain

完成品のモデル

「流体」というと水以外にもケチャップやスライムや、なんなら気体も流体ですが、それらのシミュレーションはまた別の機会にということで。

水のシミュレーションの手法

 色々調べてみたところ、大きく分けて「格子法」「粒子法」の2種類があるみたいです。具体的にそれらがどういう方法なのかはとりあえず置いといて、両者のメリット・デメリットについて比較してみました。1)

格子法
  • シンプルで堅牢性があり高速
  • リアルタイム実装向きである
  • 物理的な正確さに欠ける
粒子法
  • 大変形に強い
  • 剛体との連成解析が比較的楽
  • 計算量が比較的多い

ざっくり言うと、格子法は精度が微妙だけど計算は軽い、粒子法は精度はいい感じだけど計算が重い、という感じでしょうか。ちなみに、最近だと両者を混ぜた手法なんかも考案されているようですが、参考文献があまり見つからなかったのでここでは割愛します。

さて、どちらを採用するのかという話ですが、個人的に格子法の「物理的な正確さに欠ける」という点が気になったので、今回は粒子法で実装することにしました。時間があれば、格子法も実装してみて両者の比較をしてみたいですね。

次回予告

ところで、実は粒子法にもいくつか種類があります。次回のブログでは、具体的にどの方法を使うのか、そしてそれはどのような考え方でどのように実装するのかを書いていきたいと思います。

tardigradecfd.hatenablog.com

引用・参考文献

1)www.4gamer.net