def __init__(self, **kwargs): super(WorkstationScenarios, self).__init__() self.logger = get_logger() add_file_handler(self.logger) # we do composition here, not inheritance anymore because it is too # limiting in its capabilities. Using a render manager is a better way # to handle compositor nodes self.renderman = abr_scenes.RenderManager() # extract configuration, then build and activate a split config self.config = kwargs.get('config', WorkstationScenariosConfiguration()) if self.config.dataset.scene_type.lower() != 'WorkstationScenarios'.lower(): raise RuntimeError( f"Invalid configuration of scene type {self.config.dataset.scene_type} for class WorkstationScenarios") # determine if we are rendering in multiview mode self.render_mode = kwargs.get('render_mode', 'default') if self.render_mode not in ['default', 'multiview']: self.logger.warn(f'render mode "{self.render_mode}" not supported. Falling back to "default"') self.render_mode = 'default' # we might have to post-process the configuration self.postprocess_config() # setup directory information for each camera self.setup_dirinfo() # setup the scene, i.e. load it from file self.setup_scene() # setup the renderer. do this _AFTER_ the file was loaded during # setup_scene(), because otherwise the information will be taken from # the file, and changes made by setup_renderer ignored self.renderman.setup_renderer(self.config.render_setup.integrator, self.config.render_setup.denoising, self.config.render_setup.samples, self.config.render_setup.motion_blur) # grab environment textures self.setup_environment_textures() # setup all camera information according to the configuration self.setup_cameras() # setup global render output configuration self.setup_render_output() # populate the scene with objects self.objs = self.setup_objects(self.config.scenario_setup.target_objects, bpy_collection='TargetObjects', abc_objects=self.config.scenario_setup.abc_objects, abc_bpy_collection='ABCObjects') self.distractors = self.setup_objects(self.config.scenario_setup.distractor_objects, bpy_collection='DistractorObjects') # finally, setup the compositor self.setup_compositor()
def __init__(self, data_dir=None): """Dataloader for ABC dataset Args: data_dir (str, optional): fullpath to ABC dataset parent directory. Defaults to None. """ self._logger = log_utils.get_logger() log_utils.add_file_handler(self._logger) self._parent = self._get_abc_parent_dir(data_dir) self._object_types_map = self._get_object_types_map()
def __init__(self, material_generator, units="METERS", enable_physics=True, collision_margin=0.0001, density=8000): self._logger = log_utils.get_logger() log_utils.add_file_handler(self._logger) self._mat_gen = material_generator self._units = units self._physhics = enable_physics self._collision_margin = collision_margin self._density = density # kg/m^3, Steel ~ 8000 self._mass_top_limit = 1.0 # [kg] self._mass_bottom_limit = 0.01
def __init__(self, data_dir=None, n_materials=3, collision_margin=0.0001, density=8000): """Configuration Args: data_dir (str, optional): fullpath to ABC dataset parent directory. Defaults to None. n_materials (int, optional): Number of random materials to generate. Defaults to 3. density (float, optional): density in [kg/m^3]. Default to 8000, for Steel. collision_margin (float, optional): collision_margin in [m]. Defaults to 0.0001. Physics simulation params are necessary for randomized object placement. """ self._logger = log_utils.get_logger() log_utils.add_file_handler(self._logger) self._dataloader = ABCDataLoader(data_dir=data_dir) material_generator = MetallicMaterialGenerator() material_generator.make_random_material(n=n_materials) self._stl_importer = STLImporter(material_generator, units="METERS", enable_physics=True, collision_margin=collision_margin, density=density)
collision_margin=collision_margin) if not rescale_success: bpy.ops.object.select_all(action="DESELECT") # bpy.context.scene.objects.active = None obj_handle.select_set(True) bpy.ops.object.delete() return None, None return obj_handle, object_type if __name__ == "__main__": logger = log_utils.get_logger() log_utils.add_file_handler(logger) logger.info("starting __main__") n_rand = 7 n_per_type = 4 step = 0.3 out_dir = osp.join(os.environ["HOME"], "Desktop", "stl_import_demo") try: shutil.rmtree(out_dir) except FileNotFoundError: pass os.makedirs(out_dir, exist_ok=True) abc_importer = ABCImporter() logger.info("instantiated an ABCImporter for STL files")