在Blender的3D世界里,脚本工作区就像一个充满魔法的游乐场。这里没有复杂的菜单层级,没有繁琐的手动调整,只需敲击键盘输入参数,就能让立方体旋转、球体缩放、猴头苏珊娜跳起机械舞。本文将以"参数运行模式"为核心,带大家用最直观的方式掌握Blender的Python脚本控制技巧。
一、游乐场入口:脚本工作区全解析
1.1 找到你的魔法控制台
打开Blender后,在顶部菜单栏用鼠标中键左右滑动,当看到绿色背景的"Scripting"字样时松手,你就进入了脚本工作区。这个界面由四个核心区域组成:
- 文本编辑器:编写代码的主战场
- Python控制台:即时执行单行命令的试验田
- 属性面板:显示当前选中对象的参数
- 3D视图:实时预览代码效果
1.2 第一个魔法咒语:清空场景
在控制台输入以下代码并回车:
import bpy
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
瞬间所有物体消失,就像用魔法扫帚清理了整个场景。这个操作相当于手动按A全选后按X删除,但用代码实现只需0.1秒。
二、召唤3D精灵:参数化创建物体
2.1 基础几何体召唤术
在控制台输入:
bpy.ops.mesh.primitive_cube_add(size=2, location=(0,0,1))
一个边长为2的立方体出现在坐标(0,0,1)的位置。尝试修改参数:
size=3:立方体变大location=(2,2,2):立方体移动到角落rotation=(0.785,0,0):立方体绕X轴旋转45度(0.785≈π/4)
2.2 猴头苏珊娜的秘密
输入:
bpy.ops.mesh.primitive_monkey_add(size=1.5, location=(0,-1,0))
这个经典测试模型其实藏着参数彩蛋:
calc_uvs=True:自动生成UV贴图enter_editmode=False:创建后不直接进入编辑模式align='WORLD':与世界坐标系对齐
2.3 批量生成物体阵列
用for循环创建12个圆柱体:
import math
for i in range(12):
angle = i * math.pi / 6 # 每30度一个
x = 3 * math.cos(angle)
y = 3 * math.sin(angle)
bpy.ops.mesh.primitive_cylinder_add(
radius=0.3,
depth=0.5,
location=(x, y, 0)
)
这个代码会生成一个圆形排列的管道阵列,每个管道间隔30度,半径3单位。
三、物体变形记:参数化修改属性
3.1 直接访问对象属性
创建立方体后,在控制台输入:
cube = bpy.data.objects['Cube']
cube.location.z = 2 # 立方体升高
cube.rotation_euler = (0.5, 0, 0) # 绕X轴旋转约28.6度
cube.scale = (1.5, 0.8, 1) # X轴放大1.5倍,Y轴缩小到0.8
观察3D视图,立方体立即发生形变。这种修改方式比手动拖动滑块更精确。
3.2 动态参数计算
让物体随时间变化:
import time
start_time = time.time()
while True:
current_time = time.time() - start_time
cube = bpy.data.objects.get('Cube')
if cube:
# 让立方体上下浮动
cube.location.z = 1 + 0.5 * math.sin(current_time)
# 让立方体自转
cube.rotation_euler.z = current_time % (2*math.pi)
运行这段代码(需在脚本编辑器创建新脚本并点击运行),立方体会开始做正弦运动并持续旋转。按ESC停止动画。
3.3 批量修改属性
修改所有物体的缩放:
for obj in bpy.data.objects:
if obj.type == 'MESH': # 只修改网格物体
obj.scale = (1.2, 1.2, 1.2)
这个操作相当于手动选中所有物体后按S缩放1.2倍,但用代码可以精确控制每个轴的缩放比例。
四、高级玩法:参数化场景构建
4.1 随机分布物体
创建100个随机位置的球体:
import random
for i in range(100):
x = random.uniform(-5, 5)
y = random.uniform(-5, 5)
z = random.uniform(0, 2)
bpy.ops.mesh.primitive_uv_sphere_add(
radius=0.2,
location=(x, y, z)
)
运行后场景中会出现随机分布的球体云。要获得更自然的分布,可以添加距离限制:
positions = []
for i in range(100):
while True:
x = random.uniform(-5, 5)
y = random.uniform(-5, 5)
z = random.uniform(0, 2)
# 检查新位置是否离已有物体太近
too_close = any((x-px)**2 + (y-py)**2 < 1 for px, py, pz in positions)
if not too_close:
positions.append((x, y, z))
break
bpy.ops.mesh.primitive_uv_sphere_add(
radius=0.2,
location=(x, y, z)
)
4.2 参数化建筑生成
创建参数化高楼:
def build_tower(floors, base_width, height_per_floor):
for floor in range(floors):
# 每层高度
z = floor * height_per_floor
# 每层宽度递减
width = base_width * (1 - floor/floors*0.5)
# 创建楼层
bpy.ops.mesh.primitive_cube_add(
size=(width, width, height_per_floor),
location=(0, 0, z + height_per_floor/2)
)
# 添加窗户(简化版)
if width > 1:
window_size = width/4
for x_offset in [-width/3, width/3]:
for y_offset in [-width/3, width/3]:
bpy.ops.mesh.primitive_cube_add(
size=(window_size, window_size, height_per_floor*0.8),
location=(x_offset, y_offset, z + height_per_floor/2)
)
# 创建20层,底层宽度8,每层高3
build_tower(20, 8, 3)
运行后会生成一座带窗户的参数化高楼,通过修改函数参数可以轻松改变建筑样式。
五、实用技巧:提升效率的参数魔法
5.1 代码自动补全
在脚本编辑器中:
- 点击菜单"Text" > "Insert Snippet"
- 或按Ctrl+Space触发自动补全
- 输入
bpy.ops.mesh.primitive_后按Tab,会显示所有可用的几何体创建函数
5.2 参数实时预览
在控制台输入不完整的命令时:
bpy.ops.mesh.primitive_cube_add(size=
保持光标在行尾,Blender会显示参数提示,包括参数类型和默认值。
5.3 历史命令快速调用
按键盘上方向键↑可以调出之前执行过的命令,适合需要重复执行相同操作时使用。
5.4 参数单位转换
Blender中角度默认使用弧度制,常用转换:
- 90度 = π/2 ≈ 1.5708
- 180度 = π ≈ 3.1416
- 360度 = 2π ≈ 6.2832
在代码中可以直接使用math.pi:
import math
obj.rotation_euler = (0, 0, math.pi/4) # 旋转45度
六、常见问题解决方案
6.1 物体找不到?
错误提示KeyError: 'Cube'表示场景中没有名为Cube的物体。解决方法:
- 检查物体名称是否拼写正确
- 使用
bpy.context.active_object获取当前选中物体 - 遍历所有物体:
for obj in bpy.data.objects:
print(obj.name) # 打印所有物体名称
6.2 参数不起作用?
检查:
- 参数名称是否正确(注意大小写)
- 参数值是否在有效范围内
- 是否在正确的上下文中调用(如编辑模式/对象模式)
6.3 如何保存参数设置?
将脚本保存为.py文件,下次打开Blender后:
- 在脚本工作区点击"Open"加载脚本
- 或直接拖拽.py文件到Blender窗口
七、从游乐场到专业应用
掌握参数运行模式后,你可以:
- 批量处理模型:为100个物体统一添加修改器
- 创建生成艺术:用算法生成复杂结构
- 自动化工作流程:将重复操作编写成脚本
- 开发插件:将常用功能打包为自定义工具
例如这个自动布景脚本:
import random
import math
def create_random_scene(object_count=50):
# 清空场景
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
# 创建地面
bpy.ops.mesh.primitive_plane_add(size=20)
ground = bpy.context.active_object
ground.name = "Ground"
# 创建随机物体
for i in range(object_count):
x = random.uniform(-8, 8)
y = random.uniform(-8, 8)
# 随机选择物体类型
choice = random.random()
if choice < 0.3:
# 立方体
bpy.ops.mesh.primitive_cube_add(
size=random.uniform(0.5, 2),
location=(x, y, random.uniform(0.5, 3))
)
elif choice < 0.6:
# 圆柱体
bpy.ops.mesh.primitive_cylinder_add(
radius=random.uniform(0.3, 1),
depth=random.uniform(0.3, 2),
location=(x, y, random.uniform(0.3, 2))
)
else:
# 球体
bpy.ops.mesh.primitive_uv_sphere_add(
radius=random.uniform(0.3, 1.5),
location=(x, y, random.uniform(0.3, 2))
)
# 随机旋转
obj = bpy.context.active_object
if obj and obj.name != "Ground":
obj.rotation_euler = (
random.uniform(0, math.pi/2),
random.uniform(0, math.pi*2),
random.uniform(0, math.pi/2)
)
# 创建包含30个物体的随机场景
create_random_scene(30)
这个脚本能在10秒内生成一个包含地面和30个随机物体的场景,每个物体都有不同的形状、大小、位置和旋转角度。
结语:参数魔法永无止境
Blender的参数运行模式就像一把万能钥匙,打开了3D创作的无限可能。从简单的物体变换到复杂的生成艺术,从批量处理到自动化工作流,掌握这些技巧后,你将不再被菜单和滑块限制,而是能用代码精确控制每一个像素。
记住,最好的学习方式是动手实践。现在打开Blender,进入脚本工作区,尝试修改本文中的代码,观察3D视图中的变化。当你用参数让第一个立方体旋转起来时,你就已经掌握了这门魔法的基础咒语。从这里出发,更复杂的3D世界正等待你去探索和创造。