Fusion

Sprut2で流体シミュレーション!【Reactor】

Reactorから入手できるツールで遊ぶ企画第二弾として、流体シミュレーションした結果を得ることができる「Sprut2であれこれ試してみましたのでご紹介します。

もともとはコンポジットソフトであるNuke用のツールとしてTheodor Groeneboomさんによって作成されたツールを参考に、We Suck Less管理人のPieterさんがFusion用に作成したものです。

For those who are not aware of what Sprut is, Sprut is a set of tools for 2D fluid simulations. It was originally developed by Theodor Groeneboom for Nuke.

Sprutが何であるかを知らない人のために説明すると、Sprutは2D流体シミュレーションのためのツール群です。元々はTheodor Groeneboom氏がNukeのために開発したものです。

www.steakunderwater.com

ちなみに以前紹介したLoopもPieterさんが作成したツールです。Pieterさんすごい^^

Sprut2を使うと、こんな感じで波っぽいような渦っぽいような、インクを水に溶かしたような効果を得ることができます。クールですね!

これは使ってみたい!と思ったもののツールの使い方を解説したサイトや動画があまり見つからなかったので、試した内容をまとめました。触ってみようかなと思うきっかけになれば幸いです。

このツールはDaVinci ResolveではなくスタンドアロンのFusionで使用したほうがよさそうです。DaVinci Resolveで使用すると動作が激重&落ちてしまいました。

環境によるかもしれませんがWe Suck LessでもFusion使ったほうがいいよとコメントされていましたので、Fusionでトライしてみてください!

そもそもReactorって何?という方やReactorのインストール方法を知りたい方は以下の記事で解説していますので、こちらもぜひご参照ください!

Sprut2でできること

ひとまず何か作ってみようということで、火の玉みたいなものや、

軌跡がゆらゆらと動く書道っぽいものを作成してみました。結構いい感じのものができたと思います^^

それぞれのSettingsファイルはこちらからダウンロードいただけます。

もしかしたらcompファイルのほうが使いやすいかもしれないのでcompファイルも置いておきます。

この記事では、書道っぽい結果が得られるSettingsファイル(以降、Sprut2Caractor.setting)をサンプルとしてSprut2の使い方を説明しつつ、後半部分でパラメータやその意味について確認していきます。

本来は文字を書くためのツールではないので、もしかしたら題材としてあまり適切ではないかもしれませんが、大目に見てください^^

デモcompファイルからSprut2の構成を確認

Spurt2をインストールすると、デモcompファイルがダウンロードされます。compファイルの格納場所はScript > Reactor > Tools > Show Comps Folder から開くことができます。

compファイルは、Windowsだと以下のフォルダにあると思います。

C:\ProgramData\Blackmagic Design\Fusion\Reactor\Deploy\Comps\Sprut

まずはデモファイルをいじってみるところからスタートしましょう!

compファイルには下図のようにQUICK START GUIDEや各ノードで何をしているのかなどの説明が記載されていますので、まずは一度読んでみることをお勧めします。書いてある内容結構面白いですよ^^

おさえておきたいポイント

Sprut2を使う上でおさえておきたいポイントを簡単にまとめます。

  1. まず初めにEllipseなどでお絵描きするときのブラシに相当するシェイプを作成する。大きさや色味にキーフレームを打って変化をつけることで最終的な結果に影響を及ぼすことが可能(ここで動きをつけることはできない)
  2. ツールの主要なパーツは以下のノード
    • SprutEmitter:前述のシェイプを受け取り、モーション(ベクター)を加えるノード。どのようにブラシを動かすかを定義する部分
    • SprutSolver:SprutEmitterから受け取った情報をレンダリングするノード。流体の粘度や速度、渦巻き度合いなど最終結果に影響を及ぼすパラメータ調整が可能
    • SprutInspect:ベクターの動きを可視化するツール(のよう)。Sprut2で得たい結果にはあまり影響しない気がするので本記事では詳細は割愛
  3. レンダリングするときはConsoleを表示させて、うまくいかないときはエラーの内容をチェック
  4. Color depthは「16 bit float per channel (64bit)」にしておく
    • File > Preferences > Frame Format > Color depth から設定可能
