Fluid Simulation with Sprut2 !![Reactor]

As the second part of my project to play with the tools available from Reactor, I tried out “Sprut2, which allows you to get fluid simulation results.

The tool was originally created by Theodor Groeneboom for the compositing software Nuke, and was adapted for Fusion by Pieter, the administrator of We Suck Less.

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.


By the way, the Loop tool I introduced earlier was also created by Pieter. Pieter is amazing!

With Sprut2, you can get wave-like, vortex-like, and ink-in-water effects like this. It’s cool!

I would love to use this! But I couldn’t find many websites or videos that explained how to use the tool, so I compiled a list of what I tried. I hope this will give you a chance to try it out.

It is better to use this tool in the standalone Fusion instead of DaVinci Resolve, because it is very slow and crashes when used in DaVinci Resolve.

It may depend on your environment, but even We Suck Less commented that it’s better to use Fusion, so try it with Fusion!

If you are wondering what Reactor is and how to install it, refer to the following article!

What you can do with Sprut2

I decided to make something to start with, so I made a fireball like below…

I also tried to create a calligraphic style with wobbling trails. I think it turned out pretty good.

You can download the settings files for each of them from here.

If you hope to use the comp file, can download from here.

In this article, I will explain how to use Sprut2 using a sample Settings file (Sprut2Caractor.setting) that produces calligraphy-like results, and check the parameters and their meanings in the latter part of the article.

It’s not really a tool for writing, so it may not be the most appropriate subject, but I would appreciate it if you like this article.

Check the composition of Sprut2 from the demo comp file

When you install Spurt2, a demo comp file will be downloaded, and you can open the comp file from Script > Reactor > Tools > Show Comps Folder.

The comp file can be found in the following folder on Windows.

C:ProgramDataBlackmagic DesignFusionReactorDeployCompsSprut

Let’s start by messing around with the demo files!

The comp file contains the QUICK START GUIDE and an explanation of what each node is doing, as shown in the figure below. The contents of the file are quite interesting.

Points to keep in mind

The following is a brief summary of points to keep in mind when using Sprut2.

  1. The first step is to create a shape that corresponds to a brush for painting in Ellipse. You can influence the final result by adding keyframes to change the size and color (you cannot add movement here).
  2. The main parts of the tool are the following nodes
    • SprutEmitter:A node that takes the aforementioned shape and adds motion (vectors) to it. The part that defines how to move the brush.
    • SprutSolver:A node that renders the information received from SprutEmitter. It is possible to adjust parameters that affect the final result, such as fluid viscosity, velocity, and degree of vortex.
    • SprutInspect:This is a tool to visualize the movement of vectors, but I don’t think it will affect the results you want to get with Sprut2, so I won’t go into details in this article.
  3. When rendering, show Console and check the error content if it doesn’t work.
  4. Color depth should be set to “16 bit float per channel (64bit)”.
    • Can be set from File > Preferences > Frame Format > Color depth
If you check these out, you’ll be ready to use the tool! (Probably)

Create calligraphy-like characters

Now, let me explain what I actually did to get the result of the Sprut2Caractor.setting file.

Create a brush

The first step is to create a brush that will be the basis of the movement.

We just connect the nodes in the order Ellipse -> Background -> BrightnessContrast, set the size and color, and finally increase the Gain a little.

If you want to change the color of the trajectory along the way, you can hit a keyframe in the Background’s Color, or add a ColorCorrector node to change the color and saturation.

Please note that if you try to set the trajectory of the brush in Ellipse, it will not be reflected in the final result. You need to set the motion to the Center of the SprutEmitter node.

Adding the motion (SprutEmitter)

The next step is to add motion along the shape of the letters.

Set the keyframe to the center of the SprutEmitter in a single stroke, following the trajectory of the character. (This is a bit steady process)

It is difficult to create keyframes when there is nothing to work with, so it is easier to place a Text+ node on the back to create a rough outline of the text, and then make minor adjustments later.

When hitting keyframes, I set the parameters for Center from right-click -> Animate. While advancing the frame little by little, you can hit the trajectory at the approximate point to make it smooth.

Since the output of the SprutEmitter node is not enough to check the final output, it is necessary to use SprutSolver to render and check the result each time you want to check the result. (The SprutSolver will be described later)

You can adjust the writing speed by widening or narrowing the spacing in the Keyframes menu after you have finished setting the trajectory, so don’t worry about the details at first.

If you just put a keyframe in the center of the SprutEmitter, it will also create trails in areas where you don’t want to draw lines.

Therefore, I set the Size parameter to zero for areas where the brush will be separated, and I set the keyframes to increase or decrease the Size for areas where I want to add strong or weak brush pressure.

By the way, when you open the Keyframes menu, you will see many keyframes for many nodes, and you may find it difficult to find the setting you want.

As shown in the figure, it is recommended to check the “Show Only Selected Tools” checkbox in the Keyframes menu so that only the keyframes of the selected node will be shown.

