【Blender】若干常用修改器如何在 Python 中使用
出场演员 —— 自由高达
细分表面(Subdivision Surface)
效果图
- 细分前
- 细分后
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 Viewport
为 2
阵列(Array)
效果图
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)
以上代码的效果相当于设置了如下修改器,并设置了 Count
为 5 ,Factor X
、 Y
、 Z
分别为 0., 0.25, 0.25
倒角(Bevel)
效果图
- 倒角前
- 倒角后
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()
以上代码的效果相当于设置了如下修改器,并设置了 Amount
为 0.3,Segments
为 1
创建过程(Build)
效果图
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)
部分减面(Decimate)
效果图
-
减面前
-
减面后
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)
相当于手动设置了如下修改器
结合下图可见,面数从原来得 8700 面减少到了 291 面
- 减面前网格线
- 减面后网格线
镜像(Mirror)
效果图
- 在立方体的 X 轴方向两侧进行镜像
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")
以上代码相当于手动添加了如下修改器
螺旋(Screw)
效果图
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()
以上代码相当于手动添加了如下修改器
实体化(Solidify)
效果图
- 实体化前
- 实体化后
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()
以上代码相当于手动添加了如下修改器
收缩包装(ShrinkWrap)
效果图
其实这效果更像是 “包装充气膨胀”
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()
以上代码相当于应用了以下修改器(但由于代码中 “应用” 了它,所以你是看不到它的)
但是可以看到其对应生成的动画(Timeline)关键帧,如下所示
(完)
转载自:https://juejin.cn/post/7170133136557211685