Scatter 🌱 [The Scattering Tool of blender 2.8]

Hello and welcome to Scatter main thread ! :seedling:

Feel free to report bugs to me via MP, talk about anything Scattering related, ask questions (not covered from the tutorial video series), requests stuffs… ect…

Blender Market: https://www.blendermarket.com/products/scatter


Updates:

Updates 1.1 work in progress:

  • Scrollable interface implementation (with some renaming option)
  • An operator to delete a proxy system
  • Better particle position editing
  • Rest of B01

Videos / Tutorials:

Trailers:

Release Trailer

Tutorials:

01- Installation
02- Basic Scattering
03- Managing Biomes
04- Parameters
05- Camera Clipping


Avaible Biomes:

B01: bundled with the addon

Featuring 11 aio biomes composed with 16 different separate layers.


ps: This topic is also a work in progress topic from the very beginning, you can scroll through Scatter development starting at the posts belows

Original First post:

Hello.
I spend maybe 4 hours this morning working on this meadow (only shading and particles)
i just want to make a topic speaking about the subject

After reading this article here below tried my best to recreate this exact scene in blender.
https://cgtricks.com/making-meadow-darstellungsart/

And this is the result:

Important steps:

  1. have a bunch of different variety of grasses/leaves/clovers… ect
  2. make sure to have different models of your grass, some in clusters, in different sizes and radius.
  3. make sure the terrain is naturally displaced and not flat.
  4. use a grass texture with little roots and different tones of grasses for the base plane.
  5. make sure that the material and translucency of your grass is accurate
  6. the material of the grass need to be wet enoug. 0.4 roughness is perfect for this scene
  7. Distribute your differents grasses models with a cluster map like this below using procedural black and white texture
  8. Tweak the material of the grass with a procedural texture, so that you can have different shade of green/yellow/dead grass tones, get rid of uniform colors. For the aldebeo AND translucency.
  9. in your scene always have some shadow to give this grass some relief

and its done.

While addons like graswald or grass-essential do excellent work for the grass material and model, there’s still a lot of work to do for clustering the different species with various clustering maps, reworking the material for color variation, and a lot features forest pack like missing.

i’d really like to see an addon that can do that within blenders

Edit*
so let’s do it !


54 Likes

I’m curious as to what you mean by ‘reworking the material for color variation’ because graswald does have things I would suggest are of that nature.

As for clustering, I have been thinking of a way to procedurally generate vertex groups that I think would be really powerful in controlling distributions. But being able to do things directly with textures is also powerful in it’s own right. I’ll definitely need to make a few scenes and experiment before I have a concrete idea of what options are good and how to integrate it into a system like graswald—because unless you can simplify the texturing system or provide new functionality, there is little point in copying the settings to a different panel imo.

But I like that you are bringing this up, it’s a good topic for discussion.

On that note, any settings you found particularly interesting?

4 Likes

Looks pretty good. Want to share grass translucency values (or ranges) you used in this shader?

2 Likes

I was speaking of this

I don’t remember graswald having’ this ? But it’s easy to do. The problematic Part is the automatic cluster distribution.

I already tried to do an automatic cluster distribution code based on pre created texture set on global. It’s a really simple code but I hope it can help you. I’ll share it later this evening.

Seems like a bad idea. An automatic creation of various cluster maps with a texture seems more volatile. It doesn’t have any geometrical requirements. Could be used for flat surface and be re-used once the texture is present in the scene.

1 Like

I meant for effects like: leaves cluster around tree objects, plants shy away from shade, etc: things that depend on other geometry in the scene.

Ok, I have an idea on how to automate that, I’ll explore it’s feasibility.

Graswald currently has a dead patches property which does that, but has few customization options

1 Like

woaw quite advance features, good luck.

@Yukon @KareemAlgalaly this is the code and a quick demo + .blend file demo to download to download quickly via wetransfer ->HERE https://we.tl/t-N8Qi0loakv

import bpy

context = bpy.context
scene = context.scene
A = context.object

def find_collection(context, item):
    collections = item.users_collection
    if len(collections) > 0:
        return collections[0]
    return context.scene.collection

