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.
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.www.steakunderwater.com
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.
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.
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.
- 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).
- 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.
- When rendering, show Console and check the error content if it doesn’t work.
- Color depth should be set to “16 bit float per channel (64bit)”.
- Can be set from File > Preferences > Frame Format > Color depth
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
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”)
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.＾＾
*Author’s comments (if any)
Sample output for parameter changes (if any)
Parameters of SprutEmitter
|GlobalMultiplier||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.
|EmitterType||Determines 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.
|VectorGeneration||Build 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.|
|View||Output: 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.
|Transform||Motion from the Transform controls are translated into motion vectors. Currently only Center influences vectors.|
|VelocityMultiplier||Multiplier for the calculated motion vectors. Scales inherited and random motion, but not directional motion or turbulence.|
|AddDirection||Adds 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.
|InheritVelocity||How 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.
|RandomDirectionX||Adds random horizontal motion.|
|RandomDirectionY||Adds random vertical motion.|
|RandomProxy||Calculates randomness every X pixels.|
|RandomSeed||An arbitrary number used for calculating the generation of all random values. Handy for doing variations.|
|RandomTimeLock||When turned off, a new random value is calculated for every time step, independently of other settings.|
|RandomType||Per 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.
|RandomScale||Control 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.|
|AffectDensity||Multiplies the color with the image in the turbulence input.|
|TurbulenceMult||Multiplies the turbulence values before they are added to the motion vectors.|
|UseGPUFu16||To use GPU, or not to use GPU. That is the question.|
Parameters of SprutSolver
|TimeStep||The 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.
|View||The 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.
|StartEnd||The frame range over which the simulation will be calculated.|
|CacheFolder||The 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.|
|SolveName||The file name prefix of the simulation cache files.|
|Viscocity||Viscocity 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”.
|VelocityDissipation||How much the fluid slows down every frame.nA value of 0.1 means a 10% reduction in velocity (speed).|
|VelocityDiffusion||How much the speed of individual pixels will blend together every frame. Think of it as blurring the motion (which effectively this is).|
|DensityDissipation||Fancy words for making the colors darker. A value of 0.1 reduces the gain by 10% every frame in the simulation.|
|DensityDiffusion||Also fancy words, this time for how much the image will blur every frame. See also Velocity Diffusion.|
|VorticityAmount||Vorticity is the “swirliness” of the fluids. Low vorticity will result in more linear “streams” of fluids.|
|VorticityDiffusion||How much the swirlies will smoosh together per frame.|
|TurbulenceStrength||Multiplier for the Turbulence Image Input.|
|ForceStrength||Multiplier for the Force Image Input.|
|ScaleEmitterVectors||Scales the incoming Emitter motion vectors before simulation.|
|VectorProxy||Determines 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.|
|DiffusionFilter||The filter used in any diffusion (blur) steps in the calculation.|
|FilterMethod||The filter used in any scaling (supersampling, upscaling, proxy) steps in the calculation.|
|Accuracy||This deals mainly with the divergence step, how many there are, in which order… can be useful for variations on the same setup.|
|VectorAccumulation||How the motion vectors are combined between frames.|
|ColorAccumulation||How the colors are combined between frames.|
|SkipInit||Skip rendering image cache placeholders before simulating.|
|FastInit||Render only first and last frame image cache placeholders.|
|CompressCacheFiles||Use DWA compression for the color channels of the image cache files.|
|Supersampling||Renders the fluid displacement at higher internal resolution, resulting in a cleaner, antialiased result. The final resolution stays the same.|
|Upscaling||Renders 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.|
|RenderingProxyScale||Proxy Scale setting for simulation rendering. Note that this may not accurately represent the full resolution result.|
|RenderingHiQ||Quality setting for simulation rendering.|
|FreezeBelowX||Freeze will stop the motion when it falls below a certain horizontal speed threshold.|
|FreezeBelowY||Freeze will stop the motion when it falls below a certain vertical speed threshold.|
|DivergenceSpread||A slightly oddball setting. Divergence Spread allows for variations on the sim, not unlike the Accuracy setting above.|
|DivergenceBias||A slightly oddball setting. Divergence Bias allows for variations on the sim, not unlike the Accuracy setting above.|
|SimStages||The individual simulation steps. Mostly used for debugging, but can be useful for understanding too, so I’ve left them in.|
Post Sim menu
|AddSourceToOutput||Adds the incoming Emitter to the rendered sim.|
|PreBlurVelocity||Blurs the motion vectors before applying motion blur.|
|ClampVectorValues||Allows for limiting the vector value range, especially useful for vectors close to the source that can have very large values.|
|MotionBlur||Amount of post motion blur applied to the sim.|
|Method||The direction in which the motion blur is applies. Because of how Fusion’s VectorMotionBlur node works, this does absolutely nothing right now.|
|ApplyEffectMaskToRGBA||Applies the Effect Mask input to the color channels.|
|ApplyEffectMaskToVectors||Applies the Effect Mask input to the vector (motion) channels. This can effectively stop the motion.|
|InvertEffectMask||Inverts the incoming Effect Mask.|
|EffectMaskOrder||Applies the Effect Mask before or after the simulation. Applying it before the simulation may result in residual motion across the Effect Mask boundaries.|
|UseGPUFu16||To 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.