Blender 入门
utils
本文字数:1.5k 字 | 阅读时长 ≈ 5 min

Blender 入门

utils
本文字数:1.5k 字 | 阅读时长 ≈ 5 min

@by leonardklin

安装说明

桌面端通过Download — blender.org网页下载并安装 Blender。

(无头)服务端不需要安装 Blender 桌面端,而是直接安装 bpy 的 python 包,以调用 Blender API,pypi 网址如下 bpy · PyPI。实际上,bpy 包中已经编译了对渲染引擎(OpenGL 等)的调用,因此不需要安装桌面端,但是需要安装相应的渲染系统软件包。

对于 CentOS 类系统:

sudo yum install libXext libSM libXrender
sudo yum install mesa-libGL mesa-libGL-devel mesa-libGLU mesa-libGLU-devel mesa-libEGL mesa-libEGL-devel mesa-dri-drivers glx-utils

对于 Debian 类系统:TODO

注意:不同的 bpy 包对应着不同的桌面端版本,以及不同的 Python 解释器版本,安装 Python 和 bpy 之前需要详细确定其对应关系。例如,bpy==4.1.0 对应 Blender 4.1 版本,且只能在 Python 3.11 下安装;bpy==4.0.0 对应 Blender 4.0 版本,且只能在 Python 3.10 下安装。

如果一定需要在非对应的 Python 版本下安装 bpy,则需要手动下载其编译后的 wheel,并重命名后手动 pip 安装。例如,将 bpy-4.0.0-cp310-cp310-win_amd64.whl 重命名为 bpy-4.0.0-cp311-cp311-win_amd64.whl 则可能可以在 Python 3.11 环境下进一步安装,但是不保证安装成功或运行正常。

基本操作

Blender 桌面端的基本操作指南在此处略过,请自行查阅视频教程:https://www.bilibili.com/video/BV1kX4y1m7G5。如果只需要学会基本的操作的话,看前 2、3 个分 p 已经足够。

一些常用快捷键如下:

a 全选

x 删除

g 将选中物体任意移动

gx gy gz 将选中物体沿 x y z 轴移动

r 将选中物体任意旋转

rx ry rz 将选中物体沿 x y z 轴旋转

shift+` 进入 walk 模式,像 fps 游戏一样在场景中移动,walk 模式中长按 shift 加快移动速度,长按 alt 减慢移动速度,空格键将视角迅速移动到光标中心的物体前

z 切换视图的渲染模式

待补充……

Blender Scripting 工作区

对于调试 Blender API,Blender 桌面端中的 Scripting 工作区起到非常关键的作用。在 Scripting 模式中,可以实时的看到各个 UI 操作对应的底层 API 代码,同时也有实时地调试窗口。

首先前往菜单栏的"Edit-Preferences-Interface-Display"中勾选"Python Tooltips"功能,之后将鼠标悬浮在任意 UI 按钮上,都可以在浮动的 Tooltip 中看到齐对应的 API 代码:

之后,前往 Scripting 工作区:

Scripting 工作区的左下窗口就是实时命令窗口,可以看到之前的 UI 操作对应命令,以及可以运行命令。右侧的窗口则是脚本区,可以编写 Python 脚本并运行。

Blender API

Blender API,即 bpy 包,允许我们使用 Python 脚本来控制 Blender 的行为。API 文档:Blender Python API。

首先要明确的是,Blender API 是类似于自动机的设计(也类似于各类渲染引擎),其维护着一个巨大的 global state,而我们只允许顺序操作地改变其 global state。

API 基本数据结构:bpy.context 和 bpy.data

API 的调用围绕着 bpy.context 和 bpy.data 两个重要对象的访问。在 Scripting 工作区的实时窗口中,还可以用 C = bpy.context, D = bpy.data 来快速指代。

在 bpy.context 中,记录着整个 Blender 的当前 global state,包括目前的 workspace,selected_objects,active_object 之类,具体文档可见 Context Access (bpy.context) - Blender Python API。

在 bpy.data 中,则更多的记录了当前已经导入的各种数据,类似于一个专门的数据区,包括且不限于当前存在的 mesh,camera、light 等等。具体文档可见 BlendData(bpy_struct) - Blender Python API。

bpy.data 与 context 最大的区别在于,data 是存放所有“静态”数据的地方,而 context 是维护所有“动态”状态的地方。例如,我们可以在 context 中切换不同的 scene,每个 scene 下可能包含不同的 mesh 对象,然而这些所有的 mesh 对象实际都会被放置在 data 中,context 只是获取了 data 中 mesh 对象的引用。

API 基本概念:C.selected_objects 和 C.active_object

selected_objects 的概念非常好理解。我们在 Blender 界面中,通过长按 Ctrl 键再依次选中多个物体,就可以做到“多选”物体。其中被多选的物体,即会被反映在 selected_objects 中。

但 active_object 更多是用于 Blender 内置的 Operator 之中。通常而言,“最后被选中的物体”即是 active_object。在 Blender API 中调用 Operator 时,如果是对单 object 应用的 Operator,则多数情况下就是对 active_object 实施效果。此外,调用 Operator 创建新 object 时,例如使用 bpy.ops.mesh.primitive_plane_add 创建新平面时,可以发现函数并没有直接返回创建的对象,而是会自动的将新创建的对象设置为当前的 active_object。

另一个在桌面端分辨 active_object 和 selected_objects 的方式可以通过辨认颜色来进行。selected_objects 物体的颜色如上图,偏橘色;而 active_object 物体的颜色更加偏黄色,即图片中心的墙体。

Blender Operator

通过调用 Blender Operator,可以模拟桌面端的各种操作。具体文档可见 Operators (bpy.ops) - Blender Python API。

实际上,Blender 桌面端许多操作都是以 Blender Operator 的形式实现,在 Scripting 工作区的实时窗口中,可以看见具体的 Operator API 调用。

快速开发流程

一个经典的开发调试范式:

运行 Blender 桌面端,切换至 Scripting 工作区

在 Scripting 工作区进行各种操作,记录实时窗口中反馈的各种 API 调用信息

将 API 调用信息编写为 Python 脚本

使用实时窗口进行调试

使用 Python Tooltips 获取各个按钮对应的 API

查阅 API 文档

反馈并调试

按照上述方案开发,可以大幅加快调试速度,并且减少对 API 文档对依赖性(尤其是 API 文档很多功能写的很不全面)。