Skip to content

Latest commit

 

History

History
1055 lines (889 loc) · 36.2 KB

File metadata and controls

1055 lines (889 loc) · 36.2 KB
Error in user YAML: (<unknown>): did not find expected key while parsing a block mapping at line 1 column 1
---
show: step
version: 1.0 
enable_checker: true
- 本教程同步发布在: 
	- 个人网站: `https://oeasy.org` 
	- 蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
	- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
	- Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

  • oeasy Python 0726
  • 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。

python_blender

开始

  • 上次玩了动画
  • 可以把动画流程总结一下吗?

还原场景

import bpy

def clear_scene():
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete()

def create_man():
    mat = bpy.data.materials.new('blue')
    color = (0, 0, 1, 1)
    mat.diffuse_color = color
    man  = bpy.data.objects.new("man", None)
    bpy.data.collections["Collection"].objects.link(man)
    bpy.ops.mesh.primitive_uv_sphere_add()
    head = bpy.context.object
    head.location = (0,0,2.5)
    head.data.materials.append(mat)
    head.parent = man
    bpy.ops.mesh.primitive_cone_add()
    body = bpy.context.object
    body.location = (0,0,1)
    body.parent = man
    body.data.materials.append(mat)

def create_plane():
    bpy.ops.mesh.primitive_plane_add()
    plane = bpy.context.object
    plane.scale = (10,10,1)

def create_camera():
    bpy.ops.object.camera_add()
    camera = bpy.context.object
    camera.location = (3.059990406036377, -9.885231018066406, 12.905241966247559)
    camera.rotation_euler = (0.7260572910308838, -6.679311326251991e-09, 0.30019673705101013)
    bpy.context.scene.camera = camera

def create_spot():
    bpy.ops.object.light_add(type='SPOT')
    spot = bpy.context.object
    spot.location = (-1.2811667919158936, -3.316868543624878, 12.282358169555664)
    spot.rotation_euler = (0.34208473563194275, 1.8850268901360323e-08, -0.3071775436401367)
    spot.data.energy = 1000

def render():
    bpy.context.scene.render.resolution_x = 320
    bpy.context.scene.render.resolution_y = 240
    bpy.context.scene.render.resolution_percentage = 50
    bpy.context.scene.render.engine = 'CYCLES'
    bpy.context.scene.render.filepath = '/tmp/render2.png'
    bpy.ops.render.render(write_still=True)

clear_scene()
create_man()
create_plane()
create_camera()
create_spot()
render()

设置动画

  • 为人物增加关键帧
帧号 location
1 (0,0,0)
10 (10,0,0)
man.location = (0, 0, 0) 
man.keyframe_insert(data_path="location", frame=1)  
man.location = (10, 0, 0)
man.keyframe_insert(data_path="location", frame=10) 
  • 在layout视图中观察到
    • 关键
    • 人物动画

图片描述

  • 能动了吗?

观察

  • 在layout工作区
    • 观察man的时间轴
    • 确实有关键帧

图片描述

  • 能渲染出来吗

设置渲染

  • 切回Script工作区
    • 设置渲染动画
def render():
    bpy.context.scene.frame_end = 10
    bpy.context.scene.render.resolution_x = 200
    bpy.context.scene.render.resolution_y = 150
    bpy.context.scene.render.resolution_percentage = 50
    bpy.context.scene.render.engine = 'CYCLES'
    bpy.context.scene.render.filepath = "/home/shiyanlou/Code/o"
    bpy.ops.render.render(animation=True)
  • 点击运行按钮
    • 渲染起来

图片描述

安装序列查看工具

feh /home/shiyanlou/Code
  • 最终效果
    • 人物动了
    • 跑黑影里了

图片描述

  • 下面准备
    • 让灯光追踪角色

添加约束

  • 选中聚光灯spot
    • 约束调板
    • 添加对象约束

图片描述

设置约束

  • 约束类型为
    • Track to

图片描述

  • 将Track To目标
    • 设置为man

图片描述

  • 并设置z轴负向
    • 指向man

约束效果

  • 开启实时渲染模式

图片描述

  • 在layout工作区

图片描述

  • 将上述工作转化为代码

代码

import bpy

def clear_scene():
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete()

def create_man():
    mat = bpy.data.materials.new('blue')
    color = (0, 0, 1, 1)
    mat.diffuse_color = color
    man  = bpy.data.objects.new("man", None)
    bpy.data.collections["Collection"].objects.link(man)
    bpy.ops.mesh.primitive_uv_sphere_add()
    head = bpy.context.object
    head.location = (0,0,2.5)
    head.data.materials.append(mat)
    head.parent = man
    bpy.ops.mesh.primitive_cone_add()
    body = bpy.context.object
    body.location = (0,0,1)
    body.parent = man
    body.data.materials.append(mat)
    man.location = (0, 0, 0)
    man.keyframe_insert(data_path="location", frame=1)
    man.location = (10, 0, 0)
    man.keyframe_insert(data_path="location", frame=10)

