Пример #1
0
    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()
Пример #2
0
    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()
Пример #3
0
 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
Пример #4
0
    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)
Пример #5
0
            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")