LoginSignup
0
0

Blender 4.1, Python 立方体 、照明、カメラ円周移動

Posted at

Blender 4.1, Python 立方体 、照明、カメラ円周移動

古い記事「Blender 2.8, Python 立方体 、照明、カメラ円周移動」の改良版です。blender 4.1.1向けにフレーム指定部分など変更。
これで照明も移動、カメラも移動していますが
謎のエラー[Performance Warning] cache is full (Size: 64), vertex descriptor will not be cached が出ています。

# bpy_nh41 照明移動,立方体移動 (nh13 kairyo)  後半カメラ移動
import bpy
# DELETE ALL mesh, light, camera, みな削除する2行
for item in bpy.data.objects:
    bpy.data.objects.remove(item)

#立方体 original script は  ---- http://tips.hecomi.com/entry/20120818/1345307205
#拡大参考資料 tatsuruM Qiita https://qiita.com/tatsuruM/items/9d4222c6c7d96b4c5b3c

START = 0
#END   = 100
N     = 4

# Add color cubes
for x in range(0, N):
    for y in range(0, N):
        for z in range(0, N):
            # Add a color cube
            bpy.ops.mesh.primitive_cube_add( location=(x*3, y*3, z*3),size = (1.2) )
            bpy.ops.transform.resize(value=(0.8, 0.1, 2.0))
            bpy.ops.transform.rotate(value= -3.1415/6 ,orient_axis='X')
            obj = bpy.context.view_layer.objects.active
            mat = bpy.data.materials.new('Cube')
            mat.diffuse_color = (x/N, y/N, z/N, 0)
            obj.data.materials.append(mat)

# new lamps ( stack overflow Can you add a light source in blender using python)
# =============="light_spot3"
# create light datablock, set attributes
light_data = bpy.data.lights.new(name="light_spot3", type='SPOT')
light_data.energy = 2000
# create new object with our light datablock
light_object = bpy.data.objects.new(name="light_spot3", object_data=light_data)
# link light object
bpy.context.collection.objects.link(light_object)
# make it active 
bpy.context.view_layer.objects.active = light_object
#change location
light_object.location = (2, -2, 3)
light_object.delta_rotation_euler = (1.6, 0, 0) #ゼロゼロゼロで真下を向く。
# update scene, if needed
dg = bpy.context.evaluated_depsgraph_get() 
dg.update()

# =============="light_spot2"
# create light datablock, set attributes
light_data = bpy.data.lights.new(name="light_spot2", type='SPOT')
light_data.energy = 2000
# create new object with our light datablock
light_object = bpy.data.objects.new(name="light_spot2", object_data=light_data)
# link light object
bpy.context.collection.objects.link(light_object)
# make it active 
bpy.context.view_layer.objects.active = light_object
#change location
light_object.location = (2, -4, 10)
light_object.delta_rotation_euler = (1.5, 0, 0) #ゼロゼロゼロで真下を向く。
# update scene, if needed
dg = bpy.context.evaluated_depsgraph_get() 
dg.update()
# ============== "light_spot1"
# create light datablock, set attributes
light_data = bpy.data.lights.new(name="light_spot1", type='SPOT')
light_data.energy = 3000
# 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 = (5, -5, 10)
light_object1.delta_rotation_euler = (1.3, 0, -0.3) #ゼロゼロゼロで真下を向く。
# update scene, if needed
dg = bpy.context.evaluated_depsgraph_get() 
dg.update()
# ================

#  MOVE  SPOT LIGHTs  "light_spot1"
bpy.context.scene.frame_start = 1
bpy.context.scene.frame_end = 30
bpy.context.scene.frame_current = 10
# make light ACTIVE 
bpy.context.scene.objects["light_spot3"].select_set(False) # ----- deselect
bpy.context.scene.objects["light_spot2"].select_set(False) # ----- deselect
bpy.context.scene.objects["light_spot1"].select_set(True) #---- select

cdnow  = bpy.context.object          # get ACTIVE object 
bpy.context.scene.frame_set(1) # set frame to 1 ### NEW2024

cdnow.location = (4, 2, 2) # set the location
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME

bpy.context.scene.frame_set(10) # set frame to 10 ### NEW2024
cdnow.location = (5, 2, 4) # set the location
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME

bpy.context.scene.frame_set(20) # set frame to 20 ### NEW2024
cdnow.location = (6, 2, 6)
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME

bpy.context.scene.frame_set(30) # set frame to 30 ### NEW2024
cdnow.location = (7, 2, 8)
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME
# ================
#  MOVE a LIGHT  mesh with KEY FRAME spot 2 照明の移動  light_spot2
bpy.context.scene.frame_start = 1
bpy.context.scene.frame_end = 30
bpy.context.scene.frame_current = 10

# make POINT  light ACTIVE 
bpy.context.scene.objects["light_spot3"].select_set(False) # ----- deselect
bpy.context.scene.objects["light_spot1"].select_set(False) # ----- deselect
bpy.context.scene.objects["light_spot2"].select_set(True) #---- select

#cdnow  = bpy.context.object          # get ACTIVE object 
cdnow  = bpy.context.scene.objects["light_spot2"]    # get ACTIVE object 

bpy.context.scene.frame_set(1) # set frame to 1
cdnow.location = (1,1,10) # set the location
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME

bpy.context.scene.frame_set(10) # set frame to 10
cdnow.location = (1,2,9) # set the location
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME

bpy.context.scene.frame_set(20) # set frame to 20
cdnow.location = (4,3,8)
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME

bpy.context.scene.frame_set(30) # set frame to 30
cdnow.location = (1,4,7)
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME
#  ==================
#  MOVE a LIGHT  mesh with KEY FRAME spot 3 照明の移動  light_spot3
bpy.context.scene.frame_start = 1
bpy.context.scene.frame_end = 30
bpy.context.scene.frame_current = 10

# make POINT  light ACTIVE 
bpy.context.scene.objects["light_spot2"].select_set(False) # ----- deselect
bpy.context.scene.objects["light_spot1"].select_set(False) # ----- deselect
bpy.context.scene.objects["light_spot3"].select_set(True)   #---- select

#cdnow  = bpy.context.object          # get ACTIVE object 
cdnow  = bpy.context.scene.objects["light_spot3"]    # get ACTIVE object 

bpy.context.scene.frame_set(1) # set frame to 1
cdnow.location = (5,-6,1) # set the location
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME

bpy.context.scene.frame_set(10) # set frame to 10
cdnow.location = (9,-6,1) # set the location
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME

bpy.context.scene.frame_set(20) # set frame to 20
cdnow.location = (9,-6,5)
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME

bpy.context.scene.frame_set(30) # set frame to 30
cdnow.location = (5,-6,1)
bpy.ops.anim.keyframe_insert_menu(type='Location') # KEY FRAME
#  ==================
# world - surface - 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            

#  ================== ================= camera movement
#bpy.ops.mesh.primitive_monkey_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0))

bpy.ops.curve.primitive_bezier_circle_add(enter_editmode=False, align='WORLD', location=(0, 0, 0))
bpy.context.object.scale[0] = 6
bpy.context.object.scale[1] = 6
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["BézierCircle"]

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["Suzanne"]
bpy.context.object.constraints["Track To"].target = bpy.data.objects["Cube.016"]
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.1
con.keyframe_insert("offset_factor", frame=8)
con.offset_factor = 0.15
con.keyframe_insert("offset_factor", frame=16)
con.offset_factor = 0.2
con.keyframe_insert("offset_factor", frame=18)
con.offset_factor = 0.0
con.keyframe_insert("offset_factor", frame=30)

# ===== end of bph_41 (2024.5.7)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0