Blender脚本初步

发布时间:2023年12月22日

创建一个立方体

进入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函数,将这个菜单放置在物体模式的物体菜单下。

文章来源:https://blog.csdn.net/m0_37816922/article/details/134940153
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。