def abs_dir_to_rel_dir(self, direction, direction_of_agent=None):
        if direction_of_agent is None:
            direction_of_agent = self.hero.get_current_direction()
            if direction_of_agent is None:
                direction_of_agent = direction.copy()

        rotation_matrix = helpers.get_rot_matrix_from_vec1_to_vec2(direction_of_agent, [0, 1, 0])
        relative_direction = np.matmul(rotation_matrix, direction)
        relative_direction = helpers.discretize_vector_to_voxel(relative_direction)
        return relative_direction
    def relative_dir_to_abs_dir(self, direction):
        direction = np.array(direction)
        direction_of_agent = self.hero.get_current_direction()
        if direction_of_agent is None:
            direction_of_agent = direction.copy()
            direction_of_agent = helpers.np_array_to_vector3(direction_of_agent)
            direction_of_agent.normalize()
            direction_of_agent = helpers.discretize_vector_to_voxel(direction_of_agent)
        rotation_matrix = helpers.get_rot_matrix_from_vec1_to_vec2([0, 1, 0], direction_of_agent)

        absolute_direction = np.matmul(rotation_matrix, direction)
        absolute_direction = helpers.discretize_vector_to_voxel(absolute_direction)
        check_direction = np.matmul(rotation_matrix, np.array([0, 1, 0]))
        check_direction = helpers.discretize_vector_to_voxel(check_direction)
        assert ((check_direction == direction_of_agent).all()), "rotating the system to agent's perspective is broken"
        return absolute_direction