BlenderJoy —— bpy 常用基础知识
使用 Python 编写 Blender 脚本代码需要对 bpy
有一定的基础了解
选定
# 当前环境的正在处理的所有数据
bpy.context
# 当前激活项物体,只能选择一个
bpy.context.active_object
# 大纲所选中物体
bpy.context.view_layer.objects.active
bpy.context
子模块用于根据不同的状态标准访问 Blender 的对象和区域。此子模块的主要功能是为 Python 开发人员提供一种 访问用户当前正在处理的数据的方法 。如果我们创建一个按钮来排列所有选中的对象,我们可以(在代码上)允许用户选中他(在界面上)所选择的对象,然后排列bpy.context.select_objects
中的所有对象。在构建插件(addons)时,我们经常使用
bpy.context.scene
,因为它是某些插件所必需输入 Blender 的对象。我们也可以使用bpy.context
来访问活动对象,在 对象模式 和 编辑模式 之间切换,并接受来自 油性铅笔 的数据。
# 全选命令
bpy.ops.object.select_all(action='SELECT')
# 全不选命令
bpy.ops.object.select_all(action='DESELECT')
bpy.ops
正如其名字所暗含的那样,这个子模块包含操作符(Operators)。这些主要是用于 操作对象 的函数,类似于 Blender 美术人员在默认界面中操作对象的方式。子模块还可以操作 3D 视口、渲染、文本等。
- 对于操作 3D 对象,两个最重要的类是
bpy.ops.object
和bpy.ops.mesh
。object
类包含用于同时操作多个选定对象的函数以及许多通用实用程序。mesh
类包含用于每次操作一个对象的顶点、边和面的函数,通常需要切换到 Edit Mode(编辑模式)下进行操作。 例如:bpy.ops.object.mode_set(mode='EDIT') # 删除重复顶点 bpy.ops.mesh.remove_doubles() # 返回对象模式 bpy.ops.object.mode_set(mode='OBJECT')
目前
bpy.ops
子模块 中有 71 个类。
网格数据
# Mesh 变量存储物体网格数据
mesh = bpy.data.objects["mesh"]
bpy.data
该子模块用于访问 Blender 的内部数据。关于这个特定模块的文档解释起来可能有些困难(*/bpy.data.html
页面直接指向一个单独的类),但我们将在日后大量依赖它。bpy.data.objects
类包含决定 对象形状 和 位置 的所有数据。当我们说前面的子模块bpy.context
能够很好的指向对象组时,我们指的是bpy.context
类将生成对bpy.data.class
的 数据块的引用 。
# 创建 box
bpy.ops.mesh.primitive_cube_add()
# 复制网格
bpy.ops.object.duplicate(linked=False,mode='TRANSLATION')
坐标
# 当前选择物体轴心点的世界坐标
bpy.context.object.location
# 拿到选中物体的世界坐标中的 Z 坐标数值,也可能用 bpy.context.object.location[2] 来表示
bpy.context.object.location.z
# 选中物体的世界坐标中的 Z 坐标数值随机加一个数
bpy.context.object.location.z += random()
对象命名
# 查看选中物体的名字
bpy.context.object.name
# 直接更改选中物体的名字
bpy.context.object.name = "新字符串名字"
修改器
示例 1:
# 添加修改器
bpy.ops.object.modifier_add(type='DECIMATE')
# 设置修改器参数
bpy.context.object.modifiers["Decimate"].ratio = 0.1
# 应用修改器
bpy.ops.object.modifier_apply(apply_as='DATA', modifier="Decimate")
示例 2:
# 新建修改器:子表面细分
obj = bpy.data.objects.new("Wave",mesh)
...
obj.modifiers.new("subd", type='SUBSURF')
obj.modifiers['subd'].levels = 3
材质
# 返回当前选择物体的材质
bpy.context.object.active_material
# 获取当前场景的某个材质
bpy.data.materials.get(材质名称字符串)
# 给当前 `激活的物体` 的 `材质插槽` 赋某个材质
bpy.context.view_layer.objects.active.material_slots.data.active_material = 材质
.blend 文件
# 存储当前文件
bpy.ops.wm.save_mainfile(filepath="D:\TestSave.blend")
# 打开文件
bpy.ops.wm.open_mainfile(filepath=BlendFilePath)
得到当前版本的 Blender 文件夹路径
import sys
argv = sys.argv
print(argv)
遍历列表选中物体
import bpy
for i in bpy.context.visible_objects: # 迭代所有可见物体
if i.name == "要选物体的名字":
i.select_set(state=True)
for i in bpy.context.visible_objects:
if i.type == "MESH": # 判断物体类型是否是网格
bpy.context.view_layer.objects.active = i # 当前激活物体定义为 i
# 切换编辑模式
bpy.ops.object.mode_set(mode='EDIT')
# 编辑模式的(点/线/面)
bpy.context.tool_settings.mesh_select_mode = (False, True, False)
# 全选命令
bpy.ops.mesh.select_all(action='SELECT')
# 关闭编辑模式(物体模式)
bpy.ops.object.mode_set(mode='OBJECT')
参考
转载自:https://juejin.cn/post/7142085193078145060