Managed to make some good progress with the maths behind volumetric distortion to create 'tendrils' from a volume captured using the Smoke2EXR add-on. Here's an animated image (sorry, not very high quality) - I'll be refining this and will write a more detailed post (along with the maths) in due course. Rendered using Eevee.
The nodes to distort the volume were created using the Node Expressions add-on using the following expression text :
# Extract the coordinates
_x = Vector[x] - Offset[x]
_y = Vector[y] - Offset[y] - YThreshold
_z = Vector[z] - Offset[z]
#Stretch coordinates as we move away from the threshold to spread out the tendrils
_xzScaling = (_y < 0) * (abs(_y) * XZScalingFactor{1}**XZScalingPower{0.5}) + 1
# Scale the coordinates to produce stretching
_x2 = _x/_xzScaling
_y2 = _y
_z2 = _z/_xzScaling
# Apply noise to the coordinates by an amount proportional to abs(_y) to distort the tendrils
_distortion[] = vmult(vsub(noise(combine(_x+NoiseOffset[x], _y+NoiseOffset[y], _z+NoiseOffset[z]),DistortionScale), 0.5), DistortionFactor)
_x3 = _x2 + _distortion[x] * (abs(min(_y, 0))**DistortionPower)
_y3 = _y2
_z3 = _z2 + _distortion[z] * (abs(min(_y, 0))**DistortionPower)
_yOffset = (_y3 < 0) * _y3 * min(1,vsub(noise(combine(_x3,0,_z3),NoiseScale,0),NoiseBias{0.5})*StretchFactor) **NoisePower
Output[] = combine(_x3, _y3 - _yOffset +YThreshold, _z3)
Comments