Python + Blender 5.0 几何节点全栈实战教程1

前言

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
CPU4 核 Intel i5 / AMD Ryzen 58 核 Intel i7 / AMD Ryzen 7
内存8GB16GB 及以上
GPU支持 OpenGL 4.3 的集成显卡NVIDIA RTX 3060 / AMD RX 6600 及以上(支持 CUDA/OptiX)
硬盘10GB 空闲空间(SSD 优先)20GB 空闲空间(NVMe SSD)
其他鼠标滚轮(缩放 / 平移场景)、互联网连接(安装插件)数位板(精细操作)、多显示器(分屏操作)
1.1.2 安装步骤(以 Windows 11 为例)
  1. 下载安装包:访问 Blender 官网,选择 Blender 5.0 版本(默认下载 64 位安装包)。
  2. 运行安装程序:双击下载的 .exe 文件,勾选 “同意协议”,点击 “下一步”。
  3. 选择安装路径:建议安装在非系统盘(如 D:\Blender 5.0),避免系统盘空间不足。
  4. 组件选择:默认勾选 “Blender 主程序”“Python 3.11 集成环境”“关联 .blend 文件”,无需修改。
  5. 完成安装:点击 “安装”,等待进度条完成后,勾选 “运行 Blender”,点击 “完成”。
1.1.3 关键配置(首次启动必做)
  1. 语言设置:启动后点击顶部菜单栏 Edit → Preferences → Interface → Translation,选择 “简体中文”,点击 “Save Preferences”(重启后生效)。
  2. 脚本编辑器启用:点击顶部菜单栏 Window → Toggle System Console,打开系统控制台(用于查看 Python 脚本输出和错误信息)。
  3. 插件启用:点击顶部菜单栏 Edit → Preferences → Add-ons,搜索 “Geometry Nodes”(默认已启用)、“Python Scripting”(默认已启用),确保勾选状态。
  4. 性能优化:点击 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 脚本:

  1. 打开脚本编辑器:在 Blender 界面顶部选择 Scripting 工作区(默认工作区包括 “布局”“雕刻”“脚本” 等)。
  2. 新建脚本:点击脚本编辑器顶部的 New 按钮,创建一个空白脚本文件(默认命名为 Text)。
  3. 保存脚本:点击 Save 按钮,将脚本保存为 .py 文件(如 first_blender_script.py),建议保存在 Blender 项目文件夹中。
  4. 运行脚本:点击脚本编辑器顶部的 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 手动创建第一个几何节点树(以 “移动立方体” 为例)
  1. 切换到 “布局” 工作区,删除默认物体(立方体、灯光、相机)。
  2. 添加一个新立方体:点击顶部菜单栏 Add → Mesh → Cube,创建一个默认立方体。
  3. 添加几何节点修改器:选中立方体,在右侧 “属性” 面板中选择 修改器 → 添加修改器 → Geometry Nodes
  4. 进入几何节点编辑器:在顶部工作区选择 Geometry Nodes,此时会看到默认的节点树(包含 “Group Input”“Group Output” 节点)。
  5. 添加节点:
    • 点击节点编辑器顶部的 Add → Input → Value,添加一个数值输入节点(命名为 “移动距离”)。
    • 点击 Add → Geometry → Position,添加位置节点(读取立方体顶点位置)。
    • 点击 Add → Vector → Add,添加向量相加节点(将位置与移动距离相加)。
    • 点击 Add → Geometry → Set Position,添加设置位置节点(修改立方体顶点位置)。
  6. 连接节点:
    • 将 “Group Input” 的 “Geometry” 输出端 → 连接到 “Position” 的 “Geometry” 输入端。
    • 将 “Position” 的 “Position” 输出端 → 连接到 “Add” 的 “Vector” 输入端。
    • 将 “Value”(移动距离)的 “Value” 输出端 → 连接到 “Add” 的 “Vector” 输入端(第二个)。
    • 将 “Add” 的 “Vector” 输出端 → 连接到 “Set Position” 的 “Position” 输入端。
    • 将 “Set Position” 的 “Geometry” 输出端 → 连接到 “Group Output” 的 “Geometry” 输入端。
  7. 调整参数:修改 “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 进阶方向
  1. 尝试修改 “移动立方体” 脚本中的参数(如移动距离、立方体大小、位置),观察效果变化。
  2. 给节点树添加更多节点(如颜色节点),让立方体移动的同时改变颜色。
  3. 学习 bpy 中节点参数的动态修改(如通过脚本实时调整 “移动距离” 的值)。
  4. 尝试创建多个立方体,并给每个立方体分配不同的几何节点树。

Read more

【C++】哈希扩展——位图和布隆过滤器的介绍与实现

【C++】哈希扩展——位图和布隆过滤器的介绍与实现

各位读者大佬好,我是落羽!一个坚持不断学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页:落羽的落羽 文章目录 * 一、位图 * 1. 概念与实现 * 2. std::bitset * 二、布隆过滤器 * 1. 概念 * 2. 布隆过滤器误判率数学推导 * 3. 实现 一、位图 1. 概念与实现 在许多公司的面试题中会考到这样的场景:给40亿个不重复无符号整数,如何快速判断一个数是否在这40亿数中。 如果使用常规思路,每次查询暴力遍历O(N)太慢,排序+二分查找O(NlogN)+O(logN),内存不足以放下这些数据。 数据是否在给定的整型数据中,结果是在或不在,正好是两种状态,那么可以用一个二进制比特位来代表数据是否存在的信息,比特位为1代表存在,比特位为0代表不在。那么,我们可以设计一个用比特位表示数据是否存在的数据结构——位图!

By Ne0inhk

Java 基础(使用IDEA)

Java基础01:注释 * 书写注释是一个非常好的习惯 * 平时写代码一定要规范 * 注释不会被执行,是给我们写代码的人看的 * Java中的注释有三种 * 单行注释 * 多行注释 * 文档注释 首先创建一个空项目 配置环境 单行注释 多行注释 文档注释 注释的颜色修改 Java基础02:标识符和关键字 Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。 1. 关键字 (Keywords) * 定义:Java语言中被赋予了特殊含义、用做专门用途的字符串(单词)。 * 列表:包括 abstract, boolean, break, class, public, static, void, if, else, return等。 * 特点: * Java中所有关键字都是小写的。String?System? * 在开发工具(IDE)中通常会高亮显示。 * 补充知识(便于理解): * 保留字

By Ne0inhk