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
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)