likes
comments
collection
share

BlenderJoy —— bpy 常用基础知识

作者站长头像
站长
· 阅读数 37

使用 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.objectbpy.ops.meshobject 类包含用于同时操作多个选定对象的函数以及许多通用实用程序。
  • 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) 

BlenderJoy —— bpy 常用基础知识

遍历列表选中物体

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') 

BlenderJoy —— bpy 常用基础知识

BlenderJoy —— bpy 常用基础知识

参考

Blender Python API

转载自:https://juejin.cn/post/7142085193078145060
评论
请登录