Scatter 🌱 - The Scattering Tool of blender 2.8

Hello and welcome to Scatter main thread ! :seedling:

Feel free to

  • report bugs.
  • talk about anything Scattering related.
  • ask questions (not covered from the tutorial video series);
  • requests stuff.
  • ect…

Gumroad:

Blender Market:


📺 Videos / Tutorials:

Trailers:

Trailer

(old) Teaser
(old) Trailer

Tutorials:

How to use Proxify the proxy system of Scatter?

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

Youtube:

CGMatter
Bone-Studio Livestream
Grant Abbitt


🚧 Changelogs:

Update Season1

  • Added 4 new Scattering Presets (1 new simple blue preset and 3 new black presets dedicated for scattering small object like Assets from Grass Essentials for example)
  • Added 1 New fresh-cut lawn biome. (+3 new winter biomes if you missed the Christmas special event)
  • Added 10 ground Materials in the manager.
  • Overall way better UI experience (new color system, scroll bar, icons, panel organization, buttons).
  • New Biome manager categories, choose what you’d like to see between an AIO, layers, material, assets, or everything.
  • New Biome manager hides/lower display percentage/toggle proxy on creation options.
  • Compatibility with Graswald systems. (enable the export panel in preference, if you have GW)
  • The old Proxy system of Scatter is now a standalone universal addon called “Proxify” that can also generate proxy and work with animations, will also add the option to remove a proxy. Proxify is integrated in Scatter Tweaking panel, but can also be found in object>viewport display for more accurate operations/tweaks.
  • New statistic tab, quickly generates an information sheet of all the Scatter particle systems of the scene with info of Particle count and polycount per particles.
  • Enabled Preset and Biome user Creation.
  • New Terrain tools, easily use or generate terrain using a heightmap, get a clean border in a few clicks, or add procedural noises easily. (see above).
  • Better and easy to use grooming tools.
  • Better Viewport particle position accuracy. (see above) that also give accurate refresh when moving a boolean curve or camera that is clipping/culling the particles.
  • Material optimization when Scatter models are appended. (material instancing not support by blender appending)
  • New particle Scale slider.
  • Rework of some assets and materials.
  • Added support for batch rename, delete, redraw, select/deselect all.
  • New extra tools for quickly batch changing the selected object origin
  • Support for multi scenes workflows.
  • Added (batch) multiply or divide particle count by a custom number

🌳 Available Biomes:


⚠️ Known Issues/Limitations:

Slow-downs
Working with a lot of particles is still difficult for blender, while scatter propose a lot of solutions to help with this problem, you will most likely experience slowdowns. But that is normal. slowdowns when working with any high polycount is something expected, not from scatter, nor blender, but any 3D softwares what so ever.

Bad terrain topology
Some tools and operations in Scatter assume that terrain have a good topology. for example the purple array scattering presets are design to work with a grid-like topology.
You obviously cannot expect tools using vertex-weights working correctly on bad Terrains topology, for example, camera clipping, particle painting, and boolean curve will all need vertices equaliy dispersed within your terrain in order to work correctly. Having a good terrain topology is expected in any industry fields. a bad terrain topology ( a big ngon, or badly triangulated terrain ) will cause troubles for any artists, not only within the context of Scatter. The best solution is always sticking to a grid-like topology.

Changing scatter inner file structure
Scatter will create for you a complex set up of vertex groups, particle systems, modifiers stack and collections, please do not move or link or rename or hide any of theses, don’t interact with scatter automation it’s already doing everything for you.

Camera Clipping issue (rare blender bug)
on some really rare occasions, you file will be corrupted from camera clipping usage, you will not be able to use camera clipping anymore with this specific file.
An extremely rare blender bug related to Dynamic paint is the cause of this issue. i cannot do anything but advise you to transfer your terrain into a new file and reporting the issue to the foundation.
https://developer.blender.org/T67690

are you a victim of this bug ?