In the Sprut2Caractor.setting file, the SprutEmitter settings are basically left at their defaults, but the following settings have been changed. (Global Multiplier is the one that is particularly affected.

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

Rendering (SprutSolver)

The results of the trajectory and various parameters set by SprutEmitter will be rendered by SprutSolver.

For SprutSolver, I also use the default settings in the Sprut2Caractor.setting file, but make sure that the Render Range indicates the range of frames you want to render before running “Run Simulation”.

If this range is too large, the process will continue until all the specified number of frames have been rendered. (You can stop it by clicking “Abort Render”)

The rendering process will take some time. Let’s wait while drinking coffee.

Almost the default setting, but the Sprut2Caractor.setting file has been created along the way so far.

There are many parameters in this tool, and tweaking the setting values will change the results you get.

The explanation of each parameter is displayed by hovering the cursor over the [?] mark on each item, but since it is too much work to check them from here, I have compiled them in a list. If you are interested, please continue to the next section.

Check each parameter

This section lists each parameter of SprutEmitter and SprutSolver, and the explanation of each parameter. It also shows how the appearance changes when the parameters are changed.

It’s not easy to change the parameters one by one and check the results, so please refer to this page if you like. It’s quite voluminous, so it’s better to just look at the ones that interest you rather than going through them from beginning to end.^^


Parameter nameDescription
*Author’s comments (if any)
Sample output for parameter changes (if any)

Parameters of SprutEmitter

Controls menu

Multiplies the end result of the calculated vector values.
*If you set the value to 0, there is no fluid-like effect, and if you increase the value, the fluid-like effect increases. In the sample, we used a small value (0.04) to represent the text, but if you don’t need to keep the original shape, you can increase the value to get interesting results with a large amount of change.
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.
*If you set it to “Drag,” it will stretch in the forward direction, and if you set it to “Propel,” it will stretch in the reverse direction.
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.
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.
TransformMotion from the Transform controls are translated into motion vectors. Currently only Center influences vectors.
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.
*I checked the value of X, it seems that a positive number applies a force in the left side direction, and a negative number applies a force in the right side direction.
InheritVelocityHow much of the Transform Center motion is weighed in the vector calculations.
*The smaller the value, the less the effect of the movement set in Center.
If you set it to 0, it will have no effect at all. This parameter can be used for fine tuning.
RandomDirectionXAdds random horizontal motion.
RandomDirectionYAdds random vertical motion.
RandomProxyCalculates randomness every X pixels.
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.
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.
AffectDensityMultiplies the color with the image in the turbulence input.
TurbulenceMultMultiplies the turbulence values before they are added to the motion vectors.

Settings menu

UseGPUFu16To use GPU, or not to use GPU. That is the question.

Parameters of SprutSolver

Controls menu

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.
*As explained, let’s compare the results for 0.5 and 2.0. The result is as shown in below.
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.
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.
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.
*When I compared Viscosity 0.0 and 10.0 in TimeStep 2.0, it seems that the sticking power is indeed increased. I think the correct spelling is “Viscosity”.
VelocityDissipationHow much the fluid slows down every frame.nA value of 0.1 means a 10% reduction in velocity (speed).
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.
DensityDiffusionAlso fancy words, this time for how much the image will blur every frame. See also Velocity Diffusion.
VorticityAmountVorticity is the “swirliness” of the fluids. Low vorticity will result in more linear “streams” of fluids.
VorticityDiffusionHow much the swirlies will smoosh together per frame.
TurbulenceStrengthMultiplier for the Turbulence Image Input.
ForceStrengthMultiplier for the Force Image Input.

Tweaks menu

ScaleEmitterVectorsScales the incoming Emitter motion vectors before simulation.
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.
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.
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.
DivergenceBiasA slightly oddball setting. Divergence Bias allows for variations on the sim, not unlike the Accuracy setting above.
SimStagesThe individual simulation steps. Mostly used for debugging, but can be useful for understanding too, so I’ve left them in.

Post Sim menu

AddSourceToOutputAdds the incoming Emitter to the rendered sim.
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.
MethodThe direction in which the motion blur is applies. Because of how Fusion’s VectorMotionBlur node works, this does absolutely nothing right now.

Settings menu

ApplyEffectMaskToRGBAApplies the Effect Mask input to the color channels.
ApplyEffectMaskToVectorsApplies the Effect Mask input to the vector (motion) channels. This can effectively stop the motion.
InvertEffectMaskInverts the incoming 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.
UseGPUFu16To use GPU, or not to use GPU. That is the question.

At the end

In this article, I used calligraphic characters as a sample, but I feel that fluid effects and cool smoky effects like the one in this video are more appropriate ways to use the tool, so I hope you’ll feel free to play around with it!

The SprutEmitterMerge node, which will probably be added in a future version, is needed to get the output of multiple SprutEmitters as shown in the above, so it is not likely to be possible in the current version 2.11 as of May 2021.

If you become a patron of We Suck Less, you can also download the comp files shown above, so you may want to register if you are interested.^^

By the way, I thought about taking a look at the contents of the tool, but it was quite complicated, so I gave up.

That’s all!!