ひとまずこの辺りをチェックしておけばツールを利用する準備はOKです!(たぶん)

書道っぽい文字を作成する

それでは実際に、Sprut2Caractor.setting ファイルの結果を得るために行ったことを解説していきます。

ブラシを作成する

まずは動きのもとになるブラシを作成します。

といってもここでは難しいことは特に行っておらず、Ellipse -> Background -> BrightnessContrast の順にノードを接続してサイズや色を設定して、最後にGainを少し上げているだけです。

途中で軌跡の色を変えたい場合には、BackgroundのColorにキーフレームを打ったり、ColorCorrectorノードを追加して色や彩度に変化を加えることもできます。

ブラシの軌跡をEllipseで設定しようとしても最終結果には反映されませんのでご注意ください。動きをつけるのはSprutEmitterノードのCenterに対して設定する必要があります。

動きをつける(SprutEmitter)

続いて文字の形に沿って動きをつけていきます。

SprutEmitterのCenterに対して文字の軌跡のとおりに、一筆書きでキーフレームを打ちます。(地道な作業です^^)

何もない状態でキーフレームを打つのは難しいので、Text+ノードを背面に配置して文字を形どるようにまずは大枠を作成して、そのあと微調整するとやりやすいです。

キーフレームを打つ際は、Centerのパラメータを右クリック -> Animate から設定しています。フレームを少しずつ進めながら、大体のところで軌跡を打っていくとスムーズに進められます。

SprutEmitterノードの出力結果だけでは最終的にどのような出力が得られるかを確認できないため、結果を確認したいときは都度SprutSolverでレンダリングして確認する必要があります。(SprutSolverにつては後述します)

文字を書くスピードは一通り軌跡を設定し終わってからKeyframesメニューで間隔を広げたり狭めたりすれば調整できますので、はじめは細かいところまでは気にせず最後まで設定してしまいましょう。

SprutEmitterのCenterにキーフレームを打っただけだと、本来線を引きたくない箇所にも軌跡が作成されてしまうので、筆が離れる部分についてはSizeパラメータをゼロにしたり、筆圧の強弱をつけたい部分についてはSizeを大きくしたり小さくしたりとキーフレームを設定しています。

ちなみにKeyframesメニューを開くとたくさんのノードのキーフレームが表示されてしまい、目的の設定項目を探すのが大変だと感じることがあるかもしれません。

図のように、Keyframesのメニューから「Show Only Selected Tools」にチェックをつけると選択したノードのキーフレームだけが表示されるようになりますので、チェックをつけておくことをお勧めします。

Sprut2Caractor.setting ファイルでは、SprutEmitterの設定は基本的にデフォルトのままですが以下の設定を変更しています。(特に影響を及ぼすのはGlobal Multiplierです)

  • Global Multiplier:0.04
  • Random Type:Per X/Y
  • Random Scale:Relative To Velocity

レンダリングする(SprutSolver)

SprutEmitterで設定した軌跡や各種パラメータの結果をSprutSolverでレンダリングします。

SprutSolverについても、Sprut2Caractor.setting ファイルではデフォルトの設定で使用していますが、Render Rangeがレンダリングしたいフレーム数の範囲を示しているかを確認してから「Run Simulation」を実行します。

この範囲が大きくなっていると、指定したフレーム数すべてのレンダリングが完了するまで処理が継続されてしまいます。(Abort Renderをクリックすれば停止できます)

レンダリングにはそこそこ時間がかかります。コーヒーでも飲みながら待ちましょう。

ほぼデフォルトの設定ですが、Sprut2Caractor.setting ファイルはここまでの流れに沿って作成しています。

このツールにはたくさんのパラメータがあり設定値をいじると得られる結果が変わってきます。

パラメータに関する説明は各項目に設定されている[?]マークにカーソルを合わせると表示されますが、都度ここから確認するのも大変なので一覧で確認できるようにまとめました。興味のある方は引き続き次の項目までお付き合いください^^

各パラメータをチェック

SprutEmitterとSprutSolverの各パラメータ、パラメータの説明(英語)と和訳を一覧にしました。パラメータを変更することによる見た目の変化がどのようになるかについても併せて掲載しています。

ひとつずつパラメータを変更して結果を確認するのも大変なので、よければ参考にしてみてください。結構ボリューミーなので、最初から最後まで通しで見るというよりは気になったものだけ見てみるぐらいの感じでよいと思います^^

※和訳は翻訳ツールを使ったり、意訳していたりする部分もあるので正式な内容は英文の方をご確認ください。

以下のように記載していきます。

パラメータ説明
パラメータ名英文説明
和訳説明
★筆者コメント(ある場合)
パラメータ変更に伴う変化サンプル(ある場合)

SprutEmitterのパラメータ

Controlsメニュー

パラメータ説明
GlobalMultiplier
Multiplies the end result of the calculated vector values.
算出されたベクトル値の最終結果を乗算します。
★0にすると流体っぽさがなく、数値を増やすと流体感が増します。サンプルは文字を表現したかったため小さめの値(0.04)としていますが、原形をとどめる必要がない場合は大きくすると変化量が大きく面白い結果が得られるかもしれません。
EmitterTypeDetermines how the emitter inherits the Transform motion. Drag will push vectors out from the front of the emitter. Propel will push vectors out from the back of the emitter.
エミッターがどのようにTransformモーションを継承するかを決定します。Dragはエミッターの前方からベクターを押し出します。Propelはエミッターの後ろからベクターを押し出します。
★Dragにすると進行方向に対して順方向に、Propelにすると逆方向に伸びていくような感じになります。
VectorGenerationBuild vectors from scratch, or adjust vectors that are already present in the vector channels of the Shape Input. For example, a 3D render with motion vectors, or footage with Optical Flow data.
最初からベクターを作成したり、Shape Inputのベクターチャンネルにすでに存在するベクターを調整することができます。例えば、モーションベクターを使った3Dレンダリングや、オプティカルフローデータを使った映像などが挙げられます。
ViewOutput: the emitter shape in RGBA and motion vectors in the Velocity channels.
Velocity Field: view the calculated motion vectors.
Turbulence Field: view the Turbulence coming from the Turbulence Input.

Output: エミッタの形状をRGBAで、モーションベクターをVelocityチャンネルで表示します。
Velocity Field: 計算されたモーション ベクトルを表示します。
Turbulence Field: Turbulence Inputに入力されたTurbulenceを表示します。
TransformMotion from the Transform controls are translated into motion vectors. Currently only Center influences vectors.
Transformコントロールからのモーションは、モーションベクターに変換されます。現在、Centerのみがベクターに影響を与えます。
VelocityMultiplierMultiplier for the calculated motion vectors. Scales inherited and random motion, but not directional motion or turbulence.
計算されたモーションベクトルの乗数。継承された動きやランダムな動きをスケールしますが、方向性のある動きや乱流は含みません。
AddDirectionAdds an overall directional force to the emitter in X and/or Y.
エミッターにX/Y方向の総合的な力を加えます。
★Xの値で確認してみたところ、正の数だと左側、負の数だと右側方向の力が加えられるようです。
InheritVelocityHow much of the Transform Center motion is weighed in the vector calculations.
Transform Centerの動きを、ベクターの計算にどれだけ反映させるか。
★値を小さくするとCenterで設定した動きが与える影響が小さくなり、0にすると全く影響しなくなります。微調整するときに使えそうなパラメータ。
RandomDirectionXAdds random horizontal motion.
ランダムな水平方向の動きを追加します。
RandomDirectionYAdds random vertical motion.
ランダムな垂直方向の動きを追加します。
RandomProxyCalculates randomness every X pixels.
Xピクセルごとにランダム性を計算します。
RandomSeedAn arbitrary number used for calculating the generation of all random values. Handy for doing variations.
すべての乱数値の生成を計算するために使用される任意の数値です。バリエーションを行う際に便利です。
RandomTimeLockWhen turned off, a new random value is calculated for every time step, independently of other settings.
オフにすると、他の設定とは関係なく、時間ステップごとに新しいランダム値が計算されます。
RandomTypePer Frame: generates one random value per frame.
Per Pixel: randomizes every pixel – most random of randoms.
Per X/Y: randomizes horizontally and vertically, so random values will be equal in X or Y. Possible cross-hatch patterns, but lovely swirls.

