On surface object pose Sampling

The focus of this example is the OnSurfaceSampler which allows pose sampling for some selected objects on top of a selected surface.

Usage

Execute this in the BlenderProc main directory:

blenderproc run examples/advanced/on_surface_object_sampling/main.py examples/resources/camera_positions examples/advanced/on_surface_object_sampling/scene.blend examples/advanced/on_surface_object_sampling/output
  • examples/advanced/on_surface_object_sampling/main.py: path to the main python file to run.

  • examples/resources/camera_positions: text file with parameters of camera positions.

  • examples/advanced/on_surface_object_sampling/scene.blend: path to the object file with the basic scene.

  • examples/advanced/on_surface_object_sampling/output: path to the output directory.

Visualization

Visualize the generated data:

blenderproc vis hdf5 examples/advanced/on_surface_object_sampling/output/0.hdf5

Implementation

We first define a function that samples poses above a list of objects_to_sample_on between min_height and max_height.

# Define a function that samples the pose of a given object
def sample_pose(obj: bproc.types.MeshObject):
    # Sample the spheres location above the surface
    obj.set_location(bproc.sampler.upper_region(
        objects_to_sample_on=[surface],
        min_height=1,
        max_height=4,
        use_ray_trace_check=False
    ))
    obj.set_rotation_euler(np.random.uniform([0, 0, 0], [np.pi * 2, np.pi * 2, np.pi * 2]))

In sample_poses_on_surface takes the function handle and samples poses and projects them down on to a given surface. Objects not within min_distance and max_distance are resampled.

# Sample the spheres on the surface
spheres = bproc.object.sample_poses_on_surface(spheres, surface, sample_pose, min_distance=0.1, max_distance=10)

Then we enable active rigidbody attributes for the spheres and a passive one for the surface in order to run a physics simulation. This optinal step makes sure that the resulting object poses are physically stable.

# Enable physics for spheres (active) and the surface (passive)
for sphere in spheres:
    sphere.enable_rigidbody(True)
surface.enable_rigidbody(False)

# Run the physics simulation
bproc.object.simulate_physics_and_fix_final_poses(min_simulation_time=2, max_simulation_time=4, check_object_interval=1)