Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import bpy
- from bpy.props import *
- from math import pi
- # Load a font
- def load_font(font_path):
- """ Load a new TTF font into Blender, and return the font object """
- # get the original list of fonts (before we add a new one)
- original_fonts = bpy.data.fonts.keys()
- # load new font
- bpy.ops.font.open(filepath=font_path)
- # get the new list of fonts (after we added a new one)
- for font_name in bpy.data.fonts.keys():
- if font_name not in original_fonts:
- return bpy.data.fonts[font_name]
- # no new font was added
- return None
- # the stuff
- #
- # name: createDissolveText
- # @param
- # @return
- #
- def createDissolveText(title,extrude,bevel_depth,spacemode,textsize,width,font):
- """ Create aned animate the exploding texte """
- newText = title
- #create text
- bpy.ops.object.text_add(view_align=False, enter_editmode=False,location=(0, 0, 0), rotation=(0, 0, 0))
- ActiveObjectText = bpy.context.scene.objects.active
- newtext = bpy.context.scene.objects.active
- #erasing previous objects
- if bpy.context.scene.objects.active.name != 'Text':
- bpy.ops.object.select_all(action='DESELECT')
- #selecting and erasing Text
- bpy.context.scene.objects.active = bpy.data.objects['Text']
- bpy.context.scene.objects.active.select = True
- bpy.ops.object.delete(use_global=False)
- bpy.ops.object.select_all(action='DESELECT')
- #need to delete other objects
- bpy.ops.object.select_all(action='DESELECT')
- #selecting and erasing Turbulence field
- bpy.context.scene.objects.active = bpy.data.objects['TurbulenceField']
- bpy.context.scene.objects.active.select = True
- bpy.ops.object.delete(use_global=False)
- bpy.ops.object.select_all(action='DESELECT')
- #selecting and erasing Plane
- bpy.context.scene.objects.active = bpy.data.objects['Plane']
- bpy.context.scene.objects.active.select = True
- bpy.ops.object.delete(use_global=False)
- bpy.ops.object.select_all(action='DESELECT')
- #selecting and erasing WindField
- bpy.context.scene.objects.active = bpy.data.objects['WindField']
- bpy.context.scene.objects.active.select = True
- bpy.ops.object.delete(use_global=False)
- #selecting newText
- bpy.context.scene.objects.active = newtext
- bpy.context.scene.objects.active.select = True
- #naming/renaming the text
- bpy.context.scene.objects.active.name = 'Text';
- bpy.context.scene.objects.active = bpy.data.objects['Text']
- #placing text in position
- ActiveObjectText.rotation_euler[0]=pi/2 #xaxis
- ActiveObjectText.rotation_euler[1]=0.0 #yaxis
- ActiveObjectText.rotation_euler[2]=0.0 #zaxis
- ActiveObjectText.location[0]=0
- ActiveObjectText.location[1]=0
- ActiveObjectText.location[2]=0
- #changing text
- ActiveObjectText.data.body = title
- #text size
- ActiveObjectText.data.size = textsize
- ActiveObjectText.data.space_character = width
- ActiveObjectText.data.font = font
- #centering text
- #ActiveObjectText.data.align='CENTER'
- ActiveObjectText.data.align=spacemode
- #extrude text
- ActiveObjectText.data.extrude=extrude #0.04
- #bevel text
- ActiveObjectText.data.bevel_depth = bevel_depth #0.005
- ActiveObjectText.data.bevel_resolution = 5
- #adjust text position
- ActiveObjectText.location.z= -ActiveObjectText.dimensions[1]/3
- #convert to mesh to apply effect
- bpy.ops.object.convert(target='MESH', keep_original=False)
- #affect dissolve material
- ActiveObjectText.data.materials.append(bpy.data.materials['DissolveMaterial'])
- ActiveObjectText = bpy.context.scene.objects.active
- #Don't forget to deselect before select!
- bpy.ops.object.select_all(action='DESELECT')
- #selecting Text
- bpy.context.scene.objects.active = ActiveObjectText
- bpy.context.scene.objects.active.select = True
- #add remesh modifier to text
- bpy.ops.object.modifier_add(type='REMESH')
- #modifying parameters
- ActiveObjectText.modifiers['Remesh'].octree_depth = 9 #10 best quality but vertices number too high
- ActiveObjectText.modifiers['Remesh'].scale=0.99
- ActiveObjectText.modifiers['Remesh'].mode='SMOOTH'
- ActiveObjectText.modifiers['Remesh'].remove_disconnected_pieces=False
- #apply this mofifier
- bpy.ops.object.modifier_apply(apply_as='DATA', modifier="Remesh")
- #Nb quads for particle system be careful of API version
- if bpy.app.version[1] < 62 :
- NbQuads = len(ActiveObjectText.data.faces)
- if bpy.app.version[1] == 62 :
- if bpy.app.version[2] >= 2 :
- NbQuads = len(ActiveObjectText.data.polygons.values()) #API 2.62.2 and up
- else:
- NbQuads = len(ActiveObjectText.data.faces)
- if bpy.app.version[1] > 62 :
- NbQuads = len(ActiveObjectText.data.polygons.values()) #API 2.63 and up
- #Add Particle System
- bpy.ops.object.particle_system_add()
- #Particle parameters
- ActiveObjectText.particle_systems['ParticleSystem'].settings.count = NbQuads
- ActiveObjectText.particle_systems['ParticleSystem'].settings.frame_start = 10
- ActiveObjectText.particle_systems['ParticleSystem'].settings.frame_end = 60
- ActiveObjectText.particle_systems['ParticleSystem'].settings.lifetime = 80
- ActiveObjectText.particle_systems['ParticleSystem'].point_cache.frame_step = 1
- ActiveObjectText.particle_systems['ParticleSystem'].settings.normal_factor = 0.0
- #not useful
- ActiveObjectText.particle_systems['ParticleSystem'].settings.use_dynamic_rotation = True
- ActiveObjectText.particle_systems['ParticleSystem'].settings.render_type='NONE'
- ActiveObjectText.particle_systems['ParticleSystem'].settings.draw_method='DOT'
- ActiveObjectText.particle_systems['ParticleSystem'].settings.effector_weights.gravity = 0
- ActiveObjectText.particle_systems['ParticleSystem'].settings.adaptive_subframes = True
- ActiveObjectText.particle_systems['ParticleSystem'].settings.courant_target = 0.2
- bpy.ops.object.select_all(action='DESELECT')
- #Adding Wind force field on center and rotate it -90 on Y
- bpy.ops.object.effector_add(type='WIND', view_align=False, enter_editmode=False, location=(0, 0, 0), rotation=(0, -pi/2, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
- ActiveObjectWindField = bpy.context.scene.objects.active
- ActiveObjectWindField.name = 'WindField'
- #settings
- ActiveObjectWindField.field.strength = 1.0
- ActiveObjectWindField.field.flow = 1.0
- ActiveObjectWindField.field.noise = 0.0
- ActiveObjectWindField.field.seed = 27
- ActiveObjectWindField.field.apply_to_location = True
- ActiveObjectWindField.field.apply_to_rotation = True
- ActiveObjectWindField.field.use_absorption = False
- #Adding Turbulence Force Field
- bpy.ops.object.effector_add(type='TURBULENCE', view_align=False, enter_editmode=False, location=(0, 0, 0), rotation=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
- ActiveObjectTurbulenceField = bpy.context.scene.objects.active
- ActiveObjectTurbulenceField.name = 'TurbulenceField'
- #settings
- ActiveObjectTurbulenceField.field.strength = 15
- ActiveObjectTurbulenceField.field.size = 0.75
- ActiveObjectTurbulenceField.field.flow = 0.5
- ActiveObjectTurbulenceField.field.seed = 23
- ActiveObjectTurbulenceField.field.apply_to_location = True
- ActiveObjectTurbulenceField.field.apply_to_rotation = True
- ActiveObjectTurbulenceField.field.use_absorption = False
- #Don't forget to deselect before select!
- bpy.ops.object.select_all(action='DESELECT')
- #selecting Text
- bpy.context.scene.objects.active = ActiveObjectText
- bpy.context.scene.objects.active.select = True
- #adding wipe texture to text
- sTex = bpy.data.textures.new('Wipe', type = 'BLEND')
- sTex.use_color_ramp = True
- TexSlot=ActiveObjectText.particle_systems['ParticleSystem'].settings.texture_slots.add()
- TexSlot.texture = sTex
- bpy.ops.object.select_all(action='DESELECT')
- #Create plane for controlling action of particle system (based on time)
- #if text is created on the fly 'Wipe' texture does not work! don't know really why!
- # so use of an existing plane, and resize it to the text x dimension
- bpy.ops.mesh.primitive_plane_add(view_align=False, enter_editmode=False, location=(0, 0, 0), rotation=(pi/2, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
- ActiveObjectPlane = bpy.context.scene.objects.active
- ActiveObjectPlane.name = 'Plane'
- #Change dimensions
- ActiveObjectPlane.dimensions = ((ActiveObjectText.dimensions[0]*1.2),(ActiveObjectText.dimensions[1]*1.2),0)
- #hide plane for render
- ActiveObjectPlane.hide_render = True
- #show as wire in 3D
- ActiveObjectPlane.draw_type = 'WIRE'
- bpy.ops.object.select_all(action='DESELECT')
- #selecting Text
- bpy.context.scene.objects.active = ActiveObjectText
- bpy.context.scene.objects.active.select = True
- TexSlot.texture_coords = 'OBJECT'
- TexSlot.object = ActiveObjectPlane
- TexSlot.use_map_time = True
- ActiveObjectText.data.update()
- bpy.ops.object.modifier_add(type='EXPLODE')
- bpy.ops.mesh.uv_texture_add() #name UVMap by default
- ActiveObjectText.data.materials['DissolveMaterial'].texture_slots['Texture'].texture_coords = 'UV'
- ActiveObjectText.data.materials['DissolveMaterial'].texture_slots['Texture'].uv_layer = 'UVMap'
- ActiveObjectText.data.materials['DissolveMaterial'].texture_slots['Texture'].use_map_alpha = True
- ActiveObjectText.data.materials['DissolveMaterial'].texture_slots['Texture'].alpha_factor = 1.0
- ActiveObjectText.modifiers['Explode'].particle_uv = 'UVMap'
- ActiveObjectText.data.update()
- #Don't forget to deselect before select!
- bpy.ops.object.select_all(action='DESELECT')
- #selecting Text
- bpy.context.scene.objects.active = ActiveObjectText
- bpy.context.scene.objects.active.select = True
- TexSlot.texture_coords = 'OBJECT'
- TexSlot.object = ActiveObjectPlane
- TexSlot.use_map_time = False
- TexSlot.use_map_time = True
- ActiveObjectText.data.update()
- # Debug Info:
- # ./blender -b test.blend -P demo.py
- # -b = background mode
- # -P = run a Python script within the context of the project file
- # Init all of the variables needed by this script. Because Blender executes
- # this script, OpenShot will inject a dictionary of the required parameters
- # before this script is executed.
- params = {
- 'title' : 'Oh Yeah! OpenShot!',
- 'extrude' : 0.05,
- 'bevel_depth' : 0.01,
- 'spacemode' : 'CENTER',
- 'text_size' : 1,
- 'width' : 1.0,
- 'fontname' : 'Bfont',
- 'color' : [0.8,0.8,0.8],
- 'alpha' : 1.0,
- 'output_path' : '/tmp/',
- 'fps' : 24,
- 'quality' : 90,
- 'file_format' : 'PNG',
- 'color_mode' : 'RGBA',
- 'horizon_color' : [0, 0, 0],
- 'resolution_x' : 1920,
- 'resolution_y' : 1080,
- 'resolution_percentage' : 100,
- 'start_frame' : 20,
- 'end_frame' : 25,
- 'animation' : True,
- }
- #BEGIN INJECTING PARAMS
- params['specular_color'] = [1.0, 1.0, 1.0]
- params['fontname'] = '/home/szenya/.fonts/AugieHU.ttf'
- params['specular_intensity'] = 0.5
- params['start_frame'] = 1
- params['spacemode'] = 'CENTER'
- params['title'] = '2014 őszén'
- params['file_name'] = '2014autumn_1'
- params['diffuse_color'] = [0.8045591138945669, 0.37867625092984036, 0.05637409755197975]
- params['end_frame'] = 128
- params['extrude'] = 0.05
- params['bevel_depth'] = 0.01
- params['text_size'] = 1.0
- params['width'] = 1.0
- params['animation_speed'] = '1'
- params['resolution_y'] = 720
- params['resolution_x'] = 1280
- params['file_format'] = 'PNG'
- params['resolution_percentage'] = 100
- params['color_mode'] = 'RGBA'
- params['output_path'] = '/home/szenya/.openshot/blender/17171cca-e8fe-11e3-b76c-28924a1b2703/2014autumn_1'
- params['fps'] = 23
- params['quality'] = 100
- params['animation'] = True
- #END INJECTING PARAMS
- # The remainder of this script will modify the current Blender .blend project
- # file, and adjust the settings. The .blend file is specified in the XML file
- # that defines this template in OpenShot.
- #----------------------------------------------------------------------------
- # Modify Text / Curve settings
- #print (bpy.data.curves.keys())
- #text_object = bpy.data.curves["txtName1"]
- #text_object.extrude = params["extrude"]
- #text_object.bevel_depth = params["bevel_depth"]
- #text_object.body = params["title"]
- #text_object.align = params["spacemode"]
- #text_object.size = params["text_size"]
- #text_object.space_character = params["width"]
- # Get font object
- font = None
- if params["fontname"] != "Bfont":
- # Add font so it's available to Blender
- font = load_font(params["fontname"])
- else:
- # Get default font
- font = bpy.data.fonts["Bfont"]
- createDissolveText(params["title"],params["extrude"],params["bevel_depth"],params["spacemode"],params["text_size"],params["width"], font)
- # Change the material settings (color, alpha, etc...)
- material_object = bpy.data.materials["DissolveMaterial"]
- material_object.diffuse_color = params["diffuse_color"]
- material_object.specular_color = params["specular_color"]
- material_object.specular_intensity = params["specular_intensity"]
- #don't modify alpha!!!!!
- #material_object.alpha = params["alpha"]
- # Set the render options. It is important that these are set
- # to the same values as the current OpenShot project. These
- # params are automatically set by OpenShot
- bpy.context.scene.render.filepath = params["output_path"]
- bpy.context.scene.render.fps = params["fps"]
- #bpy.context.scene.render.quality = params["quality"]
- try:
- bpy.context.scene.render.file_format = params["file_format"]
- bpy.context.scene.render.color_mode = params["color_mode"]
- except:
- bpy.context.scene.render.image_settings.file_format = params["file_format"]
- bpy.context.scene.render.image_settings.color_mode = params["color_mode"]
- bpy.data.worlds[0].horizon_color = params["horizon_color"]
- bpy.context.scene.render.resolution_x = params["resolution_x"]
- bpy.context.scene.render.resolution_y = params["resolution_y"]
- bpy.context.scene.render.resolution_percentage = params["resolution_percentage"]
- bpy.context.scene.frame_start = params["start_frame"]
- bpy.context.scene.frame_end = params["end_frame"]
- # Animation Speed (use Blender's time remapping to slow or speed up animation)
- animation_speed = int(params["animation_speed"]) # time remapping multiplier
- new_length = int(params["end_frame"]) * animation_speed # new length (in frames)
- bpy.context.scene.frame_end = new_length
- bpy.context.scene.render.frame_map_old = 1
- bpy.context.scene.render.frame_map_new = animation_speed
- if params["start_frame"] == params["end_frame"]:
- bpy.context.scene.frame_start = params["end_frame"]
- bpy.context.scene.frame_end = params["end_frame"]
- # Render the current animation to the params["output_path"] folder
- bpy.ops.render.render(animation=params["animation"])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement