这篇博客是一个备忘,记录下来最近学习Blender的Python脚本时,我认为较重要的东西。为了获取更详尽的内容,可以看官方文档:Quick Start ,和它列表中的文章。
Context(上下文)
上下文表示了当前编辑器所处的状态,比如bpy.context.mode
就表示了当前所处的编辑模式:
官方文档中说明了bpy.context
所涵盖的内容,他们可以理解成通常编程时的“全局变量”。
其中比较重要的是当前 选择(select)的物体,和 激活(active)的物体。比如我新建了一个圆柱和圆锥之后,框选了三个
打印出所选物体时:
>>> print(bpy.context.selected_objects)
[bpy.data.objects['Cube'], bpy.data.objects['Cone'], bpy.data.objects['Cylinder']]
打印激活的物体时:
>>> print(bpy.context.active_object)
<bpy_struct, Object("Cylinder")>
Operator(操作)
1.
关于Operator最大的发现可能是:它真的涵盖很广,从“对模型的一个顶点进行操作”到“导入导出模型这种文件读写操作”,他们都被封装进一个个独立的Operator中。想看所有的操作可看官方文档。
2.
官方文档:Gotcha’s: some of the problems you may come up against when writing scripts中指出,关于Operator的一个限制是:
Can’t pass data such as objects, meshes or materials to operate on (operators use the context instead)
这意味着,虽然一个Operator类似于通常编程时的一个函数,但是调用它并不像通常编程时要将对象作为参数传递给它,取而代之的是,它从上下文中找到对象(比如最常见的当前激活的物体bpy.context.active_object
)。
这很可能是想要与使用界面时的思路保持一致,因为当使用blender界面编辑物体时,一般都是先选好物体,然后再进行操作。
3.
一个Operator可以与一个快捷键或按钮或菜单对应起来,这也许是为什么大量的行为都被封装进了一个个的Operator中:这样方便用快捷键或界面来快速使用它们。
4.
Operator可以通过自己的脚本扩展。
info面板
当在编辑器内有操作时,info面板会报告出背后的脚本。比如我打开编辑器后,打开info面板,选择正方体,转换到Edit模式,选择一个顶点,最后移动,info面板就会有下面的输出:
但其实默认状态下是会隐藏掉一些操作的,比如刚才操作中,用鼠标选择物体和顶点的操作就没有输出出来。
想要显示所有的操作,需要在Python控制台键入:
bpy.app.debug_wm = True
之后,便可以知道之前选择物体的操作其实是:
bpy.ops.view3d.select(deselect_all=True, location=(302, 127))
info面板是一个很好的学习地方,但TextEditor中的模板可能值得优先研究。
概括下各个模块的内容
如果有想要达成的功能但找不到对应使用它的范例,也许有需要翻官方文档手动查阅API的情况。文档中指出目前的模块:
上部分是bpy中的模块,下部分是独立的模块。
bpy.context
访问上下文中的变量。
bpy.data
算是一个blender文件中的数据库
>>> bpy.data.objects
<bpy_collection[3], BlendDataObjects>
>>> bpy.data.scenes
<bpy_collection[1], BlendDataScenes>
>>> bpy.data.materials
<bpy_collection[1], BlendDataMaterials>
bpy.ops
包含所有的Operator。
bpy.types
其中定义了blender中所有的内核类
值得一提的是,blender中的类分三种:
1.Python原生类,如 float int boolean
2.这里的 bpy.types中定义的内核类,他们都继承自bpy.types.bpy_struct
3.数学相关的类,如bpy.types.Object.location
是一个Vector
bpy.utils
包含一些blender中的公用操作,但是不涉及blender中的内核类。
比如注册一个类:bpy.utils.register_class(cls)
(它可以注册:bpy.types.Panel
, bpy.types.UIList
, bpy.types.Menu
, bpy.types.Header
, bpy.types.Operator
, bpy.types.KeyingSetInfo
, bpy.types.RenderEngine
)
bpy.path
关于路径方面的公共操作
bpy.app
关于应用的公共操作
bpy.props
可以添加自定义的属性,详细用法还没有尝试。
bmesh
官方文档指出:
This API gives access the blenders internal mesh editing api。这个API可以访问blender内核的mesh数据。听描述是一个较为底层的编辑mesh的API,待后续研究。