这篇博客是一个备忘,记录下来最近学习Blender的Python脚本时,我认为较重要的东西。为了获取更详尽的内容,可以看官方文档:Quick Start ,和它列表中的文章。

Context(上下文)

上下文表示了当前编辑器所处的状态,比如bpy.context.mode就表示了当前所处的编辑模式:

blender python 中文文档 blender python脚本_快捷键


blender python 中文文档 blender python脚本_快捷键_02


官方文档中说明了bpy.context所涵盖的内容,他们可以理解成通常编程时的“全局变量”。

其中比较重要的是当前 选择(select)的物体,和 激活(active)的物体。比如我新建了一个圆柱和圆锥之后,框选了三个

blender python 中文文档 blender python脚本_blender python 中文文档_03


打印出所选物体时:

>>> 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面板就会有下面的输出:

blender python 中文文档 blender python脚本_快捷键_04


但其实默认状态下是会隐藏掉一些操作的,比如刚才操作中,用鼠标选择物体和顶点的操作就没有输出出来。

想要显示所有的操作,需要在Python控制台键入:

bpy.app.debug_wm = True

之后,便可以知道之前选择物体的操作其实是:

bpy.ops.view3d.select(deselect_all=True, location=(302, 127))

info面板是一个很好的学习地方,但TextEditor中的模板可能值得优先研究。

概括下各个模块的内容

如果有想要达成的功能但找不到对应使用它的范例,也许有需要翻官方文档手动查阅API的情况。文档中指出目前的模块:

blender python 中文文档 blender python脚本_Python_05


上部分是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,待后续研究。