def unproject(self, x, y, z=-1.0):
        """Receive x and y as screen coordinates and returns a point
        in world coordinates.

        This function comes in handy each time we have to convert a 2d
        mouse click to a 3d point in our space.

        **Parameters**
        
        x: float in the interval [-1.0, 1.0]
            Horizontal coordinate, -1.0 is leftmost, 1.0 is rightmost.
        
        y: float in the interval [1.0, -1.0]
            Vertical coordinate, -1.0 is down, 1.0 is up.
        
        z: float in the interval [1.0, -1.0]
            Depth, -1.0 is the near plane, that is exactly behind our
            screen, 1.0 is the far clipping plane.
        
        :rtype: np.ndarray(3,dtype=float)
        :return: The point in 3d coordinates (world coordinates).
        
        """

        source = np.array([x,y,z,1.0])
    
        # Invert the combined matrix
        matrix = self.projection.dot(self.matrix)
        IM = LA.inv(matrix)
        res = np.dot(IM, source)
        
        return res[0:3]/res[3]
Receive x and y as screen coordinates and returns a point
        in world coordinates.

        This function comes in handy each time we have to convert a 2d
        mouse click to a 3d point in our space.

        **Parameters**
        
        x: float in the interval [-1.0, 1.0]
            Horizontal coordinate, -1.0 is leftmost, 1.0 is rightmost.
        
        y: float in the interval [1.0, -1.0]
            Vertical coordinate, -1.0 is down, 1.0 is up.
        
        z: float in the interval [1.0, -1.0]
            Depth, -1.0 is the near plane, that is exactly behind our
            screen, 1.0 is the far clipping plane.
        
        :rtype: np.ndarray(3,dtype=float)
        :return: The point in 3d coordinates (world coordinates).