进入blender,删除所有对象。在菜单栏上,点击脚本工作区,则可进入代码编辑界面,其左下角为控制台,可以输入实时的控制代码。
下面用代码生成一个立方体。
import bpy
bpy.ops.mesh.primitive_cube_add()
然后上方的物体窗口就会出现一个立方体,就是这么地便捷。而primitive_cube_add也自然是创建立方体的函数。其完整参数如下,其中enter_editmode为True时,表示进入编辑模式。
primitive_cube_add(size=2.0, calc_uvs=True, enter_editmode=False, align='WORLD', location=(0.0, 0.0, 0.0), rotation=(0.0, 0.0, 0.0), scale=(1.0, 1.0, 1.0))
其中,location,rotation以及scale分别代表其位置、旋转角度以及缩放比例,换言之,通过修改这三个的值,就可以实现UI操作时的G、R、S快捷键的功能。为此,先创建一个变量,用于关联这个立方体,然后修改其location,便可看到立方体的位置发生了变化。
import mathutils
cube = bpy.data.objects["立方体"]
v0 = mathutils.Vector((2.0, 0.0, 0.0))
cube.location = v0
“立方体"这个名字,见于右侧的物体大纲,如果是英文版本的Blender,则默认生成的立方体,应该名为"Cube”。
在实际使用中,经常会遇到阵列的需求,比如批量产生立方体,这种简单重复的工作,最适合用程序来实现,下面就创建一个函数以实现此功能
from itertools import product
# nx, ny, nz分别表示三个方向的立方体数目
def cubeArray(nx, ny, nz, gap=3, size=2):
for x,y,z in product(range(nx), range(ny), range(nz)):
bpy.ops.mesh.primitive_cube_add(size=size, location=(gap*x, gap*y, gap*z))
其中,product是一个组合迭代器,可以避免for循环的嵌套。创建函数之后,直接调用,就会在物体视图中看到 3 × 3 × 3 3\times3\times3 3×3×3的立方体阵列。
cubeArray()
方便复用是代码的一大优势,为了实现这一目的,可将命令行中的代码存入脚本。点击中间窗口的新建图标,即可新建一个脚本,其内容如下
import bpy
from itertools import product
# nx, ny, nz分别表示三个方向的立方体数目
def cubeArray(nx, ny, nz, gap=3, size=2):
for x,y,z in product(range(nx), range(ny), range(nz)):
bpy.ops.mesh.primitive_cube_add(size=size, location=(gap*x, gap*y, gap*z))
if __name__ == "__main__":
cubeArray(3,3,3)
然后点击脚本编辑器上方的三角号,则脚本就会被执行,得到与命令行中的指令相同的结果。
但光是这样还不够,blender提供了register函数,可将代码封装成插件,
bl_info = {
"name": "立方体阵列",
"blender": (4, 0, 0),
"category": "Object",
}
import bpy
class CubeArray(bpy.types.Operator):
bl_idname="obj.cube_array"
bl_label = "立方体阵列"
def cubeArray(self, nx, ny, nz, gap=3, size=2):
for x,y,z in product(range(nx), range(ny), range(nz)):
bpy.ops.mesh.primitive_cube_add(size=size, location=(gap*x, gap*y, gap*z))
def excute(self, context):
self.cubeArray(3,3,3)
def menu_func(self, context):
self.layout.operator(CubeArray.bl_idname)
def register():
bpy.utils.register_class(CubeArray)
bpy.types.VIEW3D_MT_object.append(menu_func)
def unregister():
bpy.utils.unregister_class(CubeArray)
if __name__ == "__main__":
register()
其中,最前面的字典是插件信息,CubeArray可以理解为我们创建的插件,其中excute是插件被使用时具体执行的方法。
通过menu_func,将CubeArray的id名称注册到菜单中,最后调用register函数,将这个菜单放置在物体模式的物体菜单下。