【Blender】若干常用修改器如何在 Python 中使用


theme: orange
highlight: zenburn

本文正在参加「金石计划 . 瓜分6万现金大奖」

出场演员 —— 自由高达

untitled.png

细分表面(Subdivision Surface)

效果图

  • 细分前

image.png

  • 细分后

image.png

Python 代码和注释

import bpy

def subSurf(level = 2):
    bpy.ops.object.modifier_add(type='SUBSURF') # 添加细分修改器
    bpy.context.object.modifiers["Subdivision"].levels = level # 设置修改器细分级别
  
bpy.ops.mesh.primitive_monkey_add()  
subSurf()

以上代码的效果相当于手动添加了以下修改器,并设置了 Levels Viewport2

image.png

阵列(Array)

效果图

image.png

Python 代码与注释

import bpy

def array(num = 5,o_x = 2,o_y = 0,o_z = 0):
    bpy.ops.object.modifier_add(type='ARRAY') # 添加阵列修改器

    array = bpy.context.object.modifiers["Array"] # 设置修改器的参数
    array.count = num # 阵列的个数
    
    # 分别在 x/y/z 方向上进行偏移
    array.relative_offset_displace[0] = o_x
    array.relative_offset_displace[1] = o_y
    array.relative_offset_displace[2] = o_z

bpy.ops.mesh.primitive_cube_add()
array(o_x = 0.,o_y = 0.25,o_z = 0.25)

以上代码的效果相当于设置了如下修改器,并设置了 Count5Factor XYZ 分别为 0., 0.25, 0.25

image.png

倒角(Bevel)

效果图

  • 倒角前

image.png

  • 倒角后

image.png

Python 代码与注释

import bpy

def bevel(_amount = 0.3,_segments = 1):
    bpy.ops.object.modifier_add(type='BEVEL') # 添加倒角修改器

    bevel = bpy.context.object.modifiers["Bevel"] # 设置倒角参数
    bevel.width = _amount
    bevel.segments = _segments

bpy.ops.mesh.primitive_ico_sphere_add()
bevel()

以上代码的效果相当于设置了如下修改器,并设置了 Amount0.3Segments1

image.png

创建过程(Build)

效果图

GundamAnim.gif

Python 代码与注释

import bpy

def build(f):
    bpy.ops.object.modifier_add(type='BUILD') # 添加 Build 修改器

    build = bpy.context.object.modifiers["Build"] # 设置修改器参数
    build.frame_start = f # 起始帧
    build.use_random_order = False # 不随机
    build.seed = 0

bpy.ops.mesh.primitive_monkey_add()
build(f = 0)

相当于手动设置了如下修改器(默认长度 100)

image.png

部分减面(Decimate)

效果图

  • 减面前
    image.png

  • 减面后
    image.png

Python 代码与注释

import bpy

def decimate(limit_num):
    bpy.ops.object.modifier_add(type='DECIMATE') # 添加修改器

    decim = bpy.context.object.modifiers["Decimate"] # 设置该修改器相应参数
    decim.decimate_type = 'DISSOLVE'
    decim.delimit = {'NORMAL'}
    decim.angle_limit = limit_num

bpy.ops.mesh.primitive_monkey_add()
decimate(limit_num = 0.8)

相当于手动设置了如下修改器

image.png

结合下图可见,面数从原来得 8700 面减少到了 291

image.png

  • 减面前网格线
    image.png
  • 减面后网格线
    image.png

镜像(Mirror)

效果图

  • 在立方体的 X 轴方向两侧进行镜像
    image.png

Python 代码与注释

import bpy

def mirror(obj):
    bpy.ops.object.modifier_add(type='MIRROR') # 添加修改器

    mir = bpy.context.object.modifiers["Mirror"] # 设置修改器参数
    mir.use_axis[0] = True # 以 X 轴为方向
    mir.mirror_object = bpy.data.objects[obj]

bpy.ops.mesh.primitive_monkey_add()
bpy.ops.mesh.primitive_cube_add(location = (3,0,0)) 
bpy.context.view_layer.objects.active = bpy.data.objects["Suzanne"]
mirror("Cube")

以上代码相当于手动添加了如下修改器

image.png

螺旋(Screw)

效果图

image.png

Python 代码与注释

import bpy

# 细分修改器
def subSurf(level = 3):
    bpy.ops.object.modifier_add(type='SUBSURF')
    bpy.context.object.modifiers["Subdivision"].levels = level
# 螺旋修改器
def screw(angle = 6.28,screw = 3,itr = 1,ax = 'X'):
    bpy.ops.object.modifier_add(type='SCREW') # 添加修改器

    scr = bpy.context.object.modifiers["Screw"] # 设置修改器参数
    scr.angle = angle
    scr.screw_offset = screw
    scr.iterations = itr
    scr.axis = ax # 绕指定轴进行螺旋卷绕

bpy.ops.mesh.primitive_grid_add()
screw(itr = 2)
subSurf()

以上代码相当于手动添加了如下修改器

image.png

实体化(Solidify)

效果图

  • 实体化前

image.png

  • 实体化后

image.png

Python 代码与注释

import bpy

def solid(thick = -0.15,ofs = -1):
    bpy.ops.object.modifier_add(type='SOLIDIFY') # 添加修改器
    solid = bpy.context.object.modifiers["Solidify"] # 设置修改器参数
    solid.thickness = thick
    solid.offset = ofs

bpy.ops.mesh.primitive_monkey_add()
solid()

以上代码相当于手动添加了如下修改器

image.png

收缩包装(ShrinkWrap)

效果图

其实这效果更像是 “包装充气膨胀

GundamGif.gif

Python 代码与注释

import bpy

# 表面细分
def subSurf(level = 1):
    bpy.ops.object.modifier_add(type='SUBSURF')
    bpy.context.object.modifiers["Subdivision"].levels = level

# 收缩包装
def shrinkWrapAnim(obj):
    bpy.ops.object.modifier_add(type='SHRINKWRAP') # 添加修改器
    bpy.context.object.modifiers["Shrinkwrap"].target = bpy.data.objects[obj] # 设置修改器的目标参数
    bpy.ops.object.modifier_apply_as_shapekey(keep_modifier=False, modifier="Shrinkwrap") # 应用修改器(的形态键)

# 插入形态键关键帧
def shapeKeyInsert(frame_num = 10,shape_value = 1):
    obj = bpy.context.object
    obj.active_shape_key_index = 1

    for i in range(0,2):
        obj.active_shape_key.value = shape_value # 记录形态键值
        obj.active_shape_key.keyframe_insert(data_path = "value",frame = frame_num) # 插入关键帧

        frame_num += 50 # 更新帧数
        shape_value -= 1 # 更新形态键值

s = 0.1
bpy.context.scene.frame_set(0)
bpy.context.scene.frame_end = 50 # 总共 50 帧的动画

bpy.ops.mesh.primitive_cube_add(location=(0,0,0), scale = (s,s,s))
bpy.ops.mesh.primitive_monkey_add()

subSurf()
shrinkWrapAnim("Cube") # 指定目标为 Cube 
shapeKeyInsert()

以上代码相当于应用了以下修改器(但由于代码中 “应用” 了它,所以你是看不到它的

image.png

但是可以看到其对应生成的动画(Timeline)关键帧,如下所示

image.png

image.png

image.png

(完)

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容