def make_collection(collection_name, parent_collection):
    if collection_name in bpy.data.collections:
        return bpy.data.collections[collection_name]
    else:
        new_collection = bpy.data.collections.new(collection_name)
        parent_collection.children.link(new_collection)
        return new_collection
        
i = 1
pref = "%s Grass Particles " % A.name

name = "%s%d" % (pref, i)
while A.modifiers.get(name):    
    i += 1
    name = "%s%d" % (pref, i)

A.select_set(state=False)

for o in bpy.context.selected_objects:
    o_collection = find_collection(bpy.context, o)
    new_collection = make_collection(name , o_collection)
    new_collection.objects.link(o)
    o_collection.objects.unlink(o)
    
A.select_set(state=True)

m = A.modifiers.new(name, type='PARTICLE_SYSTEM')
ps = m.particle_system
ps.name = name
ps.settings.name = name
ps.settings.type = 'HAIR'
ps.settings.render_type = 'COLLECTION'
ps.settings.instance_collection = bpy.data.collections[name]
ps.settings.particle_size = 0.25
ps.settings.size_random = 0.35

ps.settings.use_advanced_hair = True
ps.settings.use_rotations = True
ps.settings.rotation_factor_random = 1
ps.settings.phase_factor = 1
ps.settings.phase_factor_random = 2

if bpy.context.active_object.name +  " Grass Particles 1" in A.modifiers:
    if  bpy.context.active_object.name +  " Grass Particles 2" not in A.modifiers:
        ps.settings.texture_slots.add().texture = bpy.data.textures["Grass Particle 1"]
        ps.settings.texture_slots[0].blend_type = 'MULTIPLY'
        ps.settings.texture_slots[0].use_map_time = False
        ps.settings.texture_slots[0].use_map_density = True
        ps.settings.texture_slots[0].scale[1] = 0.4
        ps.settings.texture_slots[0].scale[2] = 0.4
        ps.settings.texture_slots[0].scale[0] = 0.4
        ps.settings.texture_slots[0].texture_coords = 'GLOBAL'

if bpy.context.active_object.name +  " Grass Particles 2" in A.modifiers:
    if  bpy.context.active_object.name +  " Grass Particles 3" not in A.modifiers:
        ps.settings.texture_slots.add().texture = bpy.data.textures["Grass Particle 2"]
        ps.settings.texture_slots[0].blend_type = 'MULTIPLY'
        ps.settings.texture_slots[0].use_map_time = False
        ps.settings.texture_slots[0].use_map_density = True
        ps.settings.texture_slots[0].scale[1] = 0.4
        ps.settings.texture_slots[0].scale[2] = 0.4
        ps.settings.texture_slots[0].scale[0] = 0.4
        ps.settings.texture_slots[0].texture_coords = 'GLOBAL'
        
if bpy.context.active_object.name +  " Grass Particles 3" in A.modifiers:
    if  bpy.context.active_object.name +  " Grass Particles 4" not in A.modifiers:
        ps.settings.texture_slots.add().texture = bpy.data.textures["Grass Particle 3"]
        ps.settings.texture_slots[0].blend_type = 'MULTIPLY'
        ps.settings.texture_slots[0].use_map_time = False
        ps.settings.texture_slots[0].use_map_density = True
        ps.settings.texture_slots[0].scale[1] = 0.4
        ps.settings.texture_slots[0].scale[2] = 0.4
        ps.settings.texture_slots[0].scale[0] = 0.4
        ps.settings.texture_slots[0].texture_coords = 'GLOBAL'

It was more of a quick test than anything else, it need thoses four scatter textures present within the .blend. and it will create automatically only but 3 particles system clustered across the geometry with the textures.

By creating the procedural map within the code and by automatically creating n number of particle system depending on the selection (witouth the active object) it could work for graswald ?

I don’t know if this can help you in your research ? I wish you good luck, clustering the particles in blender is a pain i hope we will find an easy way to do so one day.

11 Likes

