def __init__(self, config): Provider.__init__(self, config) self._count = 0 self._total_points = pickle.load( open("/home/qiaog/src/BlenderProc/notebooks/sphere_grid_42.pkl", 'rb')) # Center of the sphere. self._center = np.array(self.config.get_list("center", [0.0, 0.0, 0.0])) # How many times each value repeats self._repeat = self.config.get_int("repeat", 1)
def __init__(self, config): Provider.__init__(self, config)
def __init__(self, config): Provider.__init__(self, config) self._regions = [] # invoke a Getter, get a list of objects to manipulate self._objects = config.get_list("to_sample_on") if len(self._objects) == 0: raise Exception( "The used selector returns an empty list, check the config value: \"to_sample_on\"" ) # relative area on selected face where to sample points self._face_sample_range = config.get_vector2d("face_sample_range", [0.0, 1.0]) # min and max distance to the bounding box self._min_height = config.get_float("min_height", 0.0) self._max_height = config.get_float("max_height", 1.0) if self._max_height < self._min_height: raise Exception("The minimum height ({}) must be smaller " "than the maximum height ({})!".format( self._min_height, self._max_height)) self._use_ray_trace_check = 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 self._upper_dir = config.get_vector3d("upper_dir", [0.0, 0.0, 1.0]) self._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 self._use_upper_dir = config.get_bool("use_upper_dir", True) def calc_vec_and_normals(face): """ Calculates the two vectors, which lie in the plane of the face and the normal of the face. :param face: Four corner coordinates of a face. Type: [4x[3xfloat]]. :return: (two vectors in the plane), and the normal. """ vec1 = face[1] - face[0] vec2 = face[3] - face[0] normal = vec1.cross(vec2) normal.normalize() return (vec1, vec2), normal # determine for each object in objects the region, where to sample on for obj in self._objects: bb = get_bounds(obj) faces = [] faces.append([bb[0], bb[1], bb[2], bb[3]]) faces.append([bb[0], bb[4], bb[5], bb[1]]) faces.append([bb[1], bb[5], bb[6], bb[2]]) faces.append([bb[6], bb[7], bb[3], bb[2]]) faces.append([bb[3], bb[7], bb[4], bb[0]]) faces.append([bb[7], bb[6], bb[5], bb[4]]) # select the face, which has the smallest angle to the upper direction min_diff_angle = 2 * math.pi selected_face = None for face in faces: # calc the normal of all faces _, normal = calc_vec_and_normals(face) diff_angle = math.acos(normal.dot(self._upper_dir)) if diff_angle < min_diff_angle: min_diff_angle = diff_angle selected_face = face # save the selected face values if selected_face is not None: vectors, normal = calc_vec_and_normals(selected_face) base_point = mathutils.Vector(selected_face[0]) self._regions.append(Region2D(vectors, normal, base_point)) else: raise Exception( "Couldn't find a face, for this obj: {}".format(obj.name))