Blender 2.8, 3D video making with Python, This time, we will move the camera along the circumference, specify the material for random numbers, and sunlight.
Click here for the video blender 2.8, python movie 1 sec. 360kB. camera motion along a circle.
If you make about 100 buildings (simply a rectangular parallelepiped), it will be 682kB even at 800px * 600px in 1 second. I still can't grasp the color specification and the light condition. I think that the blue color of the sky is reflected in the shadow of the building where the sunlight does not reach.
By the way, the conditions for a good program (source code). A good program that I write several times, forget, review, reuse, and think from my experience is like this. ◎ Moderately commented ◎ Variable names are in English or Roman letters and are meaningful. ◎ The setting parts are summarized so that variables (variable, parameter) can be easily changed later. ◎ (Unnecessary comment lines such as temporary use have been deleted) ◎ Write the citation source for the part copied from other materials (although it will disappear at the URL in a few years?)
# bpy_nh18 (random color, brown)2020/9/6th Sunday (still image brown flat plate and video brown building)
import bpy
import random
# ========= DELETE ALL mesh, light, camera,2 lines to delete all=========
for item in bpy.data.objects:
bpy.data.objects.remove(item)
# ======================== add cubes, random resize , random color
for x in range(16):
for y in range(16):
bpy.ops.mesh.primitive_cube_add(size=2.0, location=(4*x-4, 5*y-5, 0.0))
bpy.ops.transform.resize(value=(1.0, 1.0, (random.randint(2, 8))))
obj = bpy.context.view_layer.objects.active
mat = bpy.data.materials.new('Cube')
r1=0.15+ 0.8*random.random()
g1=0.07+ 0.3*random.random()
b1=0.01+ 0.05*random.random()
mat.diffuse_color = (r1, g1, b1, 0) #====== random BROWN COLOR
obj.data.materials.append(mat)
# Add a plane for ground ==================
bpy.ops.mesh.primitive_plane_add(size=200.0, align='WORLD', location=(0.0, 0.0, 0.0), rotation=(0.0, 0.0, 0.0) )
matp = bpy.data.materials.new('Plane')
matp.diffuse_color = (0.4, 0.2, 0.01, 0)
obj.data.materials.append(matp)
# ==================
# world - surface - background (background)
bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[0].default_value = (0.01, 0.15, 0.25, 1)
bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[1].default_value = 0.7
# ============== "light"
# create light datablock, set attributes
#light_data = bpy.data.lights.new(name="light_spot1", type='SPOT')
light_data = bpy.data.lights.new(name="light_spot1", type='SUN')
light_data.energy = 5
# create new object with our light datablock
light_object1 = bpy.data.objects.new(name="light_spot1", object_data=light_data)
# link light object
bpy.context.collection.objects.link(light_object1)
# make it active
bpy.context.view_layer.objects.active = light_object1
#change location
light_object1.location = (-3, -10, 50)
light_object1.delta_rotation_euler = (1.3, 0, -0.3) #Look straight down at zero zero zero.
# update scene, if needed
dg = bpy.context.evaluated_depsgraph_get()
dg.update()
# ================
# ================== ================= camera movement
bpy.ops.curve.primitive_bezier_circle_add(enter_editmode=False, align='WORLD', location=(20, 20, 30))
bpy.context.object.scale[0] = 50
bpy.context.object.scale[1] = 50
bpy.ops.object.empty_add(type='CUBE', align='WORLD', location=(0,0,0))
bpy.ops.object.camera_add(enter_editmode=False, align='VIEW', location=(0,0,0), rotation=(0, 0, 0))
bpy.data.objects['Empty'].select_set(True)
bpy.data.objects['Camera'].select_set(True)
bpy.context.view_layer.objects.active = bpy.data.objects['Empty']
bpy.ops.object.parent_set(type='OBJECT')
bpy.data.objects['Camera'].select_set(False)
bpy.data.objects['Empty'].select_set(True)
bpy.ops.object.constraint_add(type='FOLLOW_PATH')
bpy.context.object.constraints["Follow Path"].target = bpy.data.objects["BezierCircle"]
bpy.context.object.constraints["Follow Path"].use_curve_follow = True
bpy.context.object.constraints["Follow Path"].use_fixed_location = True
bpy.data.objects['Empty'].select_set(False)
bpy.data.objects['Camera'].select_set(True)
bpy.ops.object.constraint_add(type='TRACK_TO')
#bpy.context.object.constraints["Track To"].target = bpy.data.objects["Cube.016"]
bpy.context.object.constraints["Track To"].target = bpy.data.objects["Cube.052"]
bpy.context.object.constraints["Track To"].up_axis = 'UP_Y'
bpy.context.object.constraints["Track To"].track_axis = 'TRACK_NEGATIVE_Z' #5m00sec
#Camera Keyframe #(Insert keyframe to object's Offset Factor Python API - stack exchange)
bpy.data.objects['Camera'].select_set(False)
bpy.data.objects['Empty'].select_set(True)
bpy.context.scene.frame_current = 1
bpy.context.object.constraints["Follow Path"].offset_factor = 0
ob = bpy.context.object
# ob.constraints['Follow Path']
# bpy.data.objects['Empty'].constraints["Follow Path"]
# [bpy.data.objects['Empty'].constraints["Follow Path"]]
con = ob.constraints.get("Follow Path")
con.offset_factor = 0.0
con.keyframe_insert("offset_factor", frame=1)
con.offset_factor = 0.25
con.keyframe_insert("offset_factor", frame=8)
con.offset_factor = 0.50
con.keyframe_insert("offset_factor", frame=16)
con.offset_factor = 0.75
con.keyframe_insert("offset_factor", frame=23)
con.offset_factor = 0.99
con.keyframe_insert("offset_factor", frame=30)
# ==== END of camera movement
Recommended Posts