流体シミュレーションのアップレゾ(高解像度化)について
2014/9/3
皆さん、こんにちは、開発部の川田です。
先日、遂にエフェクト室がDF_talk記事を書きました!
[DF_talk] DFエフェクトワークフローとMaya,AfterEffectsの便利ツールの紹介
そこで今回は、エフェクト室にも大いに関係のある『流体におけるアップレゾ(高解像度化)』について書いてみたいと思います。
アップレゾに関する考え方や研究について多少説明させて頂きつつ、
エフェクト室と合同で行っている 社内研究開発の結果 も併せて紹介させて頂きます。
アップレゾ(高解像度化)とは
アップレゾ(高解像度化)とは、入力情報としての流体シミュレーション(以後、SIMとする)のデータを、
そのデータが持つ動きや形状を基本的に維持したまま、渦などのディテールを加えた高解像度の情報
(高解像度化したSIM)に変換して出力することです。
ここで、入力情報データは、ある程度低解像度であることを想定し、以後、低解像度SIMとします。
また、低解像度SIMが持つ動きや形状とは、高解像度化した物の主たる動きに相当するもの、
つまり、高解像度化した物のおおまかな動きや形状を表す速度や密度場の情報(低周波成分)等です。
また、ここで言う高解像度化は、解像度を上げて情報量を増やして見た目を向上させるだけでなく、
流体の速度場等も実際に計算して高解像度の流体挙動を求めるので、流体シミュレーションは行います。
ここで、圧力の計算を含めるか含めないか等、どのレベルまでシミュレーションを行うかは高解像度化
の手法によります。詳細については後述の、過去の高解像度化に関する研究を参照ください。
高解像度化の一例は以下です。
こちらは、DFで独自に研究開発した結果です。
左:低解像度SIM(入力)、右:高解像度化したSIM(出力)
格子法では基本的に、流体を表現する密度と、その密度を流れるものとして移動させる速度を考えて、
これらの情報が空間全体で密度場や速度場として計算されます。
低解像度のSIM(主に、密度場と速度場)を入力として、処理を行うことでディテールが加わって高解
像度化されたSIM(主に、密度場と速度場)を出力する処理がアップレゾです。
粒子法でディテールを加える方法については、今回は割愛します。格子法と粒子法の違いについては、前回
ある程度説明しているので、
[DF_talk] 流体シミュレーションを使った自然現象の表現
をご参照ください。
低解像度のベースSIMの動きや形状を維持できていることが、高解像度化の前提です。
この前提は、元々の低解像度SIMにできるだけ合わせて、高解像度SIMを作り出せることで、
アニメータのアーティスティックな表現性を可能な限り尊重して、最終的な絵に最大限活かすことがとても
重要だという考えに基づいています。
逆に、この前提を満たしていない場合は、高解像度化と言うことは難しいと思います。
現在DFでは新しい高解像度化の研究開発を行っており、以下はその動画となります。
新規の高解像度化手法を使った結果 (可視化のため、mayaのfluidにvoxel情報を転送してレンダリングしています)
※劣化無しの綺麗な状態で見たい方はコチラ
次に、高解像度化に関する背景や要望を説明します。
どうして高解像度化が必要なのか
通常、流体SIMを行うときに、形状や動きの調整のために何度も試行錯誤を繰り返したいような場合は、計算
コストの低い低解像度の環境で、低解像度SIMがまず作り出されます。
この試行錯誤の過程は、多くの時間と労力とともにアニメータの表現性が注がれる、とても大事なフェーズ
であると言えます。
そして、アニメータやディレクタによって、作り出した低解像度SIMの動きや形状が望んでいるもの
になると、この低解像度SIMは最終的な映像に見合うような、ディテールを持った高解像度のSIMに作
り直すという作業工程になっています。
逆に、最初から高解像度SIMで作業することは、その計算コストを考えるとあまり現実的ではなく、
低解像度SIMの設定を基にして、高解像度のSIM設定を行うほうがより効率的なので、そのような作業
工程になってます。
また、たとえ低解像度SIMと同じようにSIM設定して(例えば、全く同じように流体のソースから煙が噴出するよう
に設定する)、その設定で高解像度において再SIMしても、元々の低解像度SIMと大きく結果が異なってしまうこと
がよくあります。
これは流体SIMの特性上、煙の噴出時には同じ設定でも、計算時に特に圧力の項目を扱うために、例えば煙が噴出して
昇っていく過程を計算していく内に、低解像度SIMとは結果が変わっていってしまうからです。
実はこの圧力計算はSIMの解像度に依存しているので解像度が変わることで、昇っていく煙の挙動が、低解像度と
高解像度では違ってしまうことになるのです。さらに言うと、基本的に圧力計算は空間の全体に対して解くので、
計算を繰り返していく中で、(例えば)最初は煙が噴出するソース付近だけだった局所的な違いも、結果的には計
算を進めていくとSIM全体に影響を及ぼしてしまうことになるのです。
ですので、結果として一般的には、再度計算して高解像度化されたSIMの低周波成分と、低解像度SIMの動きや形状が
異なってしまうことになります。
したがって、高解像度SIMをいきなり行うことは難しいので、高解像度SIMと低解像度SIMが近づくように、高解像度
SIMの設定の調整作業を行っていくことになる訳ですが、それでも依然として高解像度SIMは一回あたりの計算コスト
が高いので、調整に多くの時間がかかってしまいます。
低解像度で作り出した動きや形状に合うような高解像度SIMが、簡単な調整だけで、比較的少ない調整回数で得られれ
ば良いのですが、SIM設定や調整が複雑な場合は特に、上のような流体の特性上、時間がかかって調整作業の効率が大変
悪くなります(通常は、複雑でない場合でも、最低でも数回の作業が必要と思われます)。
このような理由から、調整のための時間と手間をかけずにできるだけ簡単に、ディテールを持つ高解像度のSIM結果を、
元々の低解像度のSIMに近づけられるようにしたいという要望が常に挙がっていました。
この要望に答えようと、過去にいくつかの高解像度化の方法が研究され、提案されてきました(具体例については、
次の項目に書きます)。
しかしながら、現場が要求する映像のレベルが日々上がっていく中で、これまでの方法だけでは高解像度化した結果が十分に
現場で使えるものではない場合も出てきてしまい、さらに新しい高解像度化の方法が強く望まれているという現実がありました。
過去の高解像度化に関する研究
過去の研究として、Wavelet Turbulence for Fluid Simulation(2008、http://www.cs.cornell.edu/~tedkim/wturb/)
という方法があり、これまで流体系のソフトにも機能として備わっている場合もあります。
Wavelet Turbulence for Fluid Simulationの適用結果の動画(手法の開発者の動画)
この手法は、ベースとなる低解像度SIMの速度や密度場の情報を、手続き的に変換して高解像度を作り出す方法です。
この変換では、統計的アプローチに基づいた乱流に関する物理を考慮した理論が使われていて、これをもとにディ
テールを高解像度情報として加えます。この方法を用いた場合の特徴として、特定の乱流の理論を採用しているので、
特定の見た目を持った高解像度SIMが作成されます。ここでは、高解像度化計算において圧力項は解きませんが、
低解像度の速度場を基にして高解像度の速度場を作り出して、それを用いて変換の計算を行います。
このように完全な高解像度SIMを行わずに、手続き的な方法で高解像度SIMを作り出すので、メモリや計算コストは低くて
済みます。ですので、用途によっては十分効果はあるのですが、別の動きを想定する場合、または、挙動によりバリエー
ションを持たせたいような時には、恐らくこれ以外の方法が望まれることになるでしょう。
一方、Wavelet Turbulence for Fluid Simulationで作り出した速度場の流れに、パーティクルを沿わせることもできて、
その場合はパーティクルを用いて最終的にはレンダリングを行うことになりますが、パーティクルの数を追加した分だけ
詳細を増やすことも可能となり、便利です。
ここで大前提として知っておくべきこととして、純粋な高解像度SIMの結果は、高解像度SIMと同じ解像度において手続き的
に変換して作り出した結果とはどうしても異なってしまうという点があります。なぜなら、手続き的な方法では高解像度度
で圧力の計算を行っていないことが大きな理由で、この計算を省略した時点で、高解像度SIMが作り出すディテールと同じ
挙動を実現することは不可能です。
ただ、それでも、手続き計算に用いる関数自体も、高解像度SIMが作り出すディテールの挙動を比較的近似できると考えら
れていて、それがWavelet Turbulence for Fluid Simulationといった方法の優れている点の1つでもあります。
その他にも、Preview-based Sampling for Controlling Gaseous Simulations
(2011、http://dl.acm.org/citation.cfm?id=2019406.2019430)という、Wavelet Turbulence for Fluid Simulation
のように手続き的に変換するのではなく、高解像度で流体SIMをしながら、基本的には低解像度のSIMとの密度のずれを
修正していくという方法をとるものもあります。
この方法では、低解像度SIMと比べてずれていて密度が足りない(高解像度SIMの)箇所に、速度場を使って密度を移動させて
修正していきます。この方法は、Wavelet Turbulence for Fluid Simulationとは異なり、実際に圧力計算を含めた高解像度
のSIMをするので、Wavelet Turbulence for Fluid Simulationのような特定の見た目が得られることは、比較的少なくなります。
そのような意味では効果が高いでしょうがその一方、実際に高解像度のSIMを行わなければならないので、メモリや計算コス
トが高くなってしまうという特徴もあります。
以上より、ある程度分かるのではと思いますが
・ 特定の見た目にならない
・ 実際に高解像度のSIMをしないで、計算コストとメモリを削減できる
という特徴があれば、さらに効果的な方法になると言えると思います。
新しい高解像度化の方法の結果
これまでに説明したような考え方や背景がある中で、現在DFでは、新しく独自に高解像度化の方法とツールの研究開発
を行っています。現時点でのその方法を使っての、低解像度SIMにディテールを加えて高解像度化した結果を以下に少し
ご紹介します(実際には、その後も開発が進められています)。
新規の高解像度化手法を使った結果1 [ベースとなる低解像度SIMを2および4倍に高解像度化したもの]
※劣化無しの綺麗な状態で見たい方はコチラ
新しい高解像度化の方法の特徴
アルゴリズムレベルの説明は今回は控えますが、この新しい方法の特徴として、先ほど書いた
・ 特定の見た目にならない
・ 実際に高解像度のSIMをしないで、計算コストとメモリを削減できる
については、上の新規の高解像度化手法を使った結果1を見る限りある程度実現できております。
見た目の判断は、数値等の指標が無いので簡単ではないですが、この結果動画、あるいは、以下でいくつか紹介する結果
動画をみてもらうと、ディテールのバリエーションもすでに持てているのではと思います。
それに加えて例えば、
・ 密度の濃淡が変わってしまうことがない
という効果も、以下の動画で分かるようにある程度実現できていると思います。
過去の方法では、低解像度SIMのときよりも、高解像度化した場合のSIMの密度が薄くなったり濃くなったりする場合もあり
ましたが、今回の方法ではそれはあまり見られません。
新規の高解像度化手法を使った結果2 [濃い目の密度が保たれている例]
※劣化無しの綺麗な状態で見たい方はコチラ
また、
・長いフレームに渡って高解像度化を行っても、低解像度SIMとのずれが大きくなってしまうことがない
という効果も以下の動画で分かるように、ある程度実現できています。
新規の高解像度化手法の結果3 [SIMが長くてもずれが出ていない例]
※劣化無しの綺麗な状態で見たい方はコチラ
これまでの方法では、特に高解像度化の際に加えるディテールの強度を上げると、高解像度化した結果のSIMが低解像
のSIMと、徐々に一致しなくなる場合がありました。これは、時間が経過するに従って、低解像度とのずれが蓄積して
しまうことが主な原因でした。
・事前計算が不要
過去の高解像度化の方法で手法によっては、事前計算が必要なものもあります。
例えば、Guiding of Smoke Animations Through Variational Coupling of Simulations at Different Resolutions
(2009、http://dl.acm.org/citation.cfm?id=1599499)という方法は、事前計算を利用して圧力計算の部分を改良
して、低解像度SIMにできるだけ一致させるような高解像度SIMを行います。
これによって、高解像度SIMが持つ、細かい渦といったディテールが比較的再現されるという効果的な方法です。
その反面、事前計算が手法の計算コストをさらに高くしてしまうという特徴がありますが、今回の新規の方法では
事前計算は必要ありません。
新しい高解像度化の方法と既存ソフトの比較
本手法の効果や特徴をもう少し具体的に説明してみます。
あくまで一例ですが、試しに本手法と、ある流体系のソフト(以下、単にソフト)を用いた通常のSIMの両方で、
高解像度の結果を生成する場合の、それぞれの計算コストを比較してみます(まだまだ高速化の余地は残っておりますが)。
ここで通常のSIMとは、Wavelet Turbulence等を用いたものではありません。
【社内研究開発での高解像度化における計算時間】
ベースの低解像度SIM (x,y,z)=(100,200,100) |
2倍へと高解像度化 (x,y,z)=(200,400,200) |
3倍へと高解像度化 (x,y,z)=(300,600,300) |
4倍へと高解像度化 (x,y,z)=(400,800,400) |
|
計算時間 | 約1秒 / frame | 約4秒 / frame | 約13秒 / frame | 約26秒 / frame |
【某Fum○FXでSIMしてみた場合の計算時間(実測値)】
低解像度SIM (x,y,z)=(100,200,100) |
2倍解像度SIM (x,y,z)=(200,400,200) |
3倍解像度SIM (x,y,z)=(300,600,300) |
|
計算時間 | 約1秒 / frame | 約8秒 / frame 約2倍!(当社比) |
約40秒 / frame 約3倍!(当社比) |
以上の様に、本手法を使って高解像度化する場合、ソフトを使うときの約2~3倍の計算スピードが実現されることになります。
さらに、高解像度のSIM結果を元々の低解像度のSIMに近づけるときの(おおまかな動きや形状を合わせるための)
試行錯誤の回数を考えると、平均的に考えて、本手法よりもだいたい2~3倍×試行錯誤の回数倍だけ、ソフトを
使った方が計算時間がかかることになります。
ここで、本手法とソフトのどちらにおいても通常行われる、ディテールの微調整の試行錯誤は回数に入れていません。
また、高解像度SIMの計算コストが数十分程度単位でなく、時間単位になると、この2~3倍×試行錯誤の回数倍
だけ計算時間が余分にかかることは、時間的にかなりの負荷になってくることになり、本手法の効果がさらに現れます。
上で書いたディテールの微調整の試行錯誤も回数に含める場合は、その効果の程がもう少し分かるのではと思います。
さらに、ソフトで高解像度に低解像度のSIM設定を合わせる場合、流体の特性上、さらには、高速の速度場が存在する場合には、
設定の小さな違い(や低解像度SIMとの小さなずれ)が大きな違い(ずれ)へと発展していくので、試行錯誤の回数がさらに増え
ることが予想されます。従って、この場合も、本手法の利点がもう少し大きくなると思われます。
以下は、本手法を用いて、比較的高速で移動する流体を高解像度化した結果です。
新規の高解像度化手法を使った結果4 [比較的高速で煙が上昇する例]
※劣化無しの綺麗な状態で見たい方はコチラ
すでに説明したように、本手法は通常の高解像度SIMとは違った高解像度化の方法なので、高解像度SIMのディテールと
同じ挙動を得る事は難しいですが、それでも、高解像度化した結果が見た目にも特定の偏った挙動にならないようにあ
る程度できているのではと思います。
また、上で説明したディテール以外にも、高解像度にできることでカメラをズームをしたときに見える情報量が増えると
いう利点も大きいと思われます。さらに、格子内の密度の情報を基にメッシュ化して、より詳細な流体の表面を作り出す
といった方法も色々と存在していますし、そのような方法でも今回の手法を利用できるので、今回のように高解像度化した流体
の情報はとても役立つのではと思います。
以上のように、ある程度効果的な高解像度化の手法を作ることが出来てきているのですが、今回の方法は
Wavelet Turbulence for Fluid Simulationをはじめとする多くの過去のすぐれた手法や考え方にヒントを得ていることも
重要で、過去の研究に最大限敬意を払いつつ、参考や応用をさせてもらうことが大切だと思っています。
また、すべての面でベストのものを目指すことは難しく、どのソフトや手法も一長一短があると思うので、今回の方法につ
いて結果の動画を見てもらって、どのような印象を持つかで、今回の利点や特徴を判断してもらうことも大切であると思います。
DF エフェクト室 人員募集中!!
冒頭でもお伝えした通り、今回の社内開発はエフェクト室スタッフと密に連絡を取り合いながら行っています。
今回紹介したような流体に限らず、映像表現の追求のための研究開発は、現場アーティストと連携して行うことで当然効果的になりますし、アドバイスやフィードバックも含めて得るものはとても多いですね。
この高解像度化技術を使うことで、エフェクトアーティストが表現の追求により専念できるようになれば嬉しいですし、現場からもかなり期待されているのもひしひしと感じます。そしてこのアップレゾに関しても、まもなく現場に降ろせそうな状態になってきております。
そ・こ・で!!
みなさんも DFエフェクト室で一緒に働いてみませんか?
このような研究開発も行ってるDFで、新しい表現にどんどんチャレンジしていきましょう!!
募集要項はコチラです
[募集要項] CGデザイナー
みなさん奮ってご応募下さいませ!
(開発部も随時募集しておりますw)
何卒よろしくお願い申し上げます m(_ _)m
※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。
コメント
コメントフォーム