def imageFromObjectsOrtho(objects, path, width, height, smooth, alpha=True, camera_matrix=None, format=Render.PNG): ''' Takes any number of objects and renders them on the z axis, between x:y-0 and x:y-1 Usefull for making images from a mesh without per pixel operations - objects must be alredy placed - smooth, anti alias True/False - path renders to a PNG image - alpha weather to render background as alpha returns the blender image ''' ext = '.' + extFromFormat(format) print ext # remove an extension if its alredy there if path.lower().endswith(ext): path = path[:-4] path_expand = sys.expandpath(path) + ext print path_expand, 'path' # Touch the path try: f = open(path_expand, 'w') f.close() except: raise 'Error, could not write to path:' + path_expand # RENDER THE FACES. scn = Scene.GetCurrent() render_scn = Scene.New() render_scn.makeCurrent() render_scn.Layers |= (1 << 20) - 1 # all layers enabled # Add objects into the current scene for ob in objects: render_scn.link(ob) render_context = render_scn.getRenderingContext() render_context.setRenderPath( '') # so we can ignore any existing path and save to the abs path. render_context.imageSizeX(width) render_context.imageSizeY(height) if smooth: render_context.enableOversampling(True) render_context.setOversamplingLevel(16) else: render_context.enableOversampling(False) render_context.setRenderWinSize(100) render_context.setImageType(format) render_context.enableExtensions(True) #render_context.enableSky() # No alpha needed. if alpha: render_context.alphaMode = 1 render_context.enableRGBAColor() else: render_context.alphaMode = 0 render_context.enableRGBColor() render_context.displayMode = 0 # fullscreen # New camera and object render_cam_data = Camera.New('ortho') render_cam_ob = Object.New('Camera') render_cam_ob.link(render_cam_data) render_scn.link(render_cam_ob) render_scn.objects.camera = render_cam_ob render_cam_data.type = 'ortho' # Position the camera if camera_matrix: render_cam_ob.setMatrix(camera_matrix) # We need to take into account the matrix scaling when setting the size # so we get the image bounds defined by the matrix # first get the x and y factors from the matrix. # To render the correct dimensions we must use the aspy and aspy to force the matrix scale to # override the aspect enforced by the width and weight. cent = Vector() * camera_matrix xvec = Vector(1, 0, 0) * camera_matrix yvec = Vector(0, 1, 0) * camera_matrix # zvec= Vector(0,0,1) * camera_matrix xlen = (cent - xvec).length # half height of the image ylen = (cent - yvec).length # half width of the image # zlen = (cent-zvec).length # dist to place the camera? - just use the loc for now. # less then 1.0 portrate, 1.0 or more is portrate asp_cam_mat = xlen / ylen # divide by zero? - possible but scripters fault. asp_image_res = float(width) / height #print 'asp quad', asp_cam_mat, 'asp_image', asp_image_res #print 'xylen', xlen, ylen, 'w/h', width, height # Setup the aspect if asp_cam_mat > asp_image_res: # camera is wider then image res. # to make the image wider, reduce the aspy asp_diff = asp_image_res / asp_cam_mat min_asp = asp_diff * 200 #print 'X', min_asp elif asp_cam_mat < asp_image_res: # asp_cam_mat < asp_image_res # camera is narrower then image res # to make the image narrower, reduce the aspx asp_diff = asp_cam_mat / asp_image_res min_asp = asp_diff * 200 #print 'Y', min_asp else: min_asp = 200 # set the camera size if xlen > ylen: if asp_cam_mat > asp_image_res: render_context.aspectX = 200 # get the greatest range possible render_context.aspectY = min_asp # get the greatest range possible else: render_context.aspectY = 200 # get the greatest range possible render_context.aspectX = min_asp # get the greatest range possible #print "xlen bigger" render_cam_data.scale = xlen * 2 elif xlen < ylen: # ylen is bigger if asp_cam_mat > asp_image_res: render_context.aspectX = 200 # get the greatest range possible render_context.aspectY = min_asp # get the greatest range possible else: render_context.aspectY = 200 # get the greatest range possible render_context.aspectX = min_asp # get the greatest range possible #print "ylen bigger" render_cam_data.scale = ylen * 2 else: # asppect 1:1 #print 'NOLEN Bigger' render_cam_data.scale = xlen * 2 #print xlen, ylen, 'xlen, ylen' else: if width > height: min_asp = int((float(height) / width) * 200) render_context.aspectX = min_asp render_context.aspectY = 200 else: min_asp = int((float(width) / height) * 200) render_context.aspectX = 200 render_context.aspectY = min_asp render_cam_data.scale = 1.0 render_cam_ob.LocZ = 1.0 render_cam_ob.LocX = 0.5 render_cam_ob.LocY = 0.5 Blender.Window.RedrawAll() render_context.render() render_context.saveRenderedImage(path) Render.CloseRenderWindow() #if not B.sys.exists(PREF_IMAGE_PATH_EXPAND): # raise 'Error!!!' scn.makeCurrent() Scene.Unlink(render_scn) # NOW APPLY THE SAVED IMAGE TO THE FACES! #print PREF_IMAGE_PATH_EXPAND try: target_image = Image.Load(path_expand) return target_image except: raise 'Error: Could not render or load the image at path "%s"' % path_expand return
scn2.makeCurrent() #Import frame_n = frame*100 tmp=input+name+str(frame_n)+".x3d" print tmp import_web3d.load_web3d(tmp) #Editing add parameters water = bpy.data.materials['blue'] for me in bpy.data.meshes: me.materials = [water] for me in bpy.data.objects: me.setSize(0.2,2,0.2) #Rendering scn2=Scene.GetCurrent() context = scn2.getRenderingContext() context.renderPath = output context.getRenderPath() context.render() context.saveRenderedImage(name+str(frame_n), 0) #Render.CloseRenderWindow() Window.RedrawAll() scn=Scene.Get('Scene') scn.makeCurrent() Scene.Unlink(scn2) print '+++end import+++'