def create_plane():
    bpy.ops.mesh.primitive_plane_add()
    plane = bpy.context.object
    plane.scale = (10,10,1)

def create_camera():
    bpy.ops.object.camera_add()
    camera = bpy.context.object
    camera.location = (3.059990406036377, -9.885231018066406, 12.905241966247559)
    camera.rotation_euler = (0.7260572910308838, -6.679311326251991e-09, 0.30019673705101013)
    bpy.context.scene.camera = camera

def create_spot():
    bpy.ops.object.light_add(type='SPOT')
    spot = bpy.context.object
    spot.location = (-1.2811667919158936, -3.316868543624878, 12.282358169555664)
    spot.rotation_euler = (0.34208473563194275, 1.8850268901360323e-08, -0.3071775436401367)
    spot.data.energy = 1000
    spot.constraints.new(type='TRACK_TO')
    spot.constraints["Track To"].track_axis = 'TRACK_NEGATIVE_Z'
    spot.constraints["Track To"].use_target_z = True
    spot.constraints["Track To"].up_axis = 'UP_X'
    spot.constraints["Track To"].target = bpy.data.objects["man"]

def render():
    bpy.context.scene.frame_end = 10
    bpy.context.scene.render.resolution_x = 200
    bpy.context.scene.render.resolution_y = 150
    bpy.context.scene.render.resolution_percentage = 50
    bpy.context.scene.render.engine = 'CYCLES'
    bpy.context.scene.render.filepath = "/home/shiyanlou/Code/o"
    bpy.ops.render.render(animation=True)

clear_scene()
create_man()
create_plane()
create_camera()
create_spot()
render()

问题

feh /home/shiyanlou/Code
  • 观察序列效果

图片描述

  • 摄影机没跟上

初始帧

  • 在layout工作区
    • 选中摄影机
    • 在第1帧
    • 设置rotation属性为关键帧

图片描述

调试摄影机

  • 开启 4视图模式

图片描述

调整视图

  • 将播放头移动到第10帧
    • 并将 透视图 设置为
    • 摄影机看到的画面

图片描述

调整旋转

  • 在保证
    • 摄影机位置不变的基础上
    • 调整摄影机的旋转角度
      • 蓝色轴控制z轴旋转
      • 红绿轴控制xy轴旋转

图片描述

  • 观察最终位置
    • 并代码化

代码化

图片描述

  • 相应代码
import bpy

def clear_scene():
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete()

def create_man():
    mat = bpy.data.materials.new('blue')
    color = (0, 0, 1, 1)
    mat.diffuse_color = color
    man  = bpy.data.objects.new("man", None)
    bpy.data.collections["Collection"].objects.link(man)
    bpy.ops.mesh.primitive_uv_sphere_add()
    head = bpy.context.object
    head.location = (0,0,2.5)
    head.data.materials.append(mat)
    head.parent = man
    bpy.ops.mesh.primitive_cone_add()
    body = bpy.context.object
    body.location = (0,0,1)
    body.parent = man
    body.data.materials.append(mat)
    man.location = (0, 0, 0)
    man.keyframe_insert(data_path="location", frame=1)
    man.location = (10, 0, 0)
    man.keyframe_insert(data_path="location", frame=10)

def create_plane():
    bpy.ops.mesh.primitive_plane_add()
    plane = bpy.context.object
    plane.scale = (10,10,1)

def create_camera():
    bpy.ops.object.camera_add()
    camera = bpy.context.object
    camera.location = (3.059990406036377, -9.885231018066406, 12.905241966247559)
    camera.rotation_euler = (0.7260572910308838, -6.679311326251991e-09, 0.30019673705101013)
    bpy.context.scene.camera = camera    
    camera.keyframe_insert(data_path="rotation_euler", frame=1)
    camera.rotation_euler = (0.7763736844062805, -0.06353582441806793, -0.6263947486877441)
    camera.keyframe_insert(data_path="rotation_euler", frame=10)

def create_spot():
    bpy.ops.object.light_add(type='SPOT')
    spot = bpy.context.object
    spot.location = (-1.2811667919158936, -3.316868543624878, 12.282358169555664)
    spot.rotation_euler = (0.34208473563194275, 1.8850268901360323e-08, -0.3071775436401367)
    spot.data.energy = 1000
    spot.constraints.new(type='TRACK_TO')
    spot.constraints["Track To"].track_axis = 'TRACK_NEGATIVE_Z'
    spot.constraints["Track To"].use_target_z = True
    spot.constraints["Track To"].up_axis = 'UP_X'
    spot.constraints["Track To"].target = bpy.data.objects["man"]

def render():
    bpy.context.scene.frame_end = 10
    bpy.context.scene.render.resolution_x = 200
    bpy.context.scene.render.resolution_y = 150
    bpy.context.scene.render.resolution_percentage = 50
    bpy.context.scene.render.engine = 'CYCLES'
    bpy.context.scene.render.filepath = "/home/shiyanlou/Code/o"
    bpy.ops.render.render(animation=True)

clear_scene()
create_man()
create_plane()
create_camera()
create_spot()
render()

再观察

feh /home/shiyanlou/Code
  • 观察序列效果
    • 灯光和摄影机
      • 都开始跟着角色了

图片描述

  • 可以 把镜头
    • 推上来吗?

摄影机镜头推焦距

名称 时长
起幅 10帧
镜头焦距推 10帧
落幅 10帧
  • 将视图
    • 从4视图
    • 还原为单一视图

图片描述

  • 观察摄影机焦距
    • 50mm
  • 尝试推镜头

推镜头

  • 将镜头焦距
    • 设置为70 mm
    • 观察效果

图片描述

  • 将 推镜头 代码化

代码

import bpy

def clear_scene():
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete()

def create_man():
    mat = bpy.data.materials.new('blue')
    color = (0, 0, 1, 1)
    mat.diffuse_color = color
    man  = bpy.data.objects.new("man", None)
    bpy.data.collections["Collection"].objects.link(man)
    bpy.ops.mesh.primitive_uv_sphere_add()
    head = bpy.context.object
    head.location = (0,0,2.5)
    head.data.materials.append(mat)
    head.parent = man
    bpy.ops.mesh.primitive_cone_add()
    body = bpy.context.object
    body.location = (0,0,1)
    body.parent = man
    body.data.materials.append(mat)
    man.location = (0, 0, 0)
    man.keyframe_insert(data_path="location", frame=1)
    man.location = (10, 0, 0)
    man.keyframe_insert(data_path="location", frame=10)

def create_plane():
    bpy.ops.mesh.primitive_plane_add()
    plane = bpy.context.object
    plane.scale = (10,10,1)

def create_camera():
    bpy.ops.object.camera_add()
    camera = bpy.context.object
    camera.location = (3.059990406036377, -9.885231018066406, 12.905241966247559)
    camera.rotation_euler = (0.7260572910308838, -6.679311326251991e-09, 0.30019673705101013)
    bpy.context.scene.camera = camera    
    camera.keyframe_insert(data_path="rotation_euler", frame=1)
    camera.rotation_euler = (0.7763736844062805, -0.06353582441806793, -0.6263947486877441)
    camera.keyframe_insert(data_path="rotation_euler", frame=10)
    camera.data.lens = 50
    camera.data.keyframe_insert(data_path="lens", frame=20)
    camera.data.lens = 70
    camera.data.keyframe_insert(data_path="lens", frame=30)
    camera.data.lens = 70
    camera.data.keyframe_insert(data_path="lens", frame=40)
    

def create_spot():
    bpy.ops.object.light_add(type='SPOT')
    spot = bpy.context.object
    spot.location = (-1.2811667919158936, -3.316868543624878, 12.282358169555664)
    spot.rotation_euler = (0.34208473563194275, 1.8850268901360323e-08, -0.3071775436401367)
    spot.data.energy = 1000
    spot.constraints.new(type='TRACK_TO')
    spot.constraints["Track To"].track_axis = 'TRACK_NEGATIVE_Z'
    spot.constraints["Track To"].use_target_z = True
    spot.constraints["Track To"].up_axis = 'UP_X'
    spot.constraints["Track To"].target = bpy.data.objects["man"]
    

def render():
    bpy.context.scene.frame_end = 40
    bpy.context.scene.render.resolution_x = 200
    bpy.context.scene.render.resolution_y = 150
    bpy.context.scene.render.resolution_percentage = 50
    bpy.context.scene.render.engine = 'CYCLES'
    bpy.context.scene.render.filepath = "/home/shiyanlou/Code/o"
    bpy.ops.render.render(animation=True)

clear_scene()
create_man()
create_plane()
create_camera()
create_spot()
render()

观察最终效果

图片描述

  • 这次总共需要渲染40帧
feh /home/shiyanlou/Code
  • 可以在时间轴上看关键帧吗?

观看效果

  • 在dope sheet 中观察
    • 关键帧

图片描述

  • 摄影机的旋转
    • 1、10帧
  • 摄影机的焦距
    • 20、30、40帧

星球上的读书人

import bpy

def clear_scene():
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete()
    
def create_ball():
    bpy.ops.mesh.primitive_ico_sphere_add()
    ball = bpy.context.object
    bpy.ops.object.modifier_add(type='SUBSURF')
    ball.name = "ball"
    ball.scale = (10,10,10)
    ball.rotation_euler = (0.0, 3.071779489517212, -1.0297441482543945)
    ball.keyframe_insert(data_path="rotation_euler", frame=0)
    bpy.context.object.rotation_euler[0] = 17.0519
    ball.keyframe_insert(data_path="rotation_euler", frame=150)
    
