# Scatter Examples

The goal of these examples are to provide common use cases for scattering in Omniverse Replicator.

Below are a few demonstrations of scatter applied within a scene using Replicator APIs.

## Learning Objectives

Through this page you will see some highlighted scattering examples and how to use them.

However, for all information about replicator camera use consult the API documentation .

## Scattering objects in a surface

In this example we show you how to scatter objects in a 2D surface using the function `randomizer.scatter_2d()`

.

```
import omni.graph.core as og
import omni.replicator.core as rep
# create a plane to sample on
plane_samp = rep.create.plane(scale=4, rotation=(20, 0, 0))
def randomize_spheres():
# create small spheres to sample inside the plane
spheres = rep.create.sphere(scale=0.4, count=30)
# randomize
with spheres:
rep.randomizer.scatter_2d(plane_samp)
# Add color to small spheres
rep.randomizer.color(colors=rep.distribution.uniform((0.2, 0.2, 0.2), (1, 1, 1)))
return spheres.node
rep.randomizer.register(randomize_spheres)
with rep.trigger.on_frame(num_frames=10):
rep.randomizer.randomize_spheres()
```

The spheres are scattered on the plane, but you should notice that they will intersect with each other.

## Scatter 2D with collisions

Altering the code above, we can add `check_for_collisions=True`

to ensure that none of the spheres overlap.

```
import omni.graph.core as og
import omni.replicator.core as rep
# create a plane to sample on
plane_samp = rep.create.plane(scale=4, rotation=(20, 0, 0))
def randomize_spheres():
# create small spheres to sample inside the plane
spheres = rep.create.sphere(scale=0.4, count=30)
# randomize
with spheres:
rep.randomizer.scatter_2d(plane_samp, check_for_collisions=True)
# Add color to small spheres
rep.randomizer.color(colors=rep.distribution.uniform((0.2, 0.2, 0.2), (1, 1, 1)))
return spheres.node
rep.randomizer.register(randomize_spheres)
with rep.trigger.on_frame(num_frames=10):
rep.randomizer.randomize_spheres()
```

The spheres are now scattered without intersecting with each other.

Note

An error will be raised if no collision solution can be found within a reasonable amount of time (for instance: having too many objects)

## Multi-Surface Scatter 2D

In this example, the Scatter 2D node can be used for sampling on multiple surfaces.

We create a second surface, a large sphere, and sample 40 small spheres distributed across both surfaces.

```
import omni.replicator.core as rep
# A light to see
distance_light = rep.create.light(rotation=(-45, 0, 0), light_type="distant")
# Create a plane to sample on
plane_samp = rep.create.plane(scale=3, rotation=(20, 0, 0))
# Create a larger sphere to sample on the surface of
sphere_samp = rep.create.sphere(scale=2.4, position=(0, 100, -180))
def randomize_spheres():
# create small spheres to sample inside the plane
spheres = rep.create.sphere(scale=0.4, count=40)
# scatter small spheres
with spheres:
rep.randomizer.scatter_2d(surface_prims=[plane_samp, sphere_samp], check_for_collisions=True)
# Add color to small spheres
rep.randomizer.color(colors=rep.distribution.uniform((0.2, 0.2, 0.2), (1, 1, 1)))
return spheres.node
rep.randomizer.register(randomize_spheres)
with rep.trigger.on_frame(num_frames=10):
rep.randomizer.randomize_spheres()
```

## Scatter 2D avoiding objects

In this example we show the Scatter 2D node can allow for collision checking with other prims besides the ones created for sampling.

We create a large cylinder and check for collisions by adding it to the parameter list `no_coll_prims`

.

The scattered spheres will now avoid placement where the cylinder is located. Multiple extra prims can be added for collision checking with this parameter.

```
import omni.replicator.core as rep
# A light to see
distance_light = rep.create.light(rotation=(-45, 0, 0), light_type="distant")
# Create a plane to sample on
plane_samp = rep.create.plane(scale=3, rotation=(20, 0, 0))
# Create a larger sphere to sample on the surface of
sphere_samp = rep.create.sphere(scale=2.4, position=(0, 100, -180))
# Create a larger cylinder we do not want to collide with
cylinder = rep.create.cylinder(
semantics=[("class", "cylinder")], scale=(2, 1, 2))
def randomize_spheres():
# create small spheres to sample inside the plane
spheres = rep.create.sphere(scale=0.4, count=60)
# scatter small spheres
with spheres:
rep.randomizer.scatter_2d(
surface_prims=[plane_samp, sphere_samp], no_coll_prims=[cylinder], check_for_collisions=True
)
# Add color to small spheres
rep.randomizer.color(colors=rep.distribution.uniform((0.2, 0.2, 0.2), (1, 1, 1)))
return spheres.node
rep.randomizer.register(randomize_spheres)
with rep.trigger.on_frame(num_frames=10):
rep.randomizer.randomize_spheres()
```

## Scatter 2D with limits

In this example, we show that the Scatter 2D node can take in extra parameters for the `min_samp`

and `max_samp`

sampling bounds.

For example, you might want to stop sampling for everything beyond a certain value, i.e. `y > 100`

.

To do this, specify `min_samp=(X, Y, Z)`

and/or `max_samp=(X, Y, Z)`

in the Scatter 2D node parameters.
The `X,Y,Z`

values are all in world-space units.

```
import omni.replicator.core as rep
# A light to see
distance_light = rep.create.light(rotation=(-45, 0, 0), light_type="distant")
# Create a plane to sample on
plane_samp = rep.create.plane(scale=3, rotation=(20, 0, 0))
# Create a larger sphere to sample on the surface of
sphere_samp = rep.create.sphere(scale=2.4, position=(0, 100, -180))
def randomize_spheres():
# create small spheres to sample inside the plane
spheres = rep.create.sphere(scale=0.4, count=60)
# scatter small spheres
with spheres:
rep.randomizer.scatter_2d(
[plane_samp, sphere_samp],
min_samp=(None, None, None),
# Small spheres will not go beyond 0 in X, 110 in Y, 30 in Z world space
max_samp=(0, 110, 30),
check_for_collisions=False,
)
rep.randomizer.color(colors=rep.distribution.uniform((0.2, 0.2, 0.2), (1, 1, 1)))
return spheres.node
rep.randomizer.register(randomize_spheres)
with rep.trigger.on_frame(num_frames=10):
rep.randomizer.randomize_spheres()
```