Skip to content

Latest commit

 

History

History
454 lines (374 loc) · 15.1 KB

File metadata and controls

454 lines (374 loc) · 15.1 KB
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 即可。