def create_rainbow_material():
    # 创建材质并命名
    material = bpy.data.materials.new(name="RainbowMaterial")
    material.use_nodes = True
    nodes = material.node_tree.nodes
    links = material.node_tree.links

    # 删除所有材质节点
    for node in nodes:
        nodes.remove(node)

    # 创建新的材质节点
    texture_coord = nodes.new(type='ShaderNodeTexCoord')
    mapping = nodes.new(type='ShaderNodeMapping')
    separate_xyz = nodes.new(type='ShaderNodeSeparateXYZ')
    color_ramp = nodes.new(type='ShaderNodeValToRGB')
    principled_bsdf = nodes.new(type='ShaderNodeBsdfPrincipled')
    material_output = nodes.new(type='ShaderNodeOutputMaterial')

    # 设置节点位置
    texture_coord.location = (-800, 0)
    mapping.location = (-600, 0)
    separate_xyz.location = (-400, 0)
    color_ramp.location = (-200, 0)
    principled_bsdf.location = (0, 0)
    material_output.location = (200, 0)

    # 创建连接
    links.new(texture_coord.outputs['Generated'], mapping.inputs['Vector'])
    links.new(mapping.outputs['Vector'], separate_xyz.inputs['Vector'])
    links.new(separate_xyz.outputs['Z'], color_ramp.inputs['Fac'])
    links.new(color_ramp.outputs['Color'], principled_bsdf.inputs['Base Color'])
    links.new(principled_bsdf.outputs['BSDF'], material_output.inputs['Surface'])

    # 配置颜色渐变节点
    color_ramp.color_ramp.interpolation = 'EASE'

    # 添加新的颜色渐变元素
    element2 = color_ramp.color_ramp.elements.new(0.5)


    # 设置颜色渐变元素
    color_ramp.color_ramp.elements[0].color = (0.794, 0.363, 0.395, 1)
    color_ramp.color_ramp.elements[0].position = 0.0
    element2.color = (0.630, 1.0, 0.441, 1)
    element2.position = 0.5
    color_ramp.color_ramp.elements[2].color = (0.479, 0.735, 0.960, 1)
    color_ramp.color_ramp.elements[2].position = 1.0

    # 判断激活物体存在
    if bpy.context.object:
        # 替换为彩虹材质
        obj = bpy.context.object
        if obj.data.materials:
            obj.data.materials[0] = material
        else:
            obj.data.materials.append(material)
    
def create_torus():
    bpy.ops.mesh.primitive_torus_add()
    torus = bpy.context.object
    torus.name = "torus"
    mat = bpy.data.materials.new('color')
    color = (0.803592, 0.70071, 0.0675094, 1)
    mat.diffuse_color = color
    torus.data.materials.append(mat)
    torus.scale = (15,15,2)
    torus.rotation_euler = (-0.21212656795978546, -0.23622387647628784, 0.020109739154577255)
    torus.location = (0,0,0)
    torus.keyframe_insert(data_path="rotation_euler", frame=0)
    torus.rotation_euler = (-0.21212656795978546, -0.23622387647628784, 26.75855255126953)
    torus.keyframe_insert(data_path="rotation_euler", frame=150)
   
def create_head():
    bpy.ops.mesh.primitive_ico_sphere_add()
    head = bpy.context.object
    bpy.ops.object.modifier_add(type='SUBSURF')
    head.name = "head"
    mat = bpy.data.materials.new('color')
    color = (0.8, 0.8, 0.8, 1)
    mat.diffuse_color = color
    head.data.materials.append(mat)
    head.scale = (1,1,1)
    head.location = (-2.1824724674224854, 0.7955342531204224, 12.523728370666504)
    
def create_body():  
    bpy.ops.mesh.primitive_cone_add()
    body = bpy.context.object
    body.name = "body"
    mat = bpy.data.materials.new('color')
    color = (0.474279, 0.228282, 1, 1)
    mat.diffuse_color = color
    body.data.materials.append(mat)
    body.location = (-2.6806893348693848, 1.1509487628936768, 10.596158981323242)
    body.rotation_euler = (0.18971194326877594, 0.4859398603439331, -0.29056620597839355)
    body.scale = ((1.0, 1.0, 1.9299999475479126))

