示例#1
0
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
示例#2
0
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+++'