HOW TO KNOW IF YOU ARE A VICTIM OF THIS BUG ?

Ignore the rest of your scenes and follow these simple steps, we basically going to do a simple dynamic paint displacement setup in a few clicks.

  1. add a cube and a plane and subdivide the plane by 4 or 5 within edit mode
  2. add a dynamic paint modifier (physics tab) to the cube, “brush” type
  3. move this cube into a new collection, nothing in it except this cube
  4. add a dynamic paint modifier to the plane, “canvas” type, chose the colleciton you just created with the cube

if the plane is being displaced and camera clipping is not working correctly, either it’s a scatter bug or you did a wrong manipulation.

if the plane is not being displaced, then it’s a blender bug, and your file is somehow corrupted by this bug. please report it to the blender institute with the simplest Dynamic-paint failure example possible to demonstrate to the institute (witouth using scatter )


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 !

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


60 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

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:

1 Like

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

i read months ago that brecht was really interrested in point could and wanted to incorpore a point cloud system in blender. It’s in his to do list. I don’t know where to find this info again.

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
        
slotname = "Super Slutt"
pref = "Scatter:["+ A.name +"]["+ slotname +"] v."
i = 1
name = "%s%d" % (pref, i)
while A.modifiers.get(name):    
    i += 1
    name = "%s%d" % (pref, i)
    
    

m = A.modifiers.new(name, type='PARTICLE_SYSTEM')

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)

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 #FUTURE PARAMETERS = scale #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.hair_length = 4 #FUTURE PARAMETERS = hair length #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.size_random = 0.35 #FUTURE PARAMETERS = scale randomness
ps.settings.count = 1000 #FUTURE PARAMETERS #LATER GIVE IN PERCENTAGE ? TERRAIN ?? 

bpy.context.object.particle_systems[name].seed = i #FUTURE PARAMETERS

ps.settings.display_percentage = 100 #FUTURE PARAMETERS

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 #FUTURE PARAMETERS = randomize phase

bpy.ops.texture.new()
texturename = name
bpy.data.textures[-1].name = texturename
bpy.data.textures[texturename].type = 'CLOUDS' #LATER SUPPORT OTHER NOISE TYPE AND OPTIONS
bpy.data.textures[texturename].noise_scale = 0.45 #FUTURE PARAMETERS = Scattering noise scale #LATER GIVE VARIATION RANDOMNESS ON RANGE 
bpy.data.textures[texturename].noise_depth = 0 #FUTURE PARAMETERS = Scattering noise depth #LATER GIVE VARIATION RANDOMNESS ON RANGE 
bpy.data.textures[texturename].contrast = 3 #FUTURE PARAMETERS = Scattering border (contrast) #LATER GIVE VARIATION RANDOMNESS ON RANGE 
bpy.data.textures[texturename].intensity = 1 #FUTURE PARAMETERS = Scattering range (brightness) #LATER GIVE VARIATION RANDOMNESS ON RANGE 


Okay everyone, i change the little code from above, the texture scattering map are now entirely made within the code. No need to have a map in the .blend

ps.settings.texture_slots.add().texture = bpy.data.textures[texturename]
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].density_factor = 1 #FUTURE PARAMETERS = Scattering density Influence
ps.settings.texture_slots[0].use_map_length = True 
ps.settings.texture_slots[0].length_factor = 0.3 #FUTURE PARAMETERS = Scattering size Influence
ps.settings.texture_slots[0].scale[1] = 1 #FUTURE PARAMETERS = scalex #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].scale[2] = 1 #FUTURE PARAMETERS = scaley #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].scale[0] = 1 #FUTURE PARAMETERS = scalez #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].offset[1] = 0 #FUTURE PARAMETERS = offsetx #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].offset[2] = 0 #FUTURE PARAMETERS = offsety #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].offset[0] = 0 #FUTURE PARAMETERS = offsetz #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].texture_coords = 'GLOBAL'

I will slowly create the addon step by step on this thread for now.

6 Likes