def create_leg1():
    bpy.ops.mesh.primitive_cone_add()
    leg1 = bpy.context.object
    leg1.name = "leg1"
    mat = bpy.data.materials.new('color')
    color = (0.778989, 0.793691, 0.800265, 1)
    mat.diffuse_color = color
    leg1.data.materials.append(mat)
    leg1.scale = (0.34,0.34,1.51)
    leg1.location = (-3.786320686340332, 3.3717470169067383, 8.656601905822754)
    leg1.rotation_euler = (-5.2796406745910645, 0.9296567440032959, -0.32371026277542114)
    leg1.keyframe_insert(data_path="location", frame=0) 
    leg1.keyframe_insert(data_path="rotation_euler", frame=0) 
    leg1.location = (-3.362586736679077, 2.960252285003662, 8.428167343139648)
    leg1.rotation_euler = (-5.632828712463379, 0.8834447264671326, -0.6590287089347839)
    leg1.keyframe_insert(data_path="location", frame=25) 
    leg1.keyframe_insert(data_path="rotation_euler", frame=25)
    leg1.location = (-3.786320686340332, 3.3717470169067383, 8.656601905822754)
    leg1.rotation_euler = (-5.2796406745910645, 0.9296567440032959, -0.32371026277542114)
    leg1.keyframe_insert(data_path="location", frame=50) 
    leg1.keyframe_insert(data_path="rotation_euler", frame=50)
    leg1.location = (-3.362586736679077, 2.960252285003662, 8.428167343139648)
    leg1.rotation_euler = (-5.632828712463379, 0.8834447264671326, -0.6590287089347839)
    leg1.keyframe_insert(data_path="location", frame=75) 
    leg1.keyframe_insert(data_path="rotation_euler", frame=75)
    leg1.location = (-3.786320686340332, 3.3717470169067383, 8.656601905822754)
    leg1.rotation_euler = (-5.2796406745910645, 0.9296567440032959, -0.32371026277542114)
    leg1.keyframe_insert(data_path="location", frame=100) 
    leg1.keyframe_insert(data_path="rotation_euler", frame=100) 
    leg1.location = (-3.362586736679077, 2.960252285003662, 8.428167343139648)
    leg1.rotation_euler = (-5.632828712463379, 0.8834447264671326, -0.6590287089347839)
    leg1.keyframe_insert(data_path="location", frame=125) 
    leg1.keyframe_insert(data_path="rotation_euler", frame=125)
    leg1.location = (-3.786320686340332, 3.3717470169067383, 8.656601905822754)
    leg1.rotation_euler = (-5.2796406745910645, 0.9296567440032959, -0.32371026277542114)
    leg1.keyframe_insert(data_path="location", frame=150) 
    leg1.keyframe_insert(data_path="rotation_euler", frame=150) 
    
def create_leg2():
    bpy.ops.mesh.primitive_cone_add()
    leg2 = bpy.context.object
    leg2.name = "leg2"
    mat = bpy.data.materials.new('color')
    color = (0.778989, 0.793691, 0.800265, 1)
    mat.diffuse_color = color
    leg2.data.materials.append(mat)
    leg2.scale = (0.34,0.34,1.51)
    leg2.location = (-4.535537242889404, 2.238474130630493, 8.171255111694336)
    leg2.rotation_euler = (-6.326724052429199, 0.8333261013031006, -0.6152930855751038)
    leg2.keyframe_insert(data_path="location", frame=0) 
    leg2.keyframe_insert(data_path="rotation_euler", frame=0) 
    leg2.location = (-4.637707233428955, 2.2374367713928223, 8.480690002441406)
    leg2.rotation_euler = (-5.987146854400635, 1.2056100368499756, -0.2856062650680542)
    leg2.keyframe_insert(data_path="location", frame=25) 
    leg2.keyframe_insert(data_path="rotation_euler", frame=25)
    leg2.location = (-4.535537242889404, 2.238474130630493, 8.171255111694336)
    leg2.rotation_euler = (-6.326724052429199, 0.8333261013031006, -0.6152930855751038)
    leg2.keyframe_insert(data_path="location", frame=50) 
    leg2.keyframe_insert(data_path="rotation_euler", frame=50)
    leg2.location = (-4.637707233428955, 2.2374367713928223, 8.480690002441406)
    leg2.rotation_euler = (-5.987146854400635, 1.2056100368499756, -0.2856062650680542)
    leg2.keyframe_insert(data_path="location", frame=75) 
    leg2.keyframe_insert(data_path="rotation_euler", frame=75)
    leg2.location = (-4.535537242889404, 2.238474130630493, 8.171255111694336)
    leg2.rotation_euler = (-6.326724052429199, 0.8333261013031006, -0.6152930855751038)
    leg2.keyframe_insert(data_path="location", frame=100) 
    leg2.keyframe_insert(data_path="rotation_euler", frame=100)
    leg2.location = (-4.637707233428955, 2.2374367713928223, 8.480690002441406)
    leg2.rotation_euler = (-5.987146854400635, 1.2056100368499756, -0.2856062650680542)
    leg2.keyframe_insert(data_path="location", frame=125) 
    leg2.keyframe_insert(data_path="rotation_euler", frame=125)
    leg2.location = (-4.535537242889404, 2.238474130630493, 8.171255111694336)
    leg2.rotation_euler = (-6.326724052429199, 0.8333261013031006, -0.6152930855751038)
    leg2.keyframe_insert(data_path="location", frame=150) 
    leg2.keyframe_insert(data_path="rotation_euler", frame=150)
   
   
