def _cam2world_matrix_from_cam_extrinsics(self,
                                              config: Config) -> np.ndarray:
        """ Determines camera extrinsics by using the given config and returns them in form of a cam to world frame transformation matrix.

        :param config: The configuration object.
        :return: The 4x4 cam to world transformation matrix.
        """
        if not config.has_param("cam2world_matrix"):
            # Print warning if local_frame_change is used with other attributes than cam2world_matrix
            if self.local_frame_change != ["X", "Y", "Z"]:
                print(
                    "Warning: The local_frame_change parameter is at the moment only supported when setting the cam2world_matrix attribute."
                )

            position = change_coordinate_frame_of_point(
                config.get_vector3d("location", [0, 0, 0]),
                self.world_frame_change)

            # Rotation
            rotation_format = config.get_string("rotation/format", "euler")
            value = config.get_vector3d("rotation/value", [0, 0, 0])
            # Transform to blender coord frame
            value = change_coordinate_frame_of_point(value,
                                                     self.world_frame_change)

            if rotation_format == "euler":
                # Rotation, specified as euler angles
                rotation_matrix = Euler(value, 'XYZ').to_matrix()
            elif rotation_format == "forward_vec":
                # Convert forward vector to euler angle (Assume Up = Z)
                rotation_matrix = CameraUtility.rotation_from_forward_vec(
                    value)
            elif rotation_format == "look_at":
                # Convert forward vector to euler angle (Assume Up = Z)
                rotation_matrix = CameraUtility.rotation_from_forward_vec(
                    value - position)
            else:
                raise Exception("No such rotation format:" +
                                str(rotation_format))

            if rotation_format == "look_at" or rotation_format == "forward_vec":
                inplane_rot = config.get_float("rotation/inplane_rot", 0.0)
                rotation_matrix = np.matmul(
                    rotation_matrix,
                    Euler((0.0, 0.0, inplane_rot)).to_matrix())

            cam2world_matrix = build_transformation_mat(
                position, rotation_matrix)
        else:
            cam2world_matrix = np.array(
                config.get_list("cam2world_matrix")).reshape(4, 4).astype(
                    np.float32)
            cam2world_matrix = change_source_coordinate_frame_of_transformation_matrix(
                cam2world_matrix, self.local_frame_change)
            cam2world_matrix = change_target_coordinate_frame_of_transformation_matrix(
                cam2world_matrix, self.world_frame_change)
        return cam2world_matrix
    def run(self):
        """ Returns the result of processing of the list of values. """
        transform_by = self.config.get_string("transform_by")
        elements = self.config.get_list("elements")

        raw_result = []
        for element in elements:
            element_conf = Config({"element": element})
            if isinstance(element, list):
                raw_result.append(element_conf.get_vector3d("element"))
            else:
                raw_result.append(element_conf.get_raw_value("element"))

        if len(raw_result) > 0:
            if self._check_compatibility(raw_result):
                if transform_by == "sum":
                    ref_result = self._sum(raw_result)
                elif transform_by == "avg":
                    ref_result = self._avg(raw_result)
                else:
                    raise RuntimeError("Unknown 'transform_by' operation: " +
                                       transform_by)
            else:
                raise RuntimeError(
                    "Provider output types don't match. All must either int, float, or mathutils.Vector."
                )
        else:
            raise RuntimeError(
                "List of resulting values of `elements` is empty. Please, check Provider configuration."
            )

        return ref_result
Ejemplo n.º 3
0
    def run(self):
        """ Loads rocks."""

        rocks_settings = self.config.get_list("batches", [])
        for subsec_num, subsec_settings in enumerate(rocks_settings):
            subsec_config = Config(subsec_settings)

            subsec_objects = RockEssentialsRockLoader.load_rocks(
                path=subsec_config.get_string("path"),
                subsec_num=subsec_num,
                objects=subsec_config.get_list("objects", []),
                sample_objects=subsec_config.get_bool("sample_objects", False),
                amount=subsec_config.get_int("amount", None)
            )

            RockEssentialsRockLoader.set_rocks_properties(
                objects=subsec_objects,
                physics=subsec_config.get_bool("physics", False),
                render_levels=subsec_config.get_int("render_levels", 3),
                high_detail_mode=subsec_config.get_bool("high_detail_mode", False),
                scale=subsec_config.get_vector3d("scale", [1, 1, 1]),
                reflection_amount=subsec_config.get_float("reflection_amount", None),
                reflection_roughness=subsec_config.get_float("reflection_roughness", None),
                hsv=subsec_config.get_list("HSV", None)
            )
    def run(self):
        """ Adds specified basic empty objects to the scene and sets at least their names to the user-defined ones.
            1. Get configuration parameters' values.
            2. Add an object.
            3. Set attribute values.
        """
        empties_to_add = self.config.get_list("empties_to_add")
        for empty in empties_to_add:
            empty_conf = Config(empty)
            obj_name = empty_conf.get_string("name")
            obj_type = empty_conf.get_string("type", "plain_axes")

            entity = create_empty(obj_name, obj_type)
            entity.set_location(empty_conf.get_vector3d("location", [0, 0, 0]))
            entity.set_rotation_euler(
                empty_conf.get_vector3d("rotation", [0, 0, 0]))
            entity.set_scale(empty_conf.get_vector3d("scale", [1, 1, 1]))
 def run(self):
     """ Adds specified basic mesh objects to the scene and sets at least their names to the user-defined ones.
         1. Get configuration parameters' values.
         2. Add an object.
         3. Set attribute values.
         4. Initialize a material, if needed.
     """
     meshes_to_add = self.config.get_list("meshes_to_add")
     init_objs_mats = self.config.get_bool("init_materials", True)
     for mesh in meshes_to_add:
         mesh_conf = Config(mesh)
         obj_type = mesh_conf.get_string("type")
         obj_name = mesh_conf.get_string("name")
         obj_location = mesh_conf.get_vector3d("location", [0, 0, 0])
         obj_rotation = mesh_conf.get_vector3d("rotation", [0, 0, 0])
         obj_scale = mesh_conf.get_vector3d("scale", [1, 1, 1])
         new_obj = self._add_obj(obj_type)
         self._set_attrs(new_obj, obj_name, obj_location, obj_rotation,
                         obj_scale)
         if init_objs_mats:
             self._init_material(obj_name)