Scatter Masking Features
Scattering is the most used feature of Dash, and its masking capabilities is why. Let's dig into them!
Last updated
Scattering is the most used feature of Dash, and its masking capabilities is why. Let's dig into them!
Last updated
Polygonflow Dash's Documentation
Visit our FAQMake sure to read up the Getting Started page in order to easily digest the information in this page. The section about environment creation covers the basics of using Dash tools, which we'll assume you know how to in this page.
Dash contains various scatter tools, each tailored towards specific purposes. Most tools have very basic masking capabilities, and Surface Scatter is the one with pretty much all features outlined in this page.
Surface Scatter is a world-class scattering solution that operates on your mesh surfaces. The idea is to give it some geometry (static mesh, landscape, procedural mesh, etc...) as your surface/ground to scatter on, and some actors you want to scatter, and it'll do its magic.
This is the most extensive tool in Dash, and contains features requested from various major AAA studios, talented individual artists, and our team's relentless pursuit of state of the art world building.
Dash's scattering tools contain various masking features, and while most of them reside in Surface Scatter only, the other tools still have a few, and we're actively expanding masking features to them. Let's look into all the major masking features, how they work, and what you can do with them.
Before we dig in, "masking" here means removing scattered instances. Additionally, most masking groups give you the ability to invert the mask result. You'll notice that some properties have a small dark circle on their bottom right corner, which means you can right-click on the property and select Invert Mask.
This feature allows you to mask by curve, meshes, and instances.
It has as Distance property which controls the proximity distance, and relies on the native UE units. The other property is Sampling. This value controls the quality of the masking. A higher value means higher quality, and lower value means lower.
In the example above, we're using meshes and curves for masking, but relying on instances is just as easy: Select them in the viewport, and add them to the proximity objects. In the example below, we've scattered some spheres, then scattered some discs, and only kept the disks near the spheres.
You can leverage proximity masking to build realistic forests. First you'd scatter trees, then keep the some ferns & leaves below them, then use a curve as a proximity mask in case you need a path, then scatter some rocks on the edges of that path, etc... In Surface Scatter, we provide three proximity mask groups, each having its own object, distance and sampling values. You could for example use the first group to mask out some objects with a specific distance, and do the same with the other two groups.
Lastly, Proximity Masking lends itself quite well to mask inversion.
Angle masking is fairly straightforward: It relies on the underlying surface to determine the angle, and remove any scattered objects in that area. This is ideal for keeping slopes clear of trees and other objects when scattering on mountains.
Tools like Surface Scatter have Min Height Mask and Max Height Mask properties, which allow you to clip the scattered objects from above or below.
Unlike proximity masking, which simply relies on distances, Object Masking uses raytracing to determine when your instances are inside, outside or near an object. If you want to draw a curve, and keep all your instances inside that curve, this feature is perfect. You can also use it to keep instances that are inside/outside a mesh or volume.
This masking method also has a Keep Inside boolean property, which you can toggle to ensure that the masking either keeps instances inside, or outside of your input objects. You can also use the Distance property to keep instances nearby.
Noise Masking allows you to quickly break up the uniformity of your scattered objects. You're provided a wide range of parameters, from scaling to frequency, axis-specific stretching, noise smoothing, warping, etc...
If you're scattering grass, trees or even trash, we highly recommend using this feature to make your results look more natural.
Clump Masking works by picking random instances, and using them as the center point of a clump. You're provided with a value to adjust the density of instances to sample, and another to control the radius of your clumps. Combined with noise & other masks, this can be a very powerful tool for realistic scatter setups.
Border Masking detects the border edges of your surface geometry, and masks out all objects near those borders.
This feature really useful for man-made scatter setups like gardens, where you could make some underlying geometry shape, scatter some plants on it, then hide that geometry. Each edge loop border on your geometry is treated separately, and the Border Min/Max properties allow you to add some randomization to the masking for each border loop. Noise is a simple noise effect to break up the border's uniformity.
Projection masking works by having the point of each instance shoot a ray upwards, and any mesh it hits that you've added to it will ensure that ray hit instances are kept. You can also invert the effect. Use cases range from keeping instances that are under objects, like plants or trash under a car, to removing all instances that are below any set of objects in your scene.
This masking feature allows you to feed the name of a paint layer to Surface Scatter, and the tool then uses the layer as mask. You can feed up to three layers.
Texture Masking is fairly straightforward: Select a texture in UE's content browser, feed it to the Texture Path property in the Texture Masking group, and voilà. You can pick which channel to use as a mask, adjust the color threshold to help with gradient pixels, and tile the texture mask. All you have to do is make sure that your texture contains white on black pixels, and the white pixels will be used as mask. If you're trying to create structure like small, decorated garden with very specific shapes, we recommend this approach where you could scatter on a plane, hide the plane, then give it the texture which represents the shape of your flowers garden.
Vertex colors can be applied on static meshes, and then all RGB channels are available in this masking group. Additionally, you have some pixel threshold control to adjust how the masking behaves on gradient pixels, and also a Blend Modes dropdown from which you can pick how the vertex color affects your masking logic.
Unlike Angle Masking, Directional Masking allows you to use your sunlight (or any object) actor to mask out objects based on the sun's rotation. This can be used to remove objects that are sensitive to sunlight, with moss being the most common use case.
This is a simple masking trick that allows us to add or remove instances randomly. You could for example use proximity masking to clear a path from plants, but then use add mask at a low value to keep a few plants popping here and there.
When creating a complex setup, like say a forest with a Surface Scatter for the trees, another for the shrubs, another for the grass, etc... then a Path Scatter for some wooden posts along the forest, and a road, etc... That complexity can quickly become overwhelming, and we use references to make sense of this. Your road will have a width, and you'll want the wooden posts to respect that width, even if they have a slight offset. Same with the forest vegetation, you'll want it to not spawn on the road, and so on.
The way to do this is by creating reference properties. We cover them in the Getting Started page, but the workflow is fairly simple: You'd create some property Distance or Width that dictates the width of the road, and all those tools would use it. When a property uses a reference, we give it a weight, which allows you to extend the value of your property beyond wha the reference provides. For example, if your Width is 320, the wooden posts could have a weight of 0.1, which would make them slightly larger than the width, as the weight acts like a percentage multiplier on it.