def create_shoe1():
    bpy.ops.mesh.primitive_ico_sphere_add()
    shoe1 = bpy.context.object
    bpy.ops.object.modifier_add(type='SUBSURF')
    shoe1.name = "shoe1"
    mat = bpy.data.materials.new('color')
    color = (0.031554, 0.0365808, 0.800265, 1)
    mat.diffuse_color = color
    shoe1.data.materials.append(mat)
    shoe1.scale = (0.48,0.45,1.0)
    shoe1.location = (-5.622092247009277, 2.8525948524475098, 7.4785051345825195)
    shoe1.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe1.keyframe_insert(data_path="location", frame=0) 
    shoe1.keyframe_insert(data_path="rotation_euler", frame=0)
    shoe1.location = (-5.857794284820557, 2.989253282546997, 8.156514167785645)
    shoe1.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794) 
    shoe1.keyframe_insert(data_path="location", frame=25) 
    shoe1.keyframe_insert(data_path="rotation_euler", frame=25)
    shoe1.location = (-5.622092247009277, 2.8525948524475098, 7.4785051345825195)
    shoe1.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe1.keyframe_insert(data_path="location", frame=50) 
    shoe1.keyframe_insert(data_path="rotation_euler", frame=50)
    shoe1.location = (-5.857794284820557, 2.989253282546997, 8.156514167785645)
    shoe1.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794) 
    shoe1.keyframe_insert(data_path="location", frame=75) 
    shoe1.keyframe_insert(data_path="rotation_euler", frame=75)
    shoe1.location = (-5.622092247009277, 2.8525948524475098, 7.4785051345825195)
    shoe1.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe1.keyframe_insert(data_path="location", frame=100) 
    shoe1.keyframe_insert(data_path="rotation_euler", frame=100)
    shoe1.location = (-5.857794284820557, 2.989253282546997, 8.156514167785645)
    shoe1.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794) 
    shoe1.keyframe_insert(data_path="location", frame=125) 
    shoe1.keyframe_insert(data_path="rotation_euler", frame=125)
    shoe1.location = (-5.622092247009277, 2.8525948524475098, 7.4785051345825195)
    shoe1.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe1.keyframe_insert(data_path="location", frame=150) 
    shoe1.keyframe_insert(data_path="rotation_euler", frame=150)

def create_shoe2():
    bpy.ops.mesh.primitive_ico_sphere_add()
    shoe2 = bpy.context.object
    bpy.ops.object.modifier_add(type='SUBSURF')
    shoe2.name = "shoe2"
    mat = bpy.data.materials.new('color')
    color = (0.031554, 0.0365808, 0.800265, 1)
    mat.diffuse_color = color
    shoe2.data.materials.append(mat)
    shoe2.scale = (0.48,0.45,1.0)
    shoe2.location = (-4.0165605545043945, 4.648410797119141, 8.40798568725586)
    shoe2.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe2.keyframe_insert(data_path="location", frame=0) 
    shoe2.keyframe_insert(data_path="rotation_euler", frame=0)
    shoe2.location = (-3.5482606887817383, 4.443490505218506, 7.866168022155762)
    shoe2.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe2.keyframe_insert(data_path="location", frame=25) 
    shoe2.keyframe_insert(data_path="rotation_euler", frame=25)
    shoe2.location = (-4.0165605545043945, 4.648410797119141, 8.40798568725586)
    shoe2.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe2.keyframe_insert(data_path="location", frame=50) 
    shoe2.keyframe_insert(data_path="rotation_euler", frame=50)
    shoe2.location = (-3.5482606887817383, 4.443490505218506, 7.866168022155762)
    shoe2.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe2.keyframe_insert(data_path="location", frame=75) 
    shoe2.keyframe_insert(data_path="rotation_euler", frame=75)
    shoe2.location = (-4.0165605545043945, 4.648410797119141, 8.40798568725586)
    shoe2.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe2.keyframe_insert(data_path="location", frame=100) 
    shoe2.keyframe_insert(data_path="rotation_euler", frame=100)
    shoe2.keyframe_insert(data_path="location", frame=125) 
    shoe2.keyframe_insert(data_path="rotation_euler", frame=125)
    shoe2.location = (-4.0165605545043945, 4.648410797119141, 8.40798568725586)
    shoe2.rotation_euler = (-0.10539751499891281, -0.0014274478890001774, 0.11227820068597794)
    shoe2.keyframe_insert(data_path="location", frame=150) 
    shoe2.keyframe_insert(data_path="rotation_euler", frame=150)

def create_arm1():
    bpy.ops.mesh.primitive_cylinder_add()
    arm1 = bpy.context.object
    bpy.ops.object.modifier_add(type='SUBSURF')
    arm1.name = "arm1"
    mat = bpy.data.materials.new('color')
    color = (0.761303, 0.800273, 0.780021, 1)
    mat.diffuse_color = color
    arm1.data.materials.append(mat)
    arm1.scale = (0.1,0.1,0.83)
    arm1.location = (-2.5023751258850098, 1.848970890045166, 10.817305564880371)
    arm1.rotation_euler = (0.8650566935539246, 0.2435743510723114, -3.266211748123169)
    
