【Blender】插件开发笔记
【Blender】插件开发笔记
开发环境配置
- 打开设置“界面-开发选项”:
这样可以通过对功能按钮的右键菜单直接复制或查看其源码,以及快速跳转到 API 手册。 - 打开设置“界面-Python 工具提示”:
这样可以通过界面的悬停菜单直接查看该条目在代码中的表示方式。 - 安装 python 环境,下载 fake-bpy-module 包:
这样可以在外部编辑器编写代码,并且有代码代码提示。 - 下载 VSCode 及其插件 Blender-Development:
这样可以快速创建插件项目并能自动导入和调试插件。
插件基本原理
插件是什么?
插件是将代码集成到 Blender 的一种方式,只要符合以下要求,便可被 Blender 识别为插件。
- 插件是一个 Python 包,即一个带有__init__.py 的文件夹。
- 该包带有 register()和 unregister()两个函数。
插件如何被集成?
Blender 识别到插件会主动调用其中的 register 和 unregister 函数,这分别发生在启用插件和禁用插件两个时段,除此之外 Blender 不会调用任何函数。
所以我们必须借助 register 和 unregister 两个时段,主动将我们的“功能”注册给 Blender 编辑器或从中取消注册。
向 Blender 编辑器注册或取消注册是借助 Blender 的内置函数实现的,使用该函数时必须要提供一个参数,而该参数正是用来传递我们的“功能”的。
# 向Blender集成功能的代码示意
import bpy # blender提供的所有功能都在bpy包中
functions = [function1,function2,function3,...] # 我们的功能
def register(): # Blender将在启用插件时调用该函数
for f in functions: # 利用数组加循环快速批量注册
bpy.utils.register_class(f) # 注册功能
def unregister(): # Blender将在禁用插件时调用该函数
for f in functions: # 利用数组加循环快速批量取消注册
bpy.utils.unregister_class(f) # 取消注册功能
集成的功能是什么?
注册功能的函数是 Blender 提供的,所以我们的功能也必须符合 Blender 注册函数对参数的要求。
具体来说这些功能实际上是几个 Blender 接口类的实现,目前 Blender 提供以下可用于集成的接口类:
bpy.types.Panel # 常见的用户界面
bpy.types.Menu # 菜单项(可通过“编辑-菜单查找”查看)
bpy.types.Operator # 操作命令(可通过“编辑-操作搜索”查看)
bpy.types.PropertyGroup # 批量存储数据的容器
bpy.types.KeyingSet
bpy.types.RenderEngine
具体关于这些接口类的解释,留到后续使用时再进行讲述。
除此之外其实还有些更高级的功能也可以注册,例如网格修改器, 对象类型或着色器节点等,但这些必须要用 C/C++实现,故不做讨论。
Blender 关键概念
内置资源
所有资源都由集合存储管理,资源的创建销毁是通过对集合的增删来实现。
在此我们把 Blender 自带的数据类型,如物体,网格,材质等叫做内置资源。
Blender 中所有的内置资源都有专门的类对应,而它们的实例则全部统一存在几个集合中。
Blender 完全用这些集合控制资源的生命周期,所以资源的创建销毁不能用常规的 new,delete 方式,而是要直接操作这些集合,集合的增删就代表着类的创建销毁。
这些集合可以通过 bpy.data 进行访问,也可以通过“大纲视图-Blender 文件”界面进行可视化访问。
# 内置资源处理伪码
import bpy
newMaterial = bpy.data.materials.new('New Material') # 创建资源
oldMaterial = bpy.data.materials['Old Material'] # 获取资源
bpy.data.materials.remove(oldMaterial) # 删除资源
自定义属性
若要存储或显示自己的数据,必须借助“自定义属性”功能来实现。
自定义属性是 Blender 提供的一种在 Blender 文件中存储数据的方法,除此之外没有其他方式。
用户可以利用 Blender 提供的属性类创建自己的数据容器,并将其附加到任何一个 Blender 的内置资源上。
不单是存储数据,如果要在面板上显示数据,也必是自定义属性的数据才行。
在代码中利用 bpy.props 空间提供的类就能创建自定义属性对象,或在资源面板的“自定义属性”子面板中也能可视化编辑。
# 自定义数据存储伪码
import bpy
def register():
# 向Scene类型注册一个名为my_data的自定义属性
bpy.types.Scene.my_data = bpy.props.StringProperty()
def unregister():
# 取消注册自定义属性
del bpy.types.Scene.my_data
def my_function():# 在自己的函数中使用自定义属性
bpy.data.scenes['Scene'].my_data = 'Hello Blender' # 给名为"Scene"的场景资源中的自定义属性赋值
print(bpy.data.scenes['Scene'].my_data) # 读取自定义属性
运算符
若要实现显示或执行自定义功能,必须借助“运算符”功能来实现。
Blender 中所有的可执行功能也即界面上的按钮都一定对应一个运算符,可以借此在代码中像在用户界面上一样调用这些功能,blender 内置的运算符都存放在 bpy.ops 空间。
同理若要实现自己的功能并显示在界面上也一定要实现自己的运算符。
# 自定义运算符伪码
class MyOperator(bpy.types.Operator): # 某个自定义运算符
bl_idname = "my.operator" # 自定义属性的ID
class MyPanel(bpy.types.Panel): # 某个自定义面板
layout.operator(MyOperator.bl_idname, text="MyOperator") # 显示运算符
# 两者都需要注册
bpy.utils.register_class(MyOperator)
bpy.utils.register_class(MyPanel)
Blender 框架结构
根据框架结构可以了解到 Blender 中有哪些可操作对象,以及它们的关系,配合英文名搜索,可以快速定位目标对象在代码中的修改位置。
库结构
bpy.types #blender中所有的类型,可以此为特定类注册自定义属性,以及获取用于继承的接口类。
bpy.props #blender中所有的属性类型,可用于创建自定义属性。
bpy.ops #blender中所有的自带运算符,当成函数调用则可直接运行。
bpy.data #当前文件里所有的资源,对应“大纲视图-Blender文件”界面。
bpy.context #当前编辑环境,如选中的物体,正在使用的编辑模式等。
bpy.utils #可选的帮助函数,注意用于注册或取消注册自定义类。
bpy.msgbus
bpy.path
bpy.app
文件结构
参考“大纲视图-Blender 文件”界面
bpy.data.
#用户界面相关
window_managers. #窗口管理器
workspaces. #工作区:编辑器顶部切换工作区域的工具栏
screens. #屏幕:编辑器中间的工作区域
#工具相关
brushes. #笔刷
palettes. #调色板
#场景资源
worlds. #世界环境
collections. #集合
objects. #物体
scenes. #场景
#物体资源
cameras. #摄像机
lights. #灯光
meshes. #网格
#渲染资源
images. #图像
materials. #材质
linestyles. #线条样式
资源结构
参考“大纲视图-Blender 文件”界面
bpy.context.
scene. #当前场景
view_layers. #视图层
world. #世界环境
collection. #集合
objects. #物体
active_object. #当前选中的物体
data. #物体绑定的数据,存在多种类型
data(camera). #相机
data(light). #灯光
data(mesh). #网格
materials. #材质
界面结构
参考 https://docs.blender.org/manual/en/latest/interface/index.html#window-system
bpy.context.screen. #当前工作区
areas. #工作区细分为多个功能区域
regions. #将区域中的界面按部位进一步细分
spaces. #区域空间信息,存在多种空间类型
space(SpaceView3D). #3D视图空间
SpaceView3D
SpaceView3D.
region_3d. #3D视图区域数据
view_perspective #视图投影模式
view_camera_offset #相机视图偏移
view_camera_zoom #相机视图缩放
工具结构
图像绘制工具
bpy.context.tool_settings #当前使用工具的相关设置
image_paint. #图像绘制工具
brush. #当前使用的笔刷
texture_slot #纹理功能设置
stencil_dimension #楼板尺寸
stencil_pos #楼板位置
bpy.context.active_object. #当前选择的物体
active_material. #当前选择的材质球
texture_paint_images #当前可绘制的贴图
paint_active_slot #当前绘制中的贴图索引
常用接口类
Operator
添加自定义操作时必须要实现 Operator。
class bpy.types.Operator:
# 必填,需要按“类别.名称”的ID格式填写,具体内容可自定义,但点号必须要有且全小写。
bl_idname : str
# 必填,表示操作名称。
bl_label : str
# 可选,用于告知blender该运算符是否可用。
@classmethod
def poll(cls, context) -> bool
# 必填,用于编写执行操作的具体代码。
def execute(self, context) -> Set[str]
Panel
添加自定义面板界面时必须要实现 Panel。
class bpy.types.Panel:
# 必填,表明该面板应显示在哪种界面空间上。
bl_space_type : str
# 必填,表示该面板的区块类型。
bl_region_type : str
# 必填,表示面板标题。
bl_label : str
# 可选,表明显示在所处界面的哪个二级分类下。
bl_category : str
# 必填,用于编写绘制界面的代码。
def draw(self,context) -> None
PropertyGroup
自定义参数过多时可以借助 PropertyGroup 实现合并注册。
class bpy.types.PropertyGroup:
# 任意个用类型注解表示的自定义属性,不要赋值
......
常用操作
绘制界面
bpy.types.Panel 等类提供名为 layout 的成员变量,该变量提供绘制函数使用。
# 使用案例
class MyPanel(bpy.types.Panel):
def draw(self, context):
layout = self.layout
# 显示文字
layout.label(text="渲染参数")
# 显示属性
column = layout.column(align=True) # 创建布局组
column.prop(context.scene.render, "resolution_x",text="宽度")
column.prop(context.scene.render, "resolution_y",text="高度")
# 显示操作
layout.operator("view3d.view_center_camera", text="重置摄像机视图")
弹出信息
bpy.types.Operator 等类提供名为 report 的成员函数,可以在底部信息栏弹出消息。
# 使用案例
class MyOperator(bpy.types.Operator):
def execute(self, context):
if(context.active_object == None):
self.report({"ERROR"}, "当前没有激活的物体")
return {"CANCELLED"}
return {"FINISHED"}
细节提示
- 在注册期间无法访问 bpy.data 和 bpy.context,所以要注册自定义函数必须借助 bpy.types 以类为目标。
- 可以借助“编辑”菜单中的“菜单查找”和“操作搜索”找到注册进 blender 的自定义菜单或运算符。
- 如果要利用插件传递资源,可以在插件中携带 blender 文件,并利用“关联”和“追加”功能实现。
- 如果在自定义运算符的 bl_idname 中使用了非官方的类别,那右键菜单中将缺少指定快捷键功能。
参考资料
【Blender】插件开发笔记的更多相关文章
- Blender节点笔记
Blender节点笔记实现复杂材质,纹理的更直观的方式就是使用节点功能. 每个节点左边作为输入,右边作为输出.节点之间通过传递值影响后者.传递的值为(Scalars,Vectors)标量与矢量.二维矢 ...
- Jenkins 插件开发笔记
笔记云盘下载链接: https://pan.baidu.com/s/1gfohF1p 密码: v759
- rhythmbox插件开发笔记1:简介&入门
rhythmbox是gnome下一款开源的音乐播放软件.ubuntu和fedora的桌面环境中均默认安装了rhythmbox. rhythmbox架构非常灵活,几乎所有地方都可以用插件来修改.用户想实 ...
- jQuery 插件开发 笔记
JQuery 插件开发: 类级别开发,开发新的全局函数 对象级别开发,给Jquery对象开发新方法 一.类级别开发 -定义全局方法 jQuery.foo = function() { alert('T ...
- Blender学习笔记
本文是根据B站上面,顺子老师的视频学习整理,建模部分,并未设计到渲染,内容整理所得 下载安装,可以直接在blender官网下载,建议下载最新版吧.因为每次软件的更新都会有新的东西出现,在使用中把你的心 ...
- Blender 快捷键笔记
A Select All/Unselect All shift+A Create Z 切换wireframe和solid mode TAB Start or quit EditMode B Activ ...
- rhythmbox插件开发笔记3:安装 makefile && schema && po
本篇主要讲通过makefile方式来安装rhythmbox插件的相关知识. makefile 如果makefile是什么,请自行谷歌 参考了pandasunny同学的rhythmbox-baidu-m ...
- rhythmbox插件开发笔记2:背景知识学习 D-Bus&VFS&Gio& Python GTK+ 3
这次主要简单介绍下相关的背景知识 D-Bus&VFS&Gio& Python GTK+ 3 D-Bus D-Bus是开源的进程通信(IPC)系统,它允许多个进程进行实时通信. ...
- Chrome插件开发笔记
使用 XMLHttpRequest来抓取盗版小说网站里面的内容,但是注意需要在manifest.json文件中设置permission var xhr = new XMLHttpRequest();x ...
- Android动态加载框架汇总
几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...
随机推荐
- whisper v3 finetune 中文乱码问题的解决方案
最近学习了一下whisper的微调,主要是参考了github上的夜雨飘零大神项目.但是在操作中遇到了微调中文的时候出现了乱码的情况.以下是我这边对于微调过程中中文出现乱码情况的解决方案. 出现情况如下 ...
- C#中使用IMemoryCache实现内存缓存
1 缓存基础知识 缓存是实际工作中非常常用的一种提高性能的方法. 缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能和可伸缩性. 缓存最适用于不经常更改的数据. 通过缓存,可以比从原始数据源返 ...
- 《前端运维》五、k8s--2pod、services与Ingress部署
前一篇啊,我们学完了基本的配置.这一篇,我们来看下服务部署的配置.我们先来看张图,理解下k8s的应用场景和调用流程: 看上图,首先,master是控制节点,负责编排.管理.调度用户提交的作业.kube ...
- Shiro简单入门+个人理解(3)
最后一天,对shiro框架的应用也到此为至了,可能不是太全,但相对于一般的项目,它的作用已经使用了很多了 Shiro的授权: 授权:对用户资源访问的授权(是否允许用户访问此资源) 用户访问系统资源时的 ...
- IOS多线程之NSOperation(1)
IOS多线程之NSOperation(1) NSOperation 是 OC 语言中基于 GCD 的面向对象的封装: 提供了一些用 GCD 不好实现的功能: 线程的生命周期由系统自动管理. NSOpe ...
- 中电金信:亚洲TOP1 霸榜15年
近日,国际权威语言服务研究机构CSA Research公布了<2022年全球语言服务提供商100强>和<亚太地区TOP 30语言服务商>排名报告. 中电金信凭借卓越的品质管控. ...
- 【Mybatis】学习笔记02:实现简单的查
Mybatis02:简单的查 如果你没先去学 增删改 ,然后直接看这篇记录,我想会有些困难.因为该文写的很粗劣,只是简单的截图.所以没基础的建议先去看 [Mybatis]学习笔记01:连接数据库,实现 ...
- Android信任证书,把用户级别放入系统级别
三.操作步骤 1.在Windows安装openssl,用来把证书转成 .pem 格式 1)下载和安装 下载其他人做的便捷版安装包:http://slproweb.com/products/Win32O ...
- Qt开源作品36-程序守护进程
一.前言 没有任何人敢保证自己写的程序没有任何BUG,尤其是在商业项目中,程序量越大,复杂度越高,出错的概率越大,尤其是现场环境千差万别,和当初本地电脑测试环境很可能不一样,有很多特殊情况没有考虑到, ...
- IntelliJ IDEA 2020+Maven+SSM框架正常编译并与行后端代码时控制台的提示信息