from blenderproc.python.modules.main.Provider import Provider
from blenderproc.python.types.MeshObjectUtility import convert_to_meshes
from blenderproc.python.sampler.UpperRegionSampler import upper_region
[docs]class UpperRegionSamplerModule(Provider):
"""
Uniformly samples 3-dimensional value over the bounding box of the specified objects (can be just a plane) in the
defined upper direction. If "use_upper_dir" is False, samples along the face normal closest to "upper_dir". The
sampling volume results in a parallelepiped. "min_height" and "max_height" define the sampling distance from the face.
Example 1: Sample a location on the surface of the first object to match the name pattern with height above this
surface in range of [1.5, 1.8].
.. code-block:: yaml
{
"provider": "sampler.UpperRegionSampler",
"min_height": 1.5,
"max_height": 1.8,
"to_sample_on": {
"provider": "getter.Entity",
"index": 0,
"conditions": {
"name": "Table.*"
}
}
}
**Configuration**:
.. list-table::
:widths: 25 100 10
:header-rows: 1
* - Parameter
- Description
- Type
* - to_sample_on
- Objects, on which to sample on.
- Provider
* - min_height
- Minimum distance to the bounding box that a point is sampled on. Default: 0.0.
- float
* - max_height
- Maximum distance to the bounding box that a point is sampled on. Default: 1.0.
- float
* - face_sample_range
- Restricts the area on the face where objects are sampled. Specifically describes relative lengths of
both face vectors between which points are sampled. Default: [0.0, 1.0]
- list
* - upper_dir
- The 'up' direction of the sampling box. Default: [0.0, 0.0, 1.0].
- list
* - use_upper_dir
- Toggles the sampling above the selected surface, can be done with the upper_dir or with the face normal,
if this is true the upper_dir is used. Default: True.
- bool
* - use_ray_trace_check
- Toggles using a ray casting towards the sampled object (if the object is directly below the sampled
position is the position accepted). Default: False.
- bool
"""
def __init__(self, config):
Provider.__init__(self, config)
[docs] def run(self):
""" Samples based on the description above.
:return: Sampled value. Type: mathutils.Vector
"""
# invoke a Getter, get a list of objects to manipulate
objects = convert_to_meshes(self.config.get_list("to_sample_on"))
if len(objects) == 0:
raise Exception("The used selector returns an empty list, check the self.config value: \"to_sample_on\"")
# relative area on selected face where to sample points
face_sample_range = self.config.get_vector2d("face_sample_range", [0.0, 1.0])
# min and max distance to the bounding box
min_height = self.config.get_float("min_height", 0.0)
max_height = self.config.get_float("max_height", 1.0)
if max_height < min_height:
raise Exception("The minimum height ({}) must be smaller "
"than the maximum height ({})!".format(min_height, max_height))
use_ray_trace_check = self.config.get_bool('use_ray_trace_check', False)
# the upper direction, to define what is up in the scene
# is used to selected the correct face
upper_dir = self.config.get_vector3d("upper_dir", [0.0, 0.0, 1.0])
upper_dir.normalize()
# if this is true the up direction is determined by the upper_dir vector, if it is false the
# face normal is used
use_upper_dir = self.config.get_bool("use_upper_dir", True)
return upper_region(
objects_to_sample_on=objects,
face_sample_range=face_sample_range,
min_height=min_height,
max_height=max_height,
use_ray_trace_check=use_ray_trace_check,
upper_dir=upper_dir,
use_upper_dir=use_upper_dir
)