def create_arm2():
    bpy.ops.mesh.primitive_cylinder_add()
    arm2 = bpy.context.object
    bpy.ops.object.modifier_add(type='SUBSURF')
    arm2.name = "arm2"
    mat = bpy.data.materials.new('color')
    color = (0.761303, 0.800273, 0.780021, 1)
    mat.diffuse_color = color
    arm2.data.materials.append(mat)
    arm2.scale = (0.1,0.1,0.83)
    arm2.location = (-3.121159315109253, 1.0450042486190796, 10.811690330505371)
    arm2.rotation_euler = (0.27901211380958557, -0.7315009236335754, -0.49263709783554077)
    
def create_hand1():
    bpy.ops.mesh.primitive_ico_sphere_add()
    hand1 = bpy.context.object
    bpy.ops.object.modifier_add(type='SUBSURF')
    hand1.name = "hand1"
    mat = bpy.data.materials.new('color')
    color = (0.800016, 0.369513, 0.586069, 1)
    mat.diffuse_color = color
    hand1.data.materials.append(mat)
    hand1.scale = (0.2,0.2,0.2)
    hand1.location = (-2.5351028442382812, 2.3066928386688232, 11.293924331665039)
    
def create_hand2():
    bpy.ops.mesh.primitive_ico_sphere_add()
    hand2 = bpy.context.object
    bpy.ops.object.modifier_add(type='SUBSURF')
    hand2.name = "hand2"
    mat = bpy.data.materials.new('color')
    color = (0.800016, 0.369513, 0.586069, 1)
    mat.diffuse_color = color
    hand2.data.materials.append(mat)
    hand2.scale = (0.2,0.2,0.2)
    hand2.location = (-3.5775976181030273, 1.1039562225341797, 11.371886253356934)
    
def create_book1():
    bpy.ops.mesh.primitive_cube_add()
    book1 = bpy.context.object
    book1.name = "book1"
    mat = bpy.data.materials.new('color')
    color = (0.803432, 0.198678, 0.00338747, 1)
    mat.diffuse_color = color
    book1.data.materials.append(mat)
    book1.scale = (0.56,0.78,0.11)
    book1.location = (-3.2973697185516357, 2.0816712379455566, 11.89443588256836)
    book1.rotation_euler = (-0.32395485043525696, 1.1224846839904785, -7.360164642333984)
    
def create_book2():
    bpy.ops.mesh.primitive_cube_add()
    book2 = bpy.context.object
    book2.name = "book2"
    mat = bpy.data.materials.new('color')
    color = (0.8, 0.8, 0.8, 1)
    mat.diffuse_color = color
    book2.data.materials.append(mat)
    book2.scale = (0.56,0.39,0.04)
    book2.location = (-2.9005134105682373, 2.153853416442871, 11.959342002868652)
    book2.rotation_euler = (0.05056176334619522, -1.1005312204360962, -4.286710262298584)
    
def create_book3():
    bpy.ops.mesh.primitive_cube_add()
    book3 = bpy.context.object
    book3.name = "book3"
    mat = bpy.data.materials.new('color')
    color = (0.8, 0.8, 0.8, 1)
    mat.diffuse_color = color
    book3.data.materials.append(mat)
    book3.scale = (0.56,0.39,0.04)
    book3.location = (-3.469978094100952, 1.7269105911254883, 11.974455833435059)
    book3.rotation_euler = (0.08637632429599762, -1.1539583206176758, -16.450820922851562)
    
def create_book4():
    bpy.ops.mesh.primitive_cube_add()
    book4 = bpy.context.object
    book4.name = "book4"
    mat = bpy.data.materials.new('color')
    color = (0.8, 0.8, 0.8, 1)
    mat.diffuse_color = color
    book4.data.materials.append(mat)
    book4.scale = (0.56,0.39,0.01)
    book4.location = (-3.393622398376465, 1.6637568473815918, 11.962928771972656)
    book4.rotation_euler = (3.2867865562438965, -1.1853463649749756, -16.34038734436035)
    book4.keyframe_insert(data_path="location", frame=0)
    book4.keyframe_insert(data_path="rotation_euler", frame=0)    
    book4.location = (-2.994434356689453, 1.870043396949768, 12.11796760559082) 
    book4.rotation_euler = (5.193765640258789, -0.9790914058685303, -16.676612854003906)
    book4.keyframe_insert(data_path="location", frame=50)
    book4.keyframe_insert(data_path="rotation_euler", frame=50) 
    book4.location = (-3.393622398376465, 1.6637568473815918, 11.962928771972656)
    book4.rotation_euler = (3.2867865562438965, -1.1853463649749756, -16.34038734436035)
    book4.keyframe_insert(data_path="location", frame=100)
    book4.keyframe_insert(data_path="rotation_euler", frame=100)
    book4.location = (-2.994434356689453, 1.870043396949768, 12.11796760559082) 
    book4.rotation_euler = (5.193765640258789, -0.9790914058685303, -16.676612854003906)
    book4.keyframe_insert(data_path="location", frame=150)
    book4.keyframe_insert(data_path="rotation_euler", frame=150)
    