Per Frame:フレームごとに1つのランダム値を生成します。
Per Pixel: すべてのピクセルをランダム化します。
Per X/Y: 水平方向と垂直方向にランダム化するので、ランダム値はXとYで等しくなります。クロスハッチパターンの可能性もありますが、美しい渦巻きになります。
RandomScaleControl whether the random values are controlled by the Random Direction inputs only. Relative To Velocity will result in larger random values when the emitter moves faster, and smaller when slower.
Random Direction入力のみでランダム値を制御するかどうかを制御します。
Relative To Velocityは、エミッターの動きが速いとランダム値が大きくなり、遅いと小さくなります。
AffectDensityMultiplies the color with the image in the turbulence input.
colorとturbulence入力のイメージを掛け合わせます。
TurbulenceMultMultiplies the turbulence values before they are added to the motion vectors.
モーションベクターに追加する前に、turbulence値を乗算します。

Settingsメニュー

UseGPUFu16To use GPU, or not to use GPU. That is the question.
GPUを使うのか、使わないのか。

SprutSolverのパラメータ

Controlsメニュー

パラメータ説明
TimeStepThe amount the vectors are warping the colors per frame. A value of 2 would double the speed of the motion, and a value of 0.5 would halve the speed.
ベクトルがフレームごとに色を歪める量です。値が2の場合は動きの速度が2倍になり、0.5の場合は速度が半分になります。
★説明のとおり、0.5と2.0の結果を比較してみます。↓のようになります。
ViewThe Sprut Solver output image setting. Post Sim
Output: raw sim plus settings from the Post Sim tab applied.
Velocity Field: the simulation motion vectors.
Fluid Turbulence: the image coming in from the Turbulence input.
Fluid Forces: the image coming in from the Force input.
Raw Sim: the unprocessed simulation render pass.

Output:rawのシミュレーションにPost Simタブの設定を適用したもの。
Velocity Field: シミュレーションの動きのベクトルです。
Fluid Turbulence::乱れの入力から得られるイメージ
Fluid Forces:力の入力から送られてくるイメージ。
Raw Sim:処理されていないシミュレーションのレンダリングパス。
StartEndThe frame range over which the simulation will be calculated.
シミュレーションの計算対象となるフレーム範囲です。
CacheFolderThe location on disk where simulation cache files will be saved. Sprut works by saving and reloading files inbetween frames. Make sure you have full read and write permissions to this location.
シミュレーションキャッシュファイルを保存するディスク上の場所です。Sprutはフレーム間でファイルの保存と再読み込みを行います。この場所に完全な読み取りと書き込みの権限があることを確認してください。
SolveNameThe file name prefix of the simulation cache files.
シミュレーションキャッシュファイルのファイル名のプレフィックス。
ViscocityViscocity is how much the fluid “sticks together”. A higher value equals more stickiness. Motion in fluid will drag more fluid around with it.
粘度とは、流体がどれだけ「くっついているか」ということ。数値が大きいほど粘りが強いことを意味します。流体に動きがあると、それに伴ってより多くの流体が引きずられます。
★TimeStep2.0で、Viscocity0.0と10.0で比較したところ確かにくっつき力が高まっているように見えます。正しいスペルは”Viscosity”のような気がします。
VelocityDissipationHow much the fluid slows down every frame.\nA value of 0.1 means a 10% reduction in velocity (speed).
フレームごとに流体がどれだけ遅くなるか。0.1の値は、速度(スピード)が10%減少することを意味します。
VelocityDiffusionHow much the speed of individual pixels will blend together every frame. Think of it as blurring the motion (which effectively this is).
個々のピクセルの速度が、フレームごとにどれだけ混ざり合うか。これは、動きをぼかすことだと考えてください。
DensityDissipationFancy words for making the colors darker. A value of 0.1 reduces the gain by 10% every frame in the simulation.
色をより濃くするためのFancy words。値が0.1の場合、シミュレーションの各フレームごとにゲインが10%ずつ減少します。
DensityDiffusionAlso fancy words, this time for how much the image will blur every frame. See also Velocity Diffusion.
画像がフレームごとにどのくらいぼやけるかを表すFancy wordsです。Velocity Diffusionも参照してください。
VorticityAmountVorticity is the “swirliness” of the fluids. Low vorticity will result in more linear “streams” of fluids.
Vorticityとは、流体の “渦 “のことです。Vorticityが低いと、流体の「流れ」がより直線的になります。
VorticityDiffusionHow much the swirlies will smoosh together per frame.
渦巻きがフレームごとにどれだけ混ざり合うか。
TurbulenceStrengthMultiplier for the Turbulence Image Input.
Turbulence Image Inputの乗数。
ForceStrengthMultiplier for the Force Image Input.
Force Image Inputの乗数。

