前言
一个偶然的机会接触到 Blender插件编写,一直以来我都是(曾经是) Maya以及Houdini软件的拥护者,但是Blender 的开源社区逐渐壮大也不能不引起重视,那么是时候了解一下Blender的相关内容。
Blender的交互层都是用Python来编写的,这就相当友好了。作为一个使用过python用来数据分析以及编写爬虫爬 *** 内容的人表示这很开心。
基础模板
|
|
整体思路还是比价简单的。以上代码就是套路,不需要理解,主体为bpy.utils.register_module(name),作用是注册import进来的所有模块。至于command_operators.register() 与 view_panels.register()则代表其他非模块相关的注册。这里的代码以后要新建工程直接ctrl c即可。直接运行main函数,就可以注册插件。z注册插件后就可以编写自己的插件内容并且分别在 register() 和 unregister() 中调用。
编写一个 check object命名的功能吧
我希望我的这个插件可以实现的功能是遍历当前场景内全部的object,然后根据命名规则判断正确还是错误,命名规则如下。
<asset_type><descriptive_name><descriptive_name>_<##>
- 其中<asset_type> 可以为 char, prop, veg, veh, arch 和 tree
- 中间的<descriptive_name>可以有2-3个不同的名字,并且全部为小写的英文字母
- 最后的<##> 是数量,从01 最大可以到99
并且把最终的结果输出到一个html网页中并渲染出来。最终效果如下
先写基础模板把我的CheckNamesOperator 注册上去
|
|
功能实现部分的思路如下。先遍历场景内的object, 然后读到这个object的当前命名内容,把他当作一串string。整体思路有点类似之前编程课写的string parser。这里把命名string用split("_")拆分为三部分并且放在一个tags list中
Prefix
第一部分的asset_type 是prefix 用tags[0] 提取,判断第一部分的类型,可以预先用一个list把valid prefixes提前写好,判定提取的string是否在list中
|
|
Suffix
第三部分的## 用tags[-1]提取, 最后一部分的内容是长度为2 的数字。数字的判定用python自带的ValueError来判定,如果不报错就是数字。
|
|
Identifiers
中间的部分descriptive_name用tags[1:-1] 提取,先判断中间部分有几个descriptive_name, 规则只允许2-3个。其次要求descriptive_name全部为小写的英文字母
|
|
这样最核心的判定就完全结束了。现在来编写输出的部分
class CheckNamesOperator(bpy.types.Operator): “““Check Object Names””” bl_idname = “object.check_naming” bl_label = “Check Object Names”
|
|
这是一段我借鉴来的代码。主要涉及到几部分内容。
- 这是一个class 的 CheckNamesOperator,也就是我们的检查器对象。
- 其中最核心的部分在 exeute() 内,用以运行刚刚的检查逻辑函数,并且把结果保存在results[] 这个list中
- 输出王爷的部分,其实这是一个调用IO的函数,主要是遍历刚刚我们保存下来的results 数组并且逐行按照我们的目标效果编译出来的,中间还涉及到html 和css代码(虽然挺丑的)。最终把Html保存在Blender相同的目录下面。
检查代码效果
创建几个object,并且根据我们的目标规则,更改命名。可以看到场景内对对错错的object有好几个,虽然我不是专业的测试,但是基础的边界测试还是要有的。
检查完自动弹出的检查结果窗口,很丑,但是可以提示我们哪里有错误,可以及时修改。
再写一个Pie Menu的Object生成菜单
插件的逻辑
- View3D_MT_PIE_template(menu) 用以继承官方的pie menu并且在下面添加我们自己的功能按钮,用pie.operator()
- View3D_OT_PIE_template_call(menu) 用以在场景内呼出这个菜单
- 每一个功能按钮单独用一个class实现,bl_idname就是在pie.operator()中调用的id, 每一个功能按钮都有一个execute用以运行。其中的功能可以自行设计,我这里就调用比如生成plane, cube, sphere的代码
- 额外编写一个add_hotkey()用以实现快捷键呼出菜单的功能,核心是这一段,用以调用场景内呼出菜单的效果。
|
|
- 最后的最后,把全部实现的功能都注册在register()和unregister()中就可以了。
插件在Blender中效果实现如下
完整插件代码如下,可以直接复制并且安装在blender中,默认是shift + D呼出菜单。
|
|
Reference