Cartoon ripple particles .... particle age controlling

I think @skuax is on the right track…and you could do that just with the wave modifier…

1 Like


Did it by shader, combined with a particle system, as expected.
It’s a little bit messy… but it works.

Droplets_on_water_shader.blend (950.1 KB)


edit1: But i’m not sure if it was for raindrop effect…


Wow that’s quite a node tree! I’ll look into that and see if I can use it.

gonna change the download link for a commented version. wait few seconds

edit1: done

I was actually thinking of having the ripples as their own object, and those be particles, then I can have them be generated by objects that cross the surfice of the water like ducks and waterlilies.
I was planning for hand-drawn ripples with some wobble and dissapear into dots rather than fade… but I think I can do this with the nodetree you have created. Anyway - thankyou! you should send this to BNPR people!

The goal was not very clear for me at the beginning. You are right, it should be easy to tweak it for your needs. Perhaps BNPR peoples should visit Skuax’s hideout sometime… :slight_smile:
i ll search if they have a post here. I’m focusing on blender artist’s forum to keep it the best place for blender’s tricks and informations.
anyway, it’s a pleasure to help and scratching my head.

You might want to look at this by CG GEEK…and pull some of the information in it to apply to the effect you need…

Cool technique, but really expensive in texture’s memory occupation.
interesting if you want to watch commercial announcement for stuffs you don’t need… :slight_smile:

Your method works by spawning particles on a surface? Or does it detect falling particles crossing the surface by use of dynamic paint?

it spawns it randomly on surface. there is no use of dynamic paint.
it could be done by moving the texture coordinates by an object position transferred by driver.
and also multiplying the radial rings, but by the end it should be expensive.

So, if you are not doing a closeup shoot in slow-motion for a simulation film about how rain is acting on a wet surface… it should be enough. :slight_smile: (it was intended to be used in a cartoon style at the beginning of the post)

1 Like

Cool, thanks.

Yeah…Creating the Wet Maps to a directory can add in a massive load of images…but at least they are B/W so not too large of a file…
I just checked and the one I did for Raindrops on a Face each map is a little over 1meg each x 150 1k .pngs Aackk!

There’s no way to link a grease pencil anim frame number to particle age then?

By shader, as said before, the particle age doesn’t work with eevee.
perhaps in python?
perhaps by attribute in the future of geometry/particle node system, i guess.

This is the sort of thing I could have done in the game engine… every 20 frames teliport this object to this object (the place the ripples start) … and it ties into the ripple’s loop point.

The wetmap meathod could work well - shame I can’t just export a video as they can be a lot smaller.

teleporting an object every 20 frames is not a problem with drivers. the problem is more about resetting the animation. you’ll have to cycle it with curve editor modifiers or using NLA loops.

not sure to understand…

… hmmmmm … so I can have an object leap to another object’s posision every 20 frames with drivers? I dabble in drivers a fair bit but I’m not sure how I’d do that.That sounds like what I want to do… I can handle getting the animation to loop no problem.

I’m guessing the driver line would read

xpos if ( #frame % 20 ) = 0 else …

but somehow that … has to mean don’t move…

let’s do it in python…

import bpy
import random

# you can change the name object here or name your object plane
# if there is no object named "plane" it'll create one
if not 'Plane' in

# every frame change, this function is called.
def my_handler(scene):
    frame = scene.frame_current
    # here is the step looking for multiple of 25
    if frame % 25 == 0:
        x = random.randrange(-10,10) #the range in blender Unit the object ll move
        y = random.randrange(-10,10)
        z = 0.0
        ob ="Plane") #creating a brand new name for the object
        ob.location = (x, y, z) #positioning the object