Tweaksメニュー

パラメータ説明
ScaleEmitterVectorsScales the incoming Emitter motion vectors before simulation.
シミュレーションを行う前に、入力されるEmitterのモーションベクトルをスケーリングします。
VectorProxyDetermines the resolution grid of the fluid. The higher the value, the larger the steps used in calculating. Note that this will also result in the fluid “scale” being greater, creating larger and faster swirls.
流体の解像度グリッドを決定します。値が大きいほど、計算に使われるステップが大きくなります。これにより、fluidの「スケール」も大きくなり、より大きく、より速い渦巻きができることに注意してください。
DiffusionFilterThe filter used in any diffusion (blur) steps in the calculation.
拡散(ぼかし)計算のステップで使用されるフィルターです。
FilterMethodThe filter used in any scaling (supersampling, upscaling, proxy) steps in the calculation.
計算上のあらゆるスケーリング(スーパーサンプリング、アップスケーリング、プロキシ)のステップで使用されるフィルターです。
AccuracyThis deals mainly with the divergence step, how many there are, in which order… can be useful for variations on the same setup.
これは主にダイバージェンス・ステップを扱っており、いくつあるのか、どの順番なのか…同じ設定のバリエーションに役立つものです。
VectorAccumulationHow the motion vectors are combined between frames.
フレーム間での動きベクトルの合成方法。
ColorAccumulationHow the colors are combined between frames.
フレーム間の色の組み合わせ方。
SkipInitSkip rendering image cache placeholders before simulating.
シミュレーションの前にイメージキャッシュのプレースホルダーのレンダリングをスキップする。
FastInitRender only first and last frame image cache placeholders.
最初と最後のフレームのイメージキャッシュプレースホルダーのみをレンダリングする。
CompressCacheFilesUse DWA compression for the color channels of the image cache files.
イメージキャッシュファイルのカラーチャンネルにDWA圧縮を使用する。
SupersamplingRenders the fluid displacement at higher internal resolution, resulting in a cleaner, antialiased result. The final resolution stays the same.
流体の変位をより高い内部解像度でレンダリングし、アンチエイリアスのかかったきれいな結果を得ることができます。最終的な解像度は変わりません。
UpscalingRenders the final result at a higher output resolution. The neat thing about this is that this does not change the fluid properties. This way you can render beautiful, ultra high res versions of your low(er) resolution setup.
最終結果をより高い出力解像度でレンダリングします。この方法の良い点は、流体のプロパティを変更しないことです。これにより、低解像度の設定でも、美しい超高解像度バージョンをレンダリングすることができます。
RenderingProxyScaleProxy Scale setting for simulation rendering. Note that this may not accurately represent the full resolution result.
シミュレーション・レンダリングのプロキシ・スケール設定。ただし、フル解像度の結果を正確に表現できない場合があります。
RenderingHiQQuality setting for simulation rendering.
シミュレーションレンダリングの品質設定。
FreezeBelowXFreeze will stop the motion when it falls below a certain horizontal speed threshold.
フリーズは、水平方向の速度が一定の閾値を下回るとモーションを停止します。
FreezeBelowYFreeze will stop the motion when it falls below a certain vertical speed threshold.
フリーズは、一定の垂直方向の速度閾値を下回るとモーションを停止します。
DivergenceSpreadA slightly oddball setting. Divergence Spread allows for variations on the sim, not unlike the Accuracy setting above.
ちょっと変わった設定です。Divergence Spreadは、上記のAccuracy設定とは異なり、SIMのバリエーションを可能にします。
DivergenceBiasA slightly oddball setting. Divergence Bias allows for variations on the sim, not unlike the Accuracy setting above.
ちょっと変わった設定です。Divergence Biasは、上記のAccuracyの設定とは異なり、SIMのバリエーションを可能にします。
SimStagesThe individual simulation steps. Mostly used for debugging, but can be useful for understanding too, so I’ve left them in.
個々のシミュレーションステップです。主にデバッグに使用しますが、理解を深めるためにも有用なので、残してあります。

