Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0736
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在:
个人网站: `https://oeasy.org`
蓝桥云课: `https://www.lanqiao.cn/courses/3584`
GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
Gitee: `https://gitee.com/overmind1980/oeasypython`
---import bpy
bpy.ops.mesh.primitive_uv_sphere_add(location=(0, 0, 1), radius=0.5)
sphere1 = bpy.context.object
frame_start = 1
frame_end = 60
bpy.ops.mesh.primitive_plane_add()
plane = bpy.context.object
plane.scale = (10,10,1)
plane.location = (0,0,-8.5)
mat1 = bpy.data.materials.new(name="RedMaterial")
mat1.diffuse_color = (1, 0, 0, 1)
sphere1.data.materials.append(mat1)
sphere1.location = (0, 0, 1)
sphere1.keyframe_insert(data_path="location", frame=frame_start)
for frame in range(frame_start + 1, 40):
t = (frame - frame_start) / (30 - frame_start)
sphere1.location[2] = 1 - 9.8 * t**2
sphere1.keyframe_insert(data_path="location", frame=frame)
for frame in range(30, 60):
t = (frame - 30) / (60 - 30)
sphere1.location[2] = (1 - 9.8 * (1 - t)**2) * 0.8
sphere1.keyframe_insert(data_path="location", frame=frame)
bpy.context.scene.frame_end = frame_end
import bpy
def clear_scene():
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
def create_ball():
mat = bpy.data.materials.new('color')
color = (0.8,0,0.7,1)
mat.diffuse_color = color
bpy.ops.mesh.primitive_ico_sphere_add()
ball = bpy.context.object
ball.data.materials.append(mat)
bpy.ops.object.modifier_add(type='SUBSURF')
ball.location = (0,0,0)
ball.name = "ball"
bpy.ops.rigidbody.object_add()
bpy.context.object.rigid_body.type = 'ACTIVE'
bpy.context.object.rigid_body.collision_shape = 'SPHERE'
bpy.context.object.rigid_body.restitution = 1
ball.location = (0.0, 0.0, 8.0)
def create_baffle():
mat = bpy.data.materials.new('color')
color = (0,0,0,1)
mat.diffuse_color = color
bpy.ops.mesh.primitive_cube_add()
baffle = bpy.context.object
baffle.data.materials.append(mat)
baffle.location = (-0.24020875990390778, -0.07396510243415833, -2.6851580142974854)
baffle.scale = (1.0, 3.4946341514587402, 0.28479230403900146)
baffle.rotation_euler = (-0.31784337759017944, -0.07638333737850189, -0.015847958624362946)
baffle.name = "baffle"
bpy.ops.rigidbody.object_add()
bpy.context.object.rigid_body.type = 'PASSIVE'
bpy.context.object.rigid_body.collision_shape = 'BOX'
bpy.context.object.rigid_body.restitution = 1
def create_baffle1():
mat = bpy.data.materials.new('color')
color = (0,0,0,1)
mat.diffuse_color = color
bpy.ops.mesh.primitive_cube_add()
baffle1 = bpy.context.object
baffle1.data.materials.append(mat)
baffle1.location = (-2.54021954536438, 16.80886459350586, -4.464105606079102)
baffle1.scale = (1.0, 3.4946341514587402, 0.28479230403900146)
baffle1.rotation_euler = (0.6635540723800659, 0.013395832851529121, -0.055644068866968155)
baffle1.name = "baffle1"
bpy.ops.rigidbody.object_add()
bpy.context.object.rigid_body.type = 'PASSIVE'
bpy.context.object.rigid_body.collision_shape = 'BOX'
bpy.context.object.rigid_body.restitution = 1
def create_camera():
bpy.ops.object.camera_add()
camera = bpy.context.object
camera.location = (17.68950843811035, 0.7447772026062012, 1.855381727218628)
camera.rotation_euler = (1.5902100801467896, 0.01233603060245514, 1.3396356105804443)
camera.data.lens = 21.215633392333984
bpy.context.scene.camera = camera
camera.keyframe_insert(data_path="rotation_euler", frame=0)
camera.data.keyframe_insert(data_path="lens", frame=0)
camera.rotation_euler = (1.4862093925476074, -0.045128922909498215, 1.565578818321228)
camera.data.lens = 58.446895599365234
camera.keyframe_insert(data_path="rotation_euler", frame=60)
camera.data.keyframe_insert(data_path="lens", frame=60)
camera.rotation_euler = (1.4862093925476074, -0.045128922909498215, 1.565578818321228)
camera.data.lens = 58.446895599365234
camera.keyframe_insert(data_path="rotation_euler", frame=120)
camera.data.keyframe_insert(data_path="lens", frame=120)
camera.rotation_euler = (1.4862093925476074, -0.045128922909498215, 1.565578818321228)
camera.data.lens = 58.446895599365234
bpy.ops.object.constraint_add(type='TRACK_TO')
bpy.context.object.constraints["标准跟随"].track_axis = 'TRACK_NEGATIVE_Z'
bpy.context.object.constraints["标准跟随"].target = bpy.data.objects["ball"]
bpy.context.object.constraints["标准跟随"].track_axis = 'TRACK_NEGATIVE_Z'
bpy.context.object.constraints["标准跟随"].up_axis = 'UP_X'
bpy.context.object.constraints["标准跟随"].use_target_z = True
def create_flat():
mat = bpy.data.materials.new('color')
color = (0,0,0,1)
mat.diffuse_color = color
bpy.ops.mesh.primitive_plane_add()
bpy.context.object.scale[2] = 100
bpy.context.object.scale[1] = 100
bpy.context.object.scale[0] = 100
bpy.context.object.location[2] = -20
bpy.ops.rigidbody.object_add()
bpy.context.object.rigid_body.type = 'PASSIVE'
bpy.context.object.rigid_body.collision_shape = 'BOX'
bpy.context.object.rigid_body.restitution = 1
def create_spot():
bpy.ops.object.light_add(type='SPOT')
spot = bpy.context.object
spot.location = (58.889373779296875, 0.7772595882415771, 44.32658004760742)
spot.rotation_euler = (0.8168144822120667, -4.290151593977498e-07, 1.5289099216461182)
spot.data.energy = 100000
bpy.ops.object.constraint_add(type='TRACK_TO')
bpy.context.object.constraints["Track To"].track_axis = 'TRACK_NEGATIVE_Z'
bpy.context.object.constraints["Track To"].target = bpy.data.objects["ball"]
bpy.context.object.constraints["Track To"].track_axis = 'TRACK_NEGATIVE_Z'
bpy.context.object.constraints["Track To"].up_axis = 'UP_X'
bpy.context.object.constraints["Track To"].use_target_z = True
def render():
bpy.context.scene.frame_end = 250
bpy.context.scene.render.resolution_x = 200
bpy.context.scene.render.resolution_y = 150
bpy.context.scene.render.resolution_percentage = 250
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.render.filepath = "/home/shiyanlou/Code/o"
bpy.ops.render.render(animation=True)
clear_scene()
create_ball()
create_baffle()
create_baffle1()
create_camera()
create_flat()
create_spot()
- 有生命的弹跳效果
import bpy
def clear_scene():
# clear current scene
bpy.ops.object.select_all(action="SELECT") # 选择所有物体
bpy.ops.object.delete() # 删除选定的物体
clear_scene()
def create_mcslime():
# Create inner slime
bpy.ops.mesh.primitive_cube_add(size=1, location=(0, 0, 0.5))
inner_cube = bpy.context.object
inner_cube.name = "slime"
inner_cube.scale = (0.8, 0.8, 0.8)
inner_material = bpy.data.materials.new(name="InnerMaterial")
inner_material.use_nodes = True
nodes = inner_material.node_tree.nodes
links = inner_material.node_tree.links
node_bsdf = nodes.get("Principled BSDF")
node_bsdf.inputs['Base Color'].default_value = (0, 1, 0, 1) # Green
node_bsdf.inputs['Roughness'].default_value = 0.5
node_emission = nodes.new(type="ShaderNodeEmission")
node_emission.inputs['Color'].default_value = (0, 1, 0, 1)
node_emission.inputs['Strength'].default_value = 1.0 #i want make it light a little
node_mix = nodes.new(type="ShaderNodeMixShader")
links.new(node_bsdf.outputs['BSDF'], node_mix.inputs[1])
links.new(node_emission.outputs['Emission'], node_mix.inputs[2])
node_output = nodes.get("Material Output")
links.new(node_mix.outputs['Shader'], node_output.inputs['Surface'])
inner_cube.data.materials.append(inner_material)
# Create outer jelly
bpy.ops.mesh.primitive_cube_add(size=1, location=(0, 0, 0))
outer_cube = bpy.context.object
outer_cube.name = "jelly"
outer_cube.scale = (1.4, 1.4, 1.4)
outer_material = bpy.data.materials.new(name="OuterMaterial")
outer_material.use_nodes = True
nodes = outer_material.node_tree.nodes
node_bsdf = nodes.get("Principled BSDF")
node_bsdf.inputs['Base Color'].default_value = (0, 1, 0, 0.5)
node_bsdf.inputs['Alpha'].default_value = 0.3 #make it transparency
node_bsdf.inputs['Roughness'].default_value = 0.1
outer_cube.data.materials.append(outer_material)
# Parent jelly to slime
outer_cube.parent = inner_cube
# Create eyes
bpy.ops.mesh.primitive_cube_add(size=0.2, location=(-0.25, -0.5, 0.07))
left_eye = bpy.context.object
left_eye.name = "left_eye"
left_eye_material = bpy.data.materials.new(name="eyeMaterial")
left_eye_material.use_nodes = True
nodes = left_eye_material.node_tree.nodes
node_bsdf_eye = nodes.get("Principled BSDF")
node_bsdf_eye.inputs['Base Color'].default_value = (0.1, 0.3, 0.1, 1) # Deeper gray-green
left_eye.data.materials.append(left_eye_material)
bpy.ops.mesh.primitive_cube_add(size=0.2, location=(0.25, -0.5, 0.07))
right_eye = bpy.context.object
right_eye.name = "right_eye"
right_eye.data.materials.append(left_eye_material)
# Create mouth
bpy.ops.mesh.primitive_cube_add(size=0.3, location=(0.08, -0.5, -0.2))
mouth = bpy.context.object
mouth.name = "mouth"
mouth.scale = (0.3, 0.2, 0.3)
mouth.data.materials.append(left_eye_material)
# Parent face elements to slime
left_eye.parent = inner_cube
right_eye.parent = inner_cube
mouth.parent = inner_cube
return inner_cube, outer_cube, left_eye, right_eye, mouth
inner_cube, outer_cube, left_eye, right_eye, mouth = create_mcslime()
#(bao cuo tai duo xiu le yi xia)
def create_plane():
bpy.ops.mesh.primitive_plane_add(location=(-3, 4, 0))
plane = bpy.context.object
plane.scale = (8, 10, 1)
ice_material = bpy.data.materials.new(name="iceMaterial")
ice_material.use_nodes = True
nodes = ice_material.node_tree.nodes
node_bsdf = nodes.get("Principled BSDF")
node_bsdf.inputs['Base Color'].default_value = (0.13, 0.27, 0.3, 1) # Brown color
node_bsdf.inputs['Roughness'].default_value = 0.13
node_bsdf.inputs['IOR'].default_value = 4
plane.data.materials.append(ice_material)
create_plane()
def create_camera():
bpy.ops.object.camera_add()
camera = bpy.context.object
camera.location = (4.56, -9.89, 2)
camera.rotation_euler = (1.5, 0, 0.5)
bpy.context.scene.camera = camera
create_camera()
def create_sun():
bpy.ops.object.light_add(type='SUN')
spot = bpy.context.object
spot.location = (-1.28, -3.32, 12.28)
spot.rotation_euler = (0.342, 0, -0.307)
spot.data.energy = 5
create_sun()
def combine_parts(parts):
#to make the animation better
bpy.ops.object.select_all(action='DESELECT')
for part in parts:
part.select_set(True)
bpy.context.view_layer.objects.active = parts[0]
# Join selected parts
bpy.ops.object.join()
combined_object = bpy.context.object
combined_object.name = "slimeee"
return combined_object
slimee_parts = [inner_cube, outer_cube, left_eye, right_eye, mouth]
slimee = combine_parts(slimee_parts)
#make animation
#i want it jump
def create_jump_animation(slimee):
bpy.context.scene.frame_end = 120
bpy.context.scene.frame_current = 120
for i in range(11):
if i % 2 == 0:
slimee.location = (0, 0, 0.45)
slimee.scale = (1.15, 1.15, 0.7) # Flatten slightly
else:
slimee.location = (0, 0, 2.8)
slimee.scale = (0.95, 0.95, 1.1) # Return to normal scale
slimee.keyframe_insert(data_path="location", frame=1 + i * 12, index=2)
slimee.keyframe_insert(data_path="scale", frame=1 + i * 12)
slimee.keyframe_insert(data_path="rotation_euler", frame=1, index=2)
for i in range(1, 6):
if i % 2 == 0:
slimee.rotation_euler[2] = 0.15
else:
slimee.rotation_euler[2] = -0.15
slimee.keyframe_insert(data_path="rotation_euler", frame=1 + i * 24, index=2)
create_jump_animation(slimee)
# Set rendering parameters
bpy.context.scene.render.resolution_x = 720
bpy.context.scene.render.resolution_y = 540
bpy.context.scene.render.image_settings.file_format = 'PNG'
# Render each frame and export as image file
for frame_num in range(1, 121): # From frame 1 to 120
bpy.context.scene.frame_set(frame_num)
bpy.ops.render.render(write_still=True)
import bpy
import random
from math import pi
def create_material(name, color):
mat = bpy.data.materials.new(name)
mat.use_nodes = False
mat.diffuse_color = color
return mat
def create_falling_coins():
# 清除场景
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
# 创建材质
materials = {
'gold': create_material('GoldMaterial', (1.0, 0.8, 0.0, 1.0)),
'floor': create_material('FloorMaterial', (0.2, 0.2, 0.2, 1.0))
}
# 创建地板
bpy.ops.mesh.primitive_plane_add(size=10, location=(0, 0, 0))
floor = bpy.context.object
floor.name = "Floor"
floor.data.materials.append(materials['floor'])
# 设置地板为被动刚体
bpy.ops.rigidbody.object_add(type='PASSIVE')
floor.rigid_body.collision_shape = 'BOX'
# 创建金币
for i in range(30):
# 随机位置
x = random.uniform(-3, 3)
y = random.uniform(-3, 3)
z = random.uniform(5, 10)
# 创建圆柱体作为金币
bpy.ops.mesh.primitive_cylinder_add(
radius=0.5,
depth=0.1,
vertices=32,
location=(x, y, z)
)
coin = bpy.context.object
coin.name = f"Coin_{i}"
coin.data.materials.append(materials['gold'])
# 随机旋转
coin.rotation_euler = (
random.uniform(0, pi),
random.uniform(0, pi),
random.uniform(0, pi)
)
# 设置为活动刚体
bpy.ops.rigidbody.object_add(type='ACTIVE')
coin.rigid_body.mass = 1.0
coin.rigid_body.collision_shape = 'CYLINDER'
coin.rigid_body.friction = 0.7
coin.rigid_body.restitution = 0.3 # 弹性
# 设置物理世界
if not bpy.context.scene.rigidbody_world:
bpy.ops.rigidbody.world_add()
scene = bpy.context.scene
scene.rigidbody_world.enabled = True
scene.rigidbody_world.point_cache.frame_start = 1
scene.rigidbody_world.point_cache.frame_end = 250
scene.rigidbody_world.solver_iterations = 10
scene.rigidbody_world.use_split_impulse = True
# 设置场景帧范围
scene.frame_start = 1
scene.frame_end = 250
return floor
if __name__ == "__main__":
create_falling_coins()
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。

