Generates a basic 3D visualization.
  
        :param color: Polygons color.
        :type color: matplotlib color, 'default' or 't' (transparent)
        :param ret: If True, returns the figure. It can be used to add 
            more elements to the plot or to modify it.
        :type ret: bool
        :param ax: If a matplotlib axes given, this method will 
            represent the plot on top of this axes. This is used to
            represent multiple plots from multiple geometries, 
            overlapping them recursively.
        :type ax: mplot3d.Axes3D, None
        :returns: None, axes
        :rtype: mplot3d.Axes3D, bool

def plot(self, color='default', ret=False, ax=None):
        """
        Generates a basic 3D visualization.
  
        :param color: Polygons color.
        :type color: matplotlib color, 'default' or 't' (transparent)
        :param ret: If True, returns the figure. It can be used to add 
            more elements to the plot or to modify it.
        :type ret: bool
        :param ax: If a matplotlib axes given, this method will 
            represent the plot on top of this axes. This is used to
            represent multiple plots from multiple geometries, 
            overlapping them recursively.
        :type ax: mplot3d.Axes3D, None
        :returns: None, axes
        :rtype: mplot3d.Axes3D, bool
        """
        import matplotlib.pylab as plt
        import mpl_toolkits.mplot3d as mplot3d
        
        # Bypass a plot
        if color == False:
            if ax is None: ax = mplot3d.Axes3D(fig=plt.figure())
            return ax
        
        # Clone and extract the information from the object
        obj = self.__class__(**self.get_seed())
        plotable3d = obj.get_plotable3d()
            
        # Domain
        domain = obj.get_domain()
        bound = np.max(domain[1]-domain[0])
        centroid = obj.get_centroid()
        pos = np.vstack((centroid-bound/2, centroid+bound/2))
        
        # Cascade plot?
        if ax is None: # Non cascade
            ax = mplot3d.Axes3D(fig=plt.figure())
        else:
            old_pos = np.array([ax.get_xbound(),
                                ax.get_ybound(),
                                ax.get_zbound()]).T
            pos = np.dstack((pos, old_pos))
            pos = np.array([np.min(pos[0, :, :], axis=1),
                            np.max(pos[1, :, :], axis=1)])
            
        # Plot
        if color == 'default': color = 't'
        if color == 't': color = (0,0,0,0)
            
        for polygon in plotable3d:
            polygon.set_facecolor(color)
            polygon.set_edgecolor('k')
            ax.add_collection3d(polygon)
        
        # Axis limits
        ax.set_xlim3d(left=pos[0,0], right=pos[1,0])
        ax.set_ylim3d(bottom=pos[0,1], top=pos[1,1])
        ax.set_zlim3d(bottom=pos[0,2], top=pos[1,2])
        
        if ret: return ax