Post Simメニュー

パラメータ説明
AddSourceToOutputAdds the incoming Emitter to the rendered sim.
レンダリングされたSIMに、入力されたEmitterを追加します。
PreBlurVelocityBlurs the motion vectors before applying motion blur.
モーションブラーをかける前に、動きのベクトルをぼかします。
ClampVectorValuesAllows for limiting the vector value range, especially useful for vectors close to the source that can have very large values.
ベクトルの値の範囲を制限することができます。特に、非常に大きな値を持つ可能性のあるソースに近いベクトルの場合に便利です。
MotionBlurAmount of post motion blur applied to the sim.
シミュレーションに適用されるPost motion blurの量。
MethodThe direction in which the motion blur is applies. Because of how Fusion’s VectorMotionBlur node works, this does absolutely nothing right now.
モーション・ブラーを適用する方向です。FusionのVectorMotionBlurノードの仕組み上、今は何もしません。

Settingsメニュー

パラメータ説明
ApplyEffectMaskToRGBAApplies the Effect Mask input to the color channels.
入力されたEffect Maskをカラーチャンネルに適用します。
ApplyEffectMaskToVectorsApplies the Effect Mask input to the vector (motion) channels. This can effectively stop the motion.
ベクトル(モーション)チャンネルに入力されたEffect Maskを適用します。これにより、効果的にモーションを停止させることができます。
InvertEffectMaskInverts the incoming Effect Mask.
入力されたEffect Maskを反転させます。
EffectMaskOrderApplies the Effect Mask before or after the simulation. Applying it before the simulation may result in residual motion across the Effect Mask boundaries.
エフェクトマスクをシミュレーションの前または後に適用します。シミュレーションの前に適用すると、Effect Mask の境界を越えて残留するモーションが発生することがあります。
UseGPUFu16To use GPU, or not to use GPU. That is the question.
GPUを使うのか、使わないのか。

さいごに

本記事では書道っぽい文字をサンプルに話を進めましたが、流体感のあるエフェクトや、こちらの動画のように煙っぽい感じのクールな効果を得ることが本来のツールの活用方法としてはあっている気もしますので、自由に遊んでみていただけるといいのかなと思います!

↑のように複数のSprutEmitterによる出力を得るには、今後のバージョンで(たぶん)追加されるSprutEmitterMergeノードが必要ぽいので、2021年5月現在のバージョン2.11では実現できなさそうです。

We Suck Lessのパトロンになると、↑のcompファイルもダウンロードできるので興味のある方は登録してみてもよいかもしれません^^

ちなみにツールの中身を見てみようかなとも思ったのですが、結構モリモリだったので諦めました^^

以上です!