Blender

Blender

Not enough ratings
【Blender】零基础脚本/插件开发入门
By 吾之野望
作为一名同时接触过Python和Blender的玩家,我发现社区的脚本/插件教学几乎空白,在阅读了《斑斓·视界》杂志第21期之后,我产生了一个大胆的想法:或许,我能自己写一个入门教学?
于是,这篇指南就这样诞生了,希望能起到一个抛砖引玉的作用。
   
Award
Favorite
Favorited
Unfavorite
前言/概要
作为一名同时接触过Python和Blender的玩家,我近期尝试深入研究Blender的"脚本"工作区,却发现社区中的脚本/插件开发教程近乎空白。

在阅读了斑斓中国的《斑斓·视界》杂志第21期[www.blendercn.org]之后,我产生了一个大胆的想法:或许,我可以详细展开案例,扩写这些东西,自己写一个入门教学?
于是,这篇指南就这样诞生了。

当然,我不是专业人士,文中所有结论均来自《斑斓·视界》和我自身的使用/调试经验,难免存在理解偏差或操作疏漏,希望本文能起到一个抛砖引玉的作用。

一、准备
虽然我标题写的零基础,但是这种事情确实没法实现真正的零基础,个人感觉Blender脚本这方面的内容还是有一定门槛的,所以,
你需要准备以下内容:
  • 较好的动手能力和思考能力
  • 一点Python和Blender基础
  • 一台装有VS Code的电脑

↑VS Code

VS Code(Visual Studio Code)是一款由微软推出的免费、开源、跨平台的代码编辑器
出于这些原因,它非常适合前端开发,Python和C/C++开发体验也非常好,因此,我们的Blender脚本也选择使用VS Code

你可以用以下链接下载:



如果你没有任何编程相关经验,下载完成后,请打开VS Code。
接着,如图所示,点击左侧的扩展页面

↑步骤详见图片
你需要先搜索并安装“Chinese”来让VS Code变为中文。
接着,你需要搜索并安装“Python”,使VS Code能对Python语言提供支持。



你还需要为你的电脑安装Python

进入后点击“Download”下的内容,并按照要求完成安装即可,这里不过多赘述。

如果你不确定是否安装成功,可以打开终端(Win+R,输入cmd并运行),然后在终端输入python,显示当前版本号等信息意味着安装成功。
二、Blender相关页面
虽然Blender本身使用C/C++编写,但脚本和插件都使用Python
Blender内部也提供了相关面板用于脚本/插件开发。
面板先不深究,先将鼠标移动至正上方,如下图,可以通过此按钮进入“脚本”工作区

↑脚本工作区详解,如图所示

左下角的区域是“信息”
这块区域能输出Blender的操作,以及脚本的一些内容,例如图中显示为“bpy.ops.text.run_script()”,它的意思是执行文本编辑器中编写的Python脚本,且无需切换至外部IDE。
再往上的区域是“Python控制台”
这里主要是用于测试/使用代码,可以使用Tab键补全。

正中间是“文本编辑器”
这个区域主要用于编写Python或是开放式着色语言(OSL),在这个区域中间还能简单地管理文本数据块,以及,这里还有运行脚本按钮。
并且,它还提供了一些模板供用户学习,这也就是本文接下来的内容。
三、案例 Addon Add Object
如本节标题,本节主要是讲解模板中的“Addon Add Object”,采用为代码添加注释的形式进行讲解。

# 要使这个插件可安装,需要按照以下教程创建扩展包: # https://docs.blender.org/manual/en/latest/advanced/extensions/getting_started.html # 导入必要的工具包 import bpy # Blender的Python API主模块 from bpy.types import Operator # 创建操作的基类 from bpy.props import FloatVectorProperty # 定义可调整的属性 from bpy_extras.object_utils import AddObjectHelper, object_data_add # 添加物体的辅助工具 from mathutils import Vector # 处理3D坐标的数学工具 # 核心函数:创建矩形平面 def add_object(self, context): # 从用户输入获取矩形的宽和高 scale_x = self.scale.x # X轴缩放 = 宽度 scale_y = self.scale.y # Y轴缩放 = 高度 # 定义矩形的四个角坐标(Z轴为0表示平面) verts = [ Vector((-1 * scale_x, 1 * scale_y, 0)), # 左上角 Vector((1 * scale_x, 1 * scale_y, 0)), # 右上角 Vector((1 * scale_x, -1 * scale_y, 0)), # 右下角 Vector((-1 * scale_x, -1 * scale_y, 0)), # 左下角 ] edges = [] # 不需要单独边(因为用面定义) faces = [[0, 1, 2, 3]] # 连接四个顶点形成一个面 # 创建新网格数据 mesh = bpy.data.meshes.new(name="New Object Mesh") mesh.from_pydata(verts, edges, faces) # 将坐标数据转为网格 object_data_add(context, mesh, operator=self) # 将网格添加到场景 # 定义Blender操作按钮 class OBJECT_OT_add_object(Operator, AddObjectHelper): """创建一个新的矩形网格物体""" # 操作描述 bl_idname = "mesh.add_object" # 操作ID(内部调用名) bl_label = "添加矩形平面" # 界面显示名称 bl_options = {'REGISTER', 'UNDO'} # 支持撤销/重做 # 定义可调整的属性(在Blender中显示为滑块) scale: FloatVectorProperty( name="缩放尺寸", # 属性名称 default=(1.0, 1.0, 1.0), # 默认值 (宽, 高, 厚度) subtype='TRANSLATION', # 界面显示为坐标控件 description="控制矩形的宽度和高度", # 鼠标悬停提示 ) # 当用户点击按钮时执行 def execute(self, context): add_object(self, context) # 调用创建函数 return {'FINISHED'} # 告诉Blender操作已完成 # 插件注册系统 # 在"添加物体"菜单中创建按钮 def add_object_button(self, context): self.layout.operator( OBJECT_OT_add_object.bl_idname, text="添加矩形", # 按钮文字 icon='PLUGIN', # 插件图标 ) # 右键菜单文档链接配置 def add_object_manual_map(): url_manual_prefix = "https://docs.blender.org/manual/en/latest/" # 点击该链接没有作用,因为这是Steam自动标注链接 url_manual_mapping = ( ("bpy.ops.mesh.add_object", "scene_layout/object/types.html"), ) return url_manual_prefix, url_manual_mapping # 注册插件到Blender系统 def register(): bpy.utils.register_class(OBJECT_OT_add_object) # 注册操作类 bpy.utils.register_manual_map(add_object_manual_map) # 注册帮助文档 bpy.types.VIEW3D_MT_mesh_add.append(add_object_button) # 添加到3D视图菜单 # 卸载插件时清理 def unregister(): bpy.utils.unregister_class(OBJECT_OT_add_object) # 注销操作类 bpy.utils.unregister_manual_map(add_object_manual_map) # 注销帮助文档 bpy.types.VIEW3D_MT_mesh_add.remove(add_object_button) # 从菜单移除按钮 # 直接运行脚本时启用插件 if __name__ == "__main__": register()



简单来说,这个脚本的作用是在场景中添加一个可自定义大小的矩形平面
运行这个脚本后,还需要点击添加→网格→添加物体,才可以添加物体。

↑如上图所示

现在,我们已经对Blender脚本有了一个简单的了解。
但需要注意的是,所有涉及bpy和Blender对象操作的代码都必须在Blender的Python环境中运行,无法在标准Python解释器中执行。
接下来,我们会解决这个问题,借助外部编辑器。
其它内容正在完善
1 Comments
sewersld 14 Jun @ 10:23pm 
太帅辣!