前言
1.1 为什么选择 Blender 5.0 + Python?
在三维创作与程序化建模领域,Blender 一直以开源、强大且免费的特性占据核心地位。而 Blender 5.0 对几何节点(Geometry Nodes)的颠覆性更新,彻底打破了 "程序化建模 = 专业门槛" 的固有认知 ------ 从 "平面操作" 到 "空间操控" 的体积数据支持,从 "连线迷宫" 到 "模块化复用" 的包与闭包机制,让新手也能快速上手复杂效果,让资深开发者的创意实现效率翻倍。
Python 作为 Blender 的内置脚本语言,通过 bpy 模块实现了对 Blender 全功能的可编程控制。当 Python 的自动化能力与 Blender 5.0 几何节点的灵活性结合,我们不仅能摆脱重复的手动操作,更能实现 "代码驱动创意":批量生成模型、实时调整节点参数、动态响应外部数据(如传感器数据、动画关键帧),甚至开发自定义节点工具链。
本文的核心目标,就是以经典的 OPENGL Nehe 教程风格(循序渐进、实战导向、细节拉满、兼顾入门与进阶),带大家从最基础的三维三角形开始,逐步掌握几何节点的核心逻辑与 Python 编程技巧,最终完成一个 "照片级纹理航空仪表" 的综合实战项目。无论你是三维建模新手、Python 开发者,还是想提升程序化创作效率的设计师,都能在本文中找到适合自己的学习路径。
1.2 本文核心亮点
- 风格复刻:完全遵循 Nehe 教程 "章节递进、目标明确、步骤详尽" 的风格,每章围绕一个核心知识点 + 实战案例展开,可直接跟着操作复现效果。
- 深度融合:不割裂 Blender 5.0 新特性与 Python 编程,每个几何节点功能都配套对应的 Python 脚本实现,理解 "可视化操作" 与 "代码控制" 的内在关联。
- 表格驱动:核心知识点、节点参数、代码函数、步骤分解、避坑指南均以表格形式呈现,清晰易懂,便于查阅(全文包含 50+ 核心表格)。
- 跨度极大:从 "三维三角形创建" 到 "照片级航空仪表",覆盖基础建模、节点逻辑、Python 自动化、纹理渲染、动态效果等全流程,满足不同阶段需求。
- 实用性强:所有案例均来自实际应用场景(地形生成、体积特效、批量建模、工业仪表),代码可直接复用,节点树可保存为模板。
1.3 阅读建议
- 环境准备:提前安装 Blender 5.0 并启用 Python 脚本编辑器(后文有详细步骤),建议全程打开 Blender 跟随操作,"动手" 比 "只读" 更有效。
- 节奏控制:每章建议分 2-3 次学习,先理解核心知识点,再完成实战案例,最后研究 Python 脚本扩展,避免急于求成。
- 重点标记:对节点参数、Python API、避坑指南等关键内容做好标记,后续实际项目中可快速查阅。
- 扩展思考:每个案例末尾都有 "进阶方向",鼓励大家尝试修改参数、替换节点、扩展功能,培养自主创作能力。
1.4 适用人群
- 三维建模新手:想快速入门程序化建模,摆脱手动建模的重复劳动。
- Python 开发者:希望拓展三维可视化、自动化建模方向的技能。
- 设计师 / 动画师:想提升创作效率,实现批量生成、动态响应等高级效果。
- 技术爱好者:对 Blender 新特性、Python 与三维工具集成感兴趣的学习者。
第 1 章 环境搭建与基础认知(Nehe Lesson 01:准备工作)
1.1 Blender 5.0 安装与配置
1.1.1 系统要求
Blender 5.0 对硬件有一定要求,尤其是体积计算和渲染时需要较强的 CPU/GPU 性能,建议满足以下配置(最低配置仅能运行基础功能,复杂场景可能卡顿):
| 配置类型 | 最低配置 | 推荐配置 |
|---|---|---|
| 操作系统 | Windows 10 64 位 /macOS 12+ / Linux 64 位 | Windows 11 64 位 /macOS 13+ / Ubuntu 22.04 |
| CPU | 4 核 Intel i5 / AMD Ryzen 5 | 8 核 Intel i7 / AMD Ryzen 7 |
| 内存 | 8GB | 16GB 及以上 |
| GPU | 支持 OpenGL 4.3 的集成显卡 | NVIDIA RTX 3060 / AMD RX 6600 及以上(支持 CUDA/OptiX) |
| 硬盘 | 10GB 空闲空间(SSD 优先) | 20GB 空闲空间(NVMe SSD) |
| 其他 | 鼠标滚轮(缩放 / 平移场景)、互联网连接(安装插件) | 数位板(精细操作)、多显示器(分屏操作) |
1.1.2 安装步骤(以 Windows 11 为例)
- 下载安装包:访问 Blender 官网,选择 Blender 5.0 版本(默认下载 64 位安装包)。
- 运行安装程序:双击下载的
.exe文件,勾选 "同意协议",点击 "下一步"。 - 选择安装路径:建议安装在非系统盘(如
D:\Blender 5.0),避免系统盘空间不足。 - 组件选择:默认勾选 "Blender 主程序""Python 3.11 集成环境""关联 .blend 文件",无需修改。
- 完成安装:点击 "安装",等待进度条完成后,勾选 "运行 Blender",点击 "完成"。
1.1.3 关键配置(首次启动必做)
- 语言设置:启动后点击顶部菜单栏
Edit → Preferences → Interface → Translation,选择 "简体中文",点击 "Save Preferences"(重启后生效)。 - 脚本编辑器启用:点击顶部菜单栏
Window → Toggle System Console,打开系统控制台(用于查看 Python 脚本输出和错误信息)。 - 插件启用:点击顶部菜单栏
Edit → Preferences → Add-ons,搜索 "Geometry Nodes"(默认已启用)、"Python Scripting"(默认已启用),确保勾选状态。 - 性能优化:点击
Edit → Preferences → System,在 "Cycles Render Devices" 中选择你的 GPU(如 NVIDIA CUDA),在 "Memory & Limits" 中设置 "Tile Size" 为 256(提升渲染效率)。
1.2 Python 与 Blender 的联动基础
1.2.1 bpy 模块核心介绍
Blender 内置 Python 3.11 环境,bpy 是 Blender 的核心 Python API,可实现对场景、模型、节点、材质、渲染等所有功能的编程控制。bpy 模块的核心子模块如下:
| 子模块名称 | 核心功能 | 常用场景 |
|---|---|---|
bpy.context |
获取当前上下文(如当前选中的物体、节点树、场景) | 实时操作当前对象 |
bpy.data |
管理所有数据块(如物体、材质、节点树、纹理) | 创建 / 删除 / 修改数据 |
bpy.ops |
模拟 Blender 手动操作(如添加物体、执行布尔运算) | 复现手动操作流程 |
bpy.types |
定义自定义类型(如自定义节点、运算符) | 开发插件 / 工具 |
bpy.utils |
工具函数(如注册插件、加载纹理) | 辅助开发 |
bpy.props |
定义自定义属性(如给物体添加参数) | 扩展对象功能 |
1.2.2 脚本编辑器使用
Blender 内置脚本编辑器,用于编写和运行 Python 脚本:
- 打开脚本编辑器:在 Blender 界面顶部选择
Scripting工作区(默认工作区包括 "布局""雕刻""脚本" 等)。 - 新建脚本:点击脚本编辑器顶部的
New按钮,创建一个空白脚本文件(默认命名为Text)。 - 保存脚本:点击
Save按钮,将脚本保存为.py文件(如first_blender_script.py),建议保存在 Blender 项目文件夹中。 - 运行脚本:点击脚本编辑器顶部的
Run Script按钮(▶️ 图标),或按Alt+P快捷键运行脚本,结果会在系统控制台中显示。
1.2.3 第一个 Python 脚本:Hello Blender + 创建立方体
下面编写一个简单的 Python 脚本,实现 "输出问候语" 和 "创建一个立方体" 的功能,熟悉 bpy 基础用法:
python
运行
# 第一个 Blender Python 脚本
import bpy
# 1. 清除默认场景(删除默认的立方体、灯光、相机,避免干扰)
bpy.ops.object.select_all(action='SELECT') # 选中所有物体
bpy.ops.object.delete() # 删除选中物体
# 2. 输出问候语到系统控制台
print("=" * 50)
print("Hello Blender 5.0! 欢迎来到 Python + 几何节点的世界~")
print("=" * 50)
# 3. 创建一个立方体(通过 bpy.ops 模拟手动操作)
bpy.ops.mesh.primitive_cube_add(
size=2, # 立方体大小
location=(0, 0, 0), # 位置(x, y, z)
rotation=(0, 0, 0) # 旋转(弧度制,0 表示无旋转)
)
# 4. 获取创建的立方体对象,并重命名
cube = bpy.context.active_object # 获取当前激活的物体(即刚创建的立方体)
cube.name = "MyFirstCube" # 重命名物体
cube.data.name = "MyFirstCube_Mesh" # 重命名网格数据
# 5. 给立方体添加自定义属性(用于后续控制)
cube["cube_size"] = 2 # 添加一个名为 cube_size 的属性,值为 2
print(f"创建的立方体名称:{cube.name}")
print(f"立方体位置:{cube.location}")
print(f"立方体自定义属性 cube_size:{cube['cube_size']}")
运行脚本后,在系统控制台会看到输出信息,同时在 3D 视图中会出现一个名为 MyFirstCube 的立方体。
1.2.4 脚本运行常见问题排查
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 运行脚本无反应 | 脚本编辑器未选中脚本文件 | 点击脚本编辑器中的文本区域,确保脚本文件处于激活状态 |
| 报错 "AttributeError: 'NoneType' object has no attribute 'name'" | 未获取到物体(可能是删除默认物体后未创建新物体) | 检查脚本中创建物体的代码是否正确,确保 bpy.context.active_object 不为空 |
| 报错 "Operator bpy.ops.mesh.primitive_cube_add.poll () failed, context is incorrect" | 上下文错误(如在脚本编辑器中运行时,上下文未指向 3D 视图) | 在脚本开头添加 bpy.context.scene.cursor.location = (0,0,0),或切换到 "布局" 工作区后再运行 |
| 中文乱码 | 脚本文件编码不是 UTF-8 | 保存脚本时选择编码为 "UTF-8",或在脚本开头添加 # -*- coding: utf-8 -*- |
1.3 三维图形核心概念(Blender 视角)
在开始后续学习前,需掌握以下三维图形核心概念,这些概念是理解几何节点和 Python 编程的基础:
| 概念名称 | 定义(Blender 视角) | 对应工具 / 节点 |
|---|---|---|
| 点(Vertex) | 三维空间中的最小单位,由 (x, y, z) 坐标定义 | 顶点编辑模式、位置节点 |
| 边(Edge) | 连接两个点的线段,构成网格的骨架 | 边编辑模式、网格节点 |
| 面(Face) | 由三条及以上边围成的封闭区域,构成模型的表面 | 面编辑模式、网格布尔节点 |
| 网格(Mesh) | 由点、边、面组成的三维模型(如立方体、球体) | 网格节点、bpy.data.meshes |
| 体积(Volume) | 三维空间中的 "实心" 结构,由体积网格(Volume Grid)描述 | 体积节点、OpenVDB 集成 |
| 场(Field) | 作用于整个几何体的参数集合(如力场、颜色场、位置场) | 场节点、属性节点 |
| 有符号距离场(SDF) | 通过距离值描述体积形态的技术(正距离表示外部,负距离表示内部) | SDF 节点、体积布尔节点 |
| 实例(Instance) | 虚拟复制的物体,不占用额外内存,可批量生成 | 实例节点、bpy.data.instances |
| 节点树(Node Tree) | 由多个节点连接形成的逻辑链,用于实现程序化效果 | 几何节点编辑器、bpy.data.node_groups |
| 包(Bundles) | Blender 5.0 新增数据容器,可一次性传递多组数据(几何、颜色、数值等) | 包节点、Python 数据打包 |
| 闭包(Closures) | Blender 5.0 新增功能容器,可将自定义逻辑注入其他节点组 | 闭包节点、Python 自定义逻辑 |
1.4 几何节点工作流基础
1.4.1 几何节点核心工作流
几何节点的核心是 "通过节点连接实现数据流转和逻辑运算",最终修改或生成三维模型 / 效果。其基础工作流如下:
| 步骤 | 操作说明 | 对应工具 |
|---|---|---|
| 1. 创建节点树 | 给物体添加几何节点修改器,并创建节点树 | 几何节点修改器、bpy.data.node_groups.new() |
| 2. 添加节点 | 从节点库中添加所需节点(如输入节点、几何节点、输出节点) | 节点编辑器、node_tree.nodes.new() |
| 3. 连接节点 | 通过拖拽连线,将一个节点的输出端连接到另一个节点的输入端 | 节点编辑器、node_tree.links.new() |
| 4. 调整参数 | 修改节点的参数(如数值、布尔值、路径),实时预览效果 | 节点参数面板、Python 脚本修改 |
| 5. 调试优化 | 使用预览节点查看数据,排查连线错误或参数问题 | 预览节点、系统控制台 |
| 6. 输出渲染 | 将节点树连接到节点组输出节点,渲染最终效果 | 节点组输出节点、渲染引擎 |
1.4.2 手动创建第一个几何节点树(以 "移动立方体" 为例)
- 切换到 "布局" 工作区,删除默认物体(立方体、灯光、相机)。
- 添加一个新立方体:点击顶部菜单栏
Add → Mesh → Cube,创建一个默认立方体。 - 添加几何节点修改器:选中立方体,在右侧 "属性" 面板中选择
修改器 → 添加修改器 → Geometry Nodes。 - 进入几何节点编辑器:在顶部工作区选择
Geometry Nodes,此时会看到默认的节点树(包含 "Group Input""Group Output" 节点)。 - 添加节点:
- 点击节点编辑器顶部的
Add → Input → Value,添加一个数值输入节点(命名为 "移动距离")。 - 点击
Add → Geometry → Position,添加位置节点(读取立方体顶点位置)。 - 点击
Add → Vector → Add,添加向量相加节点(将位置与移动距离相加)。 - 点击
Add → Geometry → Set Position,添加设置位置节点(修改立方体顶点位置)。
- 点击节点编辑器顶部的
- 连接节点:
- 将 "Group Input" 的 "Geometry" 输出端 → 连接到 "Position" 的 "Geometry" 输入端。
- 将 "Position" 的 "Position" 输出端 → 连接到 "Add" 的 "Vector" 输入端。
- 将 "Value"(移动距离)的 "Value" 输出端 → 连接到 "Add" 的 "Vector" 输入端(第二个)。
- 将 "Add" 的 "Vector" 输出端 → 连接到 "Set Position" 的 "Position" 输入端。
- 将 "Set Position" 的 "Geometry" 输出端 → 连接到 "Group Output" 的 "Geometry" 输入端。
- 调整参数:修改 "Value" 节点的数值为 1.5,此时 3D 视图中的立方体会沿 X 轴移动 1.5 个单位(默认向量相加的方向为 X 轴)。
1.4.3 Python 脚本创建第一个几何节点树(复刻手动操作)
下面用 Python 脚本复刻上述 "移动立方体" 的几何节点树,理解 "手动操作" 与 "代码控制" 的对应关系:
python
运行
# Python 脚本创建"移动立方体"几何节点树
import bpy
# 步骤 1:清除默认场景
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
# 步骤 2:创建立方体
bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0))
cube = bpy.context.active_object
cube.name = "MovableCube"
# 步骤 3:给立方体添加几何节点修改器
geo_mod = cube.modifiers.new(name="MoveCubeModifier", type='NODES')
# 步骤 4:创建节点树
node_tree = bpy.data.node_groups.new(name="MoveCubeNodeTree", type='GeometryNodeTree')
geo_mod.node_group = node_tree
# 步骤 5:添加输入/输出节点(必须先添加,否则无法连接)
# 添加 Group Input 节点
group_input = node_tree.nodes.new(type='NodeGroupInput')
group_input.location = (-400, 0) # 节点在编辑器中的位置(x, y)
# 添加 Group Output 节点
group_output = node_tree.nodes.new(type='NodeGroupOutput')
group_output.location = (400, 0)
# 步骤 6:添加核心节点
# 添加 Value 节点(移动距离)
value_node = node_tree.nodes.new(type='ShaderNodeValue')
value_node.name = "MoveDistance"
value_node.label = "移动距离"
value_node.location = (-300, 100)
value_node.outputs[0].default_value = 1.5 # 默认移动距离 1.5
# 添加 Position 节点(读取位置)
position_node = node_tree.nodes.new(type='GeometryNodeInputPosition')
position_node.name = "ReadPosition"
position_node.label = "读取位置"
position_node.location = (-200, 0)
# 添加 Vector Add 节点(向量相加)
add_node = node_tree.nodes.new(type='ShaderNodeVectorMath')
add_node.name = "VectorAdd"
add_node.label = "向量相加"
add_node.location = (0, 0)
add_node.operation = 'ADD' # 运算类型:相加
# 添加 Set Position 节点(设置位置)
set_position_node = node_tree.nodes.new(type='GeometryNodeSetPosition')
set_position_node.name = "SetPosition"
set_position_node.label = "设置位置"
set_position_node.location = (200, 0)
# 步骤 7:连接节点(通过 links.new 连接两个节点的端口)
# 辅助函数:获取节点的输入/输出端口(避免硬编码索引)
def get_input_port(node, port_name):
return node.inputs[port_name]
def get_output_port(node, port_name):
return node.outputs[port_name]
# 连接 Group Input → Position
node_tree.links.new(
get_output_port(group_input, "Geometry"),
get_input_port(position_node, "Geometry")
)
# 连接 Position → Vector Add(第一个向量)
node_tree.links.new(
get_output_port(position_node, "Position"),
get_input_port(add_node, "Vector")
)
# 连接 Value → Vector Add(第二个向量)
node_tree.links.new(
get_output_port(value_node, "Value"),
get_input_port(add_node, "Vector_001")
)
# 连接 Vector Add → Set Position
node_tree.links.new(
get_output_port(add_node, "Vector"),
get_input_port(set_position_node, "Position")
)
# 连接 Set Position → Group Output
node_tree.links.new(
get_output_port(set_position_node, "Geometry"),
get_input_port(group_output, "Geometry")
)
# 步骤 8:输出信息
print("几何节点树创建完成!")
print(f"节点树名称:{node_tree.name}")
print(f"包含节点:{[node.name for node in node_tree.nodes]}")
print(f"立方体移动距离:{value_node.outputs[0].default_value}")
运行脚本后,会自动创建立方体和对应的几何节点树,效果与手动操作完全一致。通过这个例子,我们可以看到:Blender 的所有手动操作,都可以通过 Python 脚本精准复现。
1.5 本章小结与进阶方向
1.5.1 核心知识点回顾
- 完成了 Blender 5.0 的安装与关键配置,确保几何节点和 Python 脚本功能正常。
- 熟悉了
bpy核心模块和脚本编辑器的使用,能编写简单的 Python 脚本创建物体。 - 掌握了三维图形核心概念(点线面、网格、体积、场等),为后续学习打下基础。
- 理解了几何节点的基础工作流,能手动和通过 Python 脚本创建简单的节点树。
1.5.2 进阶方向
- 尝试修改 "移动立方体" 脚本中的参数(如移动距离、立方体大小、位置),观察效果变化。
- 给节点树添加更多节点(如颜色节点),让立方体移动的同时改变颜色。
- 学习
bpy中节点参数的动态修改(如通过脚本实时调整 "移动距离" 的值)。 - 尝试创建多个立方体,并给每个立方体分配不同的几何节点树。