Blender Python 教程:从入门到实践
Blender Python (通常简称为 bpy) 是 Blender 内置的强大脚本接口,通过它,你可以自动化重复性任务、创建自定义工具、甚至构建复杂的游戏逻辑或生成艺术,掌握 bpy,意味着你将 Blender 的能力提升到了一个全新的维度。

第一部分:基础准备
为什么学习 Blender Python?
- 自动化:自动执行繁琐任务,比如批量重命名、调整材质、设置动画关键帧。
- 可重复性:创建一个脚本,可以精确地、无数次地复现复杂的效果。
- 扩展功能:添加 Blender 原生没有的功能,创建你自己的工作流工具。
- 程序化建模:通过数学和算法生成复杂的模型,这是程序化艺术和游戏开发的核心。
- 游戏开发:在 Blender 的游戏引擎中,Python 用于编写交互逻辑、敌人 AI 等。
开发环境准备
最推荐的编辑器是 Visual Studio Code (VS Code),因为它有出色的代码补全、错误提示和调试功能。
安装步骤:
- 安装 VS Code:从 官网 下载并安装。
- 安装 Python 扩展:打开 VS Code,进入扩展商店,搜索 "Python" 并安装 Microsoft 官方提供的 Python 扩展。
- 配置 Blender 的 Python 路径 (非常重要!):
- 找到你安装的 Blender 的 Python 解释器路径,在 Windows 上,它通常在
C:\Program Files\Blender Foundation\Blender 3.x\3.x\python\bin\python.exe。 - 在 VS Code 中,按
Ctrl+Shift+P(Windows/Linux) 或Cmd+Shift+P(Mac),输入Python: Select Interpreter。 - 选择你找到的 Blender 的 Python 解释器,这样 VS Code 就能使用 Blender 的库,并获得正确的代码提示。
- 找到你安装的 Blender 的 Python 解释器路径,在 Windows 上,它通常在
第二部分:核心概念
Blender 的数据模型
理解 Blender 的数据模型是学习 bpy 的关键,Blender 的所有内容(场景、对象、材质、网格等)都是一个“数据块”(Data Block),这些数据块被组织在一个层级结构中。
bpy.data:这是所有数据的入口点,它是一个字典,包含了所有可用的数据块。bpy.data.objects: 场景中的所有对象。bpy.data.meshes: 所有网格数据。bpy.data.materials: 所有材质。bpy.data.images: 所有图像。
- 上下文:
bpy.context是另一个核心概念,它代表了 Blender 当前用户正在交互的“环境”,比如当前选中的对象、活动的对象、当前的场景等。
简单比喻: 想象一个图书馆:

bpy.data是整个图书馆的目录,你可以在这里找到所有的书(对象)、杂志(材质)等。bpy.context是你当前正在阅读的书桌,上面放着几本你正在翻阅的书(当前选中的对象)。
访问和操作对象
获取对象:
# 通过名称获取
my_object = bpy.data.objects["MyCube"]
# 通过上下文获取当前选中的对象
selected_object = bpy.context.active_object
# 遍历场景中的所有对象
for obj in bpy.data.objects:
print(obj.name)
修改对象属性:
# 假设我们有一个选中的立方体 selected_object = bpy.context.active_object # 修改位置 selected_object.location.x = 2.0 selected_object.location.y = 1.5 # 修改缩放 selected_object.scale.z = 2.0 # 修改旋转 (注意:Blender 默认使用弧度) # 可以用 math.radians 将角度转换为弧度 import math selected_object.rotation_euler.z = math.radians(45)
第三部分:实战演练
让我们通过几个小例子来巩固知识。
示例 1:创建一个简单的立方体
- 在 Blender 中,打开一个新的默认项目。
- 切换到 "Scripting" 工作区。
- 在文本编辑器中,创建一个新文本,粘贴以下代码,然后点击 "Run Script" 按钮(或按
Alt+P)。
import bpy
# 清除场景中所有默认对象
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
# 在原点处创建一个新的立方体
bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0))
# 获取刚刚创建的立方体对象
cube = bpy.context.active_object
# 给立方体添加一个新的材质
mat = bpy.data.materials.new(name="MyMaterial")
mat.use_nodes = True
cube.data.materials.append(mat)
print("立方体创建成功!")
代码解释:

bpy.ops.object.select_all(action='SELECT'):选择所有对象。bpy.ops.object.delete():删除所有选中的对象。bpy.ops.mesh.primitive_cube_add(...):这是一个“操作”(Operator),用于创建一个原始的立方体网格,它有很多参数,如size(大小)和location(位置)。bpy.context.active_object:获取执行操作后处于活动状态的对象。bpy.data.materials.new(...):创建一个新的材质数据块。cube.data.materials.append(mat):将材质添加到对象的材质槽中。
示例 2:自动化动画关键帧
让我们让立方体在 1 秒内从 (0,0,0) 移动到 (5,0,0)。
import bpy
import math
# 确保我们有一个立方体
if "MyCube" not in bpy.data.objects:
bpy.ops.mesh.primitive_cube_add(size=1, location=(0, 0, 0))
cube = bpy.data.objects["MyCube"]
# 设置场景总帧数
bpy.context.scene.frame_end = 100
# 清除旧的动画数据
if cube.animation_data:
cube.animation_data.action = None
# 创建新的动画数据
cube.animation_data_create()
action = cube.animation_data.action
# 为位置属性创建 F-Curves (动画曲线)
for fcurve in action.fcurves:
action.fcurves.remove(fcurve)
# 添加 X 位置的 F-Curve
fcu = action.fcurves.new(data_path="location", index=0)
fcu.keyframe_points.add(2)
# 设置关键帧
# 第 0 帧
fcu.keyframe_points[0].co = (0, 0) # (帧数, 值)
fcu.keyframe_points[0].interpolation = 'LINEAR'
# 第 100 帧
fcu.keyframe_points[1].co = (100, 5)
fcu.keyframe_points[1].interpolation = 'LINEAR'
print("动画关键帧设置完成!")
第四部分:进阶技巧
使用 Nodes (节点)
节点是 Blender 强大功能的核心,我们也可以用 Python 来操作它们。
import bpy
# 获取活动对象
obj = bpy.context.active_object
if not obj or obj.type != 'MESH':
print("请选择一个网格对象")
exit()
# 获取活动材质
mat = obj.active_material
if not mat:
mat = bpy.data.materials.new(name="NodeMaterial")
mat.use_nodes = True
obj.data.materials.append(mat)
# 清除默认节点
nodes = mat.node_tree.nodes
nodes.clear()
# 创建输入和输出节点
input_node = nodes.new('ShaderNodeTexImage')
output_node = nodes.new('ShaderNodeOutputMaterial')
# 连接节点
links = mat.node_tree.links
links.new(input_node.outputs['Color'], output_node.inputs['Surface'])
# 加载一张图片
# 假设你有一张名为 'my_texture.png' 的图片在当前目录
try:
img = bpy.data.images.load(filepath="my_texture.png") # 请确保图片存在
input_node.image = img
print("节点材质设置完成!")
except Exception as e:
print(f"无法加载图片: {e}")
程序化建模
创建一个由多个小球组成的圆环。
import bpy
import math
# 清除默认对象
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
# 圆环参数
radius = 5 # 圆环半径
ball_radius = 0.3
num_balls = 24
# 创建小球并排列成圆环
for i in range(num_balls):
angle = (i / num_balls) * 2 * math.pi
# 计算小球的位置
x = radius * math.cos(angle)
y = radius * math.sin(angle)
z = 0
# 创建小球
bpy.ops.mesh.primitive_uv_sphere_add(radius=ball_radius, location=(x, y, z))
# (可选) 给每个小球一个不同的材质颜色
sphere = bpy.context.active_object
mat = bpy.data.materials.new(name=f"BallMat_{i}")
mat.diffuse_color = (i/num_balls, 1 - i/num_balls, 0.5)
sphere.data.materials.append(mat)
print(f"已创建 {num_balls} 个小球组成的圆环。")
第五部分:学习资源与最佳实践
官方文档 (最重要!)
- Blender Python API Reference:这是你的终极词典,当你不确定某个属性或函数时,来这里查找,通常可以通过 Google 搜索 "bpy.data.objects" 直接找到对应页面。
探索 bpy 的最佳方法:记录操作
这是学习 bpy 最快、最有效的方法!
- 打开 Blender 的 "Scripting" 工作区。
- 在文本编辑器中,点击 "Record" (录音) 按钮。
- 在 3D 视口中执行一个操作,比如移动一个对象、添加一个修改器、改变材质颜色等。
- 点击 "Stop" (停止)。
- 你会看到 Python 代码自动生成,精确地记录了你的每一步操作,你可以学习这些代码,然后修改它们来实现更复杂的功能。
社区与教程
- Blender Artists Forum: blenderartists.org:官方论坛,可以提问和分享。
- Blender Stack Exchange: blender.stackexchange.com:像知乎一样的问答社区,搜索问题通常能找到答案。
- YouTube: 搜索 "Blender Python Scripting"、"Blender API Tutorial" 等关键词,有很多优秀的视频教程。
最佳实践
- 注释你的代码:
# 这是一行注释,解释代码的目的。 - 模块化:将复杂的功能拆分成小的、可重用的函数。
- 版本控制:使用 Git (如 GitHub, GitLab) 来管理你的脚本,避免代码丢失。
- 从简单开始:先实现一个小的功能,再逐步添加复杂性。
- 多查文档:养成习惯,遇到不确定就查阅官方 API 文档。
学习 Blender Python 是一个循序渐进的过程,从理解 bpy.data 和 bpy.context 开始,通过“记录操作”这个强大的工具来快速学习,然后不断通过实践来加深理解,不要害怕犯错,调试是学习的一部分,祝你在 Blender 自动化和程序化创作的世界里玩得开心!