If you’re incorporating this in graswald then look at how forestpack does this. They also use textures like BD3D suggests. The problem with vertex group clusters is that it will depend on a highpoly surface being populated with your clusters. Being able to populate it on every surface (single poly or highpoly) is a must, it should not be dependend of the polycount. It should work the same on every surface, same density of particles and same pattern, across all surfaces in your scene that have this cluster aplied to.

The example DB3D showed is very promising!

This workflow with grass patches would be awesome as it will be usable on bigger surfaces also. A bigger patch of grass in one particle will make the viewport more responsive. I’ve tested it and it works as a charm even on huge terrains.

Is it possible to have your cluster pattern detect edges? Like stop 40cm away from the edge of the surface ? In sketchup there is the skatter plugin who solves the problem of patches on big surfaces by dividing the grass in two particle system, one with a very small patch of grass (like 10cm circle) for the border of the lawn near the edge of the surface and then one for the rest with a bigger grasspatch (like 50cm large).

If you don’t do this you’ll either have grass patches overflowing in areas where there should be no grass or have jagged edges where grass is missing.

3 Likes

Is it possible to have your cluster pattern detect edges?

i don’t know if it is possible to do this within the old texture editor. This thing is a pain, it need to be replaced with the cycles node editor… seriously. …

Is there a way to do it within this editor ?

If you don’t do this you’ll either have grass patches overflowing in areas where there should be no grass or have jagged edges where grass is missing.

True

If you’re incorporating this in graswald then look at how forestpack does this.

could you elaborate ? i’d really like to understand how forest pack work, unfortunately i’m not allowed to use 3ds max due to allergies.

I also dream of an automatic multi species one click to set up grass clustering tool. @KareemAlgalaly let me know if i can help, im new to python but if i can help, tell me.

2 Likes

Sorry I looked back at it and it’s not the clusters but the distribution of the particles that are based on maps (I don’t know on what the clusters are based)

see this video
https://vimeo.com/60241623

I don’t use max myself so I only saw the feature from the videos or from the small trial I did a couple of months ago but from what I saw it’s super powerful and flexible. Look at the other features if you want some inspiration, it’s crazy how good that forestpack plugin is. I wish they made a blender version of it.

2 Likes

yes that’s what i meant by clustering the particles

Agree.

But i feel like it’s quite over complex for just clustering some vegetations ? A simple version could be done in blender with less of an headache.

1 Like

Like this one for exampe

https://www.youtube.com/watch?v=LLw_RTSTcVs

2 Likes

indeed that’s a really great example.
The only problem is that proxies for blender are not here yet.

1 Like

I really appreciate your effort guys, having distribution maps in Graswald would be so awesome.
A proxy system is what I am missing as well. You might want to check out this script which I use as a workaround for now

3 Likes

Really nice ! Could the vertex clouds have colors ?

1 Like

Okay, i got a tons of ideas for a scattering tool for blender.

Ideas like a custom homemade proxy system, automatic two click particles distribution with fully customizable parameters slots, if pablo remesher will be in the modifier stack soon I also could do an automatic terrain displacement + custom settings and slots.

This Could be a killer addon. I’ll start today.

1 Like

That’s my biggest problem with the script. While performance increase is surprisingly good, readability suffers with increasing amounts of particles. I’ve been searching a solution but that will most likely have to be hard coded in the ‘loose points’ draw code.

I have no idea how to achieve that:sweat_smile:

2 Likes

Maybe ask on the blender stack exchange ? :slightly_smiling_face:

I did :slight_smile: but apparently it’s for questions about usage and python coding, not about blender’s source code. On devtalk I’m still hoping for someone to answer. Maybe I also give it a try in the developer chat :smiley:

ahah i’ll add a 50$ reward for the response in a month if there’s nothing new with it.

It could be a dream to have this kind of point cloud inside of blender, by the way isn’t it in brecht to do list ?

4 Likes

Well, then let’s make it 100$ for a good response :joy:

As far as I know, the last proposal about a proper proxy system on right-click select was declined. Brecht mentioned that alembic and USD integration could handle that and much more but don’t ask me how.

About a week ago, I proposed point cloud display myself to have that at least.
If I’d know how I would try it myself.

3 Likes