def show(self, **kwds):
        """
        INPUT:
            viewer    -- string (default: 'jmol'), how to view the plot
                         'jmol': interactive 3d (java)
                         'tachyon': a static png image (ray traced)
                         'java3d': interactive opengl based 3d
            filename  -- string (default: a temp file); file to save the image to
            verbosity -- display information about rendering the figure
            figsize   -- (default: 5); x or pair [x,y] for numbers, e.g., [5,5]; controls
                         the size of the output figure.  E.g., with Tachyon the number of
                         pixels in each direction is 100 times figsize[0].
                         This is ignored for the jmol embedded renderer.
            aspect_ratio -- (default: "automatic") -- aspect ratio of the coordinate system
                         itself.  Give [1,1,1] to make spheres look round.
            frame_aspect_ratio -- (default: "automatic") aspect ratio of frame that
                         contains the 3d scene.
            zoom      -- (default: 1) how zoomed in
            frame     -- (default: True) if True, draw a bounding frame with labels
            axes      -- (default: False) if True, draw coordinate axes
                        
            **kwds    -- other options, which make sense for particular rendering engines

            jmol only Options:
            
            Script   --  Whether or not jmol script is printed to the notebook.  Default false
                         Especially useful for debugging.
  	    delay    --  Amount of time in seconds between rotations.
                         default = 2 
              
            rotate --     List of tuple of rotation moves.  Elements are 4 or 5-tuple or lists.  
                          Axis of rotation is defined by the given {x, y, z) and the origin.  
                          Format:  (x, y, z, degrees, speed) or (x, y, z, degrees).  
                          speed is measured in degrees/second
                          Default speed is 20
                          Default rotate is ()
                
		IDEAS:  It would be nice to implement a few other Jmol features, such as the moveto command, or
                        the ability to draw lines between rotations, then have them turn off, or just specifiy commands
                        of rotates, moves, or draws in arbitrary order.  This shouldn't be too hard (just meticulous)
                        see http://chemapps.stolaf.edu/jmol/docs/?ver=11.6#load  for useful Jmol documentation.
    
                     EXAMPLES:
                     	sage: R = plot3d(sin(x + y), (x, 0, 10), (y, 0, 10))
			sage: show(R, Script = True)
                        sage: show(R, rotate = [(3, 1, 0, 0, 90, 20), (2, 0, 1, 1, -90, 25)], delay = 3)
				# Rotates R about x-axis 90 degress clockwise (according to right-hand coordinate system)
    				# then after a 3 second delay rotates about line y=z 90 degrees counter clockwise
     

        CHANGING DEFAULTS:
        Defaults can be uniformly changed by importing a dictionary and changing it.
        For example, here we change the default so images display without a frame
        instead of with one:
            sage: from sage.plot.plot3d.base import SHOW_DEFAULTS
            sage: SHOW_DEFAULTS['frame'] = False

        This sphere will not have a frame around it:
            sage: sphere((0,0,0))

        We change the default back:
            sage: SHOW_DEFAULTS['frame'] = True

        Now this sphere is enclosed in a frame:
            sage: sphere((0,0,0))
        

        EXAMPLES:
        We illustrate use of the aspect_ratio option:
           sage: x, y = var('x,y')
           sage: p = plot3d(2*sin(x*y), (x, -pi, pi), (y, -pi, pi))
           sage: p.show(aspect_ratio=[1,1,1])

        This looks flattened, but filled with the plot:
           sage: p.show(frame_aspect_ratio=[1,1,1/16])

        This looks flattened, but the plot is square and smaller:
           sage: p.show(aspect_ratio=[1,1,1], frame_aspect_ratio=[1,1,1/8])
           
        """
        ek = self._extra_kwds
        if ek is not None:
            for key in ek.keys():
                if not kwds.has_key(key):
                    kwds[key] = ek[key]
                    
        for key in SHOW_DEFAULTS.keys():
            if not kwds.has_key(key):
                kwds[key] = SHOW_DEFAULTS[key]

        # must have one line for every named argument:
        if kwds.has_key('viewer'): viewer = kwds['viewer']; del kwds['viewer']
        if kwds.has_key('filename'): filename = kwds['filename']; del kwds['filename']
        if kwds.has_key('verbosity'): verbosity = kwds['verbosity']; del kwds['verbosity']
        if kwds.has_key('figsize'): figsize = kwds['figsize']; del kwds['figsize']
        if kwds.has_key('aspect_ratio'): aspect_ratio = kwds['aspect_ratio']; del kwds['aspect_ratio']
        if kwds.has_key('frame_aspect_ratio'): frame_aspect_ratio = kwds['frame_aspect_ratio']; del kwds['frame_aspect_ratio']
        if kwds.has_key('zoom'): zoom = kwds['zoom']; del kwds['zoom']
        if kwds.has_key('frame'): frame = kwds['frame']; del kwds['frame']
        if kwds.has_key('axes'): axes = kwds['axes']; del kwds['axes'] 
        if not isinstance(aspect_ratio, (str, list, tuple)):
            raise TypeError, "aspect ratio must be a string, list, or tuple"
        if aspect_ratio != "automatic" and frame_aspect_ratio == "automatic":
            # set the aspect_ratio of the frame to be the same as that of the
            # object we are rendering given the aspect_ratio we'll use for it.
            frame_aspect_ratio = self._determine_frame_aspect_ratio(aspect_ratio)
        elif frame_aspect_ratio == "automatic":
            frame_aspect_ratio = self.frame_aspect_ratio()

        import sage.misc.misc
        if filename is None:
            filename = sage.misc.misc.tmp_filename()
        if not isinstance(figsize, (list,tuple)):
            figsize = [figsize, figsize]
        from sage.plot.plot import EMBEDDED_MODE, DOCTEST_MODE
        ext = None

        # Tachyon resolution options
        if DOCTEST_MODE:
            opts = '-res 10 10'
            filename = sage.misc.misc.SAGE_TMP + "/tmp"
        elif EMBEDDED_MODE:
            opts = '-res %s %s'%(figsize[0]*100, figsize[1]*100)
            filename = sage.misc.misc.graphics_filename()[:-4]
        else:
            opts = '-res %s %s'%(figsize[0]*100, figsize[1]*100)

        if DOCTEST_MODE or viewer=='tachyon' or (viewer=='java3d' and EMBEDDED_MODE):
            T = self._prepare_for_tachyon(frame, axes, frame_aspect_ratio, aspect_ratio, zoom)
            tachyon_rt(T.tachyon(), filename+".png", verbosity, True, opts)
            ext = "png"
            import sage.misc.viewer
            viewer_app = sage.misc.viewer.browser()

        if DOCTEST_MODE or viewer=='java3d':
            f = open(filename+".obj", "w")
            f.write("mtllib %s.mtl\n" % filename)
            f.write(self.obj())
            f.close()
            f = open(filename+".mtl", "w")
            f.write(self.mtl_str())
            f.close()
            ext = "obj"
            viewer_app = sage.misc.misc.SAGE_LOCAL + "/java/java3d/start_viewer"

        if DOCTEST_MODE or viewer=='jmol':
            # Temporary hack: encode the desired applet size in the end of the filename:
            # (This will be removed once we have dynamic resizing of applets in the browser.)
            base, ext = os.path.splitext(filename)
            fg = figsize[0]
            #if fg >= 2:
            #    fg = 2
            filename = '%s-size%s%s'%(base, fg*100, ext)
            ext = "jmol"
            archive_name = "%s.%s.zip" % (filename, ext)
            if EMBEDDED_MODE:
                # jmol doesn't seem to correctly parse the ?params part of a URL
                archive_name = "%s-%s.%s.zip" % (filename, randint(0, 1 << 30), ext)
            T = self._prepare_for_jmol(frame, axes, frame_aspect_ratio, aspect_ratio, zoom)
            T.export_jmol(archive_name, force_reload=EMBEDDED_MODE, zoom=zoom*100, **kwds)     
            viewer_app = sage.misc.misc.SAGE_LOCAL + "/java/jmol/jmol"         
            
            #We need a script to load the file 
            f = open(filename + '.jmol', 'w')
            f.write('set defaultdirectory "%s"\n' % archive_name)
            f.write('script SCRIPT\n')
            f.close()
        if ext is None:
            raise ValueError, "Unknown 3d plot type: %s" % viewer
        
        if not DOCTEST_MODE and not EMBEDDED_MODE:
            if verbosity:
                pipes = "2>&1"
            else:
                pipes = "2>/dev/null 1>/dev/null &"
            os.system('%s "%s.%s" %s' % (viewer_app, filename, ext, pipes))