def create_star1():
    bpy.ops.mesh.primitive_ico_sphere_add()
    star1 = bpy.context.object
    star1.name = "star1"
    mat = bpy.data.materials.new('color')
    star1.data.materials.append(mat)
    star1.scale = (1,1,1)
    star1.location = (7.530369281768799, -3.0031063556671143, 16.034542083740234)
    color = (0.0299858, 0.800023, 0.203693, 1)
    mat.diffuse_color = color
    
def create_star2():
    bpy.ops.mesh.primitive_ico_sphere_add()
    star2 = bpy.context.object
    star2.name = "star2"
    mat = bpy.data.materials.new('color')
    star2.data.materials.append(mat)
    star2.scale = (3,3,3)
    star2.location = (-7.230057716369629, -19.835901260375977, 19.484106063842773)
    color = (0.80014, 0.0183779, 0.0137548, 1)
    mat.diffuse_color = color
    
def create_star3():
    bpy.ops.mesh.primitive_ico_sphere_add()
    star3 = bpy.context.object
    star3.name = "star3"
    mat = bpy.data.materials.new('color')
    star3.data.materials.append(mat)
    star3.scale = (4,4,4)
    star3.location = (6.185729026794434, 13.839183807373047, 28.012712478637695)
    color = (0.800371, 0.0617733, 0.394951, 1)
    mat.diffuse_color = color
    
def create_star4():
    bpy.ops.mesh.primitive_ico_sphere_add()
    star4 = bpy.context.object
    star4.name = "star4"
    mat = bpy.data.materials.new('color')
    star4.data.materials.append(mat)
    star4.scale = (1.5,1.5,1.5)
    star4.location = (-7.237161636352539, -5.240462303161621, 16.994504928588867)
    color = (0.614913, 0.800568, 0.0504268, 1)
    mat.diffuse_color = color
    
    
def create_camera():
    bpy.ops.object.camera_add()
    camera = bpy.context.object
    bpy.context.scene.camera = camera
    camera.location = (-5.2200093269348145, -12.969734191894531, 16.407777786254883)
    camera.rotation_euler = (1.1693705320358276, 2.816302639985224e-07, -0.12217206507921219)
    camera.data.lens = 50
    camera.keyframe_insert(data_path="rotation_euler", frame=0)
    camera.data.keyframe_insert(data_path="lens", frame=0)
    camera.keyframe_insert(data_path="location", frame=0)
    camera.rotation_euler = (1.2880520820617676, 2.5015918936333037e-07, -0.1291535496711731)
    camera.location = (-4.1207356452941895, -6.73121976852417, 14.458921432495117)
    camera.data.lens = 50
    camera.keyframe_insert(data_path="rotation_euler", frame=50)
    camera.data.keyframe_insert(data_path="lens", frame=50)
    camera.keyframe_insert(data_path="location", frame=50)
    camera.location = (-24.364105224609375, 18.493362426757812, 15.19630241394043)
    camera.rotation_euler = (1.4346625804901123, -1.1167462616867851e-06, -2.2200586795806885)
    camera.data.lens = 50
    camera.keyframe_insert(data_path="rotation_euler", frame=100)
    camera.data.keyframe_insert(data_path="lens", frame=100)
    camera.keyframe_insert(data_path="location", frame=100)
    camera.location = (-57.32966995239258, 128.7644805908203, 43.5470085144043)
    camera.rotation_euler = (1.3439054489135742, -1.157420683739474e-06, -2.7227132320404053)
    camera.data.lens = 54.074764251708984
    camera.keyframe_insert(data_path="rotation_euler", frame=150)
    camera.data.keyframe_insert(data_path="lens", frame=150)
    camera.keyframe_insert(data_path="location", frame=150)
    
def create_spot():
    bpy.ops.object.light_add(type='SPOT')
    spot = bpy.context.object
    spot.location  = (-25.743175506591797, -29.9029483795166, 56.33271789550781)
    spot.rotation_euler = (0.40491488575935364, -8.918273692870571e-07, 2.38761305809021)
    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["head"]
    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 = 150
    bpy.context.scene.render.resolution_x = 200
    bpy.context.scene.render.resolution_y = 150
    bpy.context.scene.render.resolution_percentage = 150
    bpy.context.scene.render.engine = 'CYCLES'
    bpy.context.scene.render.filepath = "/tmp/o"
    bpy.ops.render.render(animation=True)
    
    

clear_scene()
create_ball()
create_rainbow_material()
create_torus()
create_head()
create_body()
create_leg1()
create_leg2()
create_shoe1()
create_shoe2()
create_arm1()
create_arm2()
create_hand1()
create_hand2()
create_book1()
create_book2()
create_book3()
create_book4()
create_star1()
create_star2()
create_star3()
create_star4()
create_camera()
create_spot()
render()
  • 效果

图片描述

总结 🤔

  • 这次将动态图渲染做了总结
  • ?🤔
  • 我们下次再说!👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。