本文环境系统OS(Win10)
方式一,在Script(脚本)功能里面的Console(控制台输入python代码)。
如下图:
对应的三句代码是:
print("Hi, blender.")
import bpy
bpy.ops.mesh.primitive_cube_add(enter_editmode=False, align='WORLD', location=(0,0, 0), scale=(1, 1, 1))
按下回车键,代码立刻执行,如果有打印信息则直接显示在这个控制台(Console)中。
方式二,在Script(脚本)功能里面的代码文本写代码,然后执行。
第一步, 打开代码执行的控制台窗口,方便查看代码执行过程中的输出信息:
下图就是输出窗口
注意,有时候由于debug或者出错导致脚本代码指定卡主,只需要在这个窗口执行Ctrl + C快捷键就能解决问题,以免整个Blender软件卡死。
第二步
第三步:
第四步,写入代码:
对应的代码:
import bpy
import mathutils
# 创建一个cube
bpy.ops.mesh.primitive_cube_add(enter_editmode=False, align='WORLD', location=(0,0, 0), scale=(1, 1, 1))
# 获取这个cube
cube = bpy.data.objects["Cube"]
print("a cube: ", cube)
v0 = mathutils.Vector((2.0, 0.0, 0.0))
# 设置这个cube的坐标(X轴坐标为2.0,Y轴和轴为0.0), 移动这个cube
cube.location = v0
第五步,运行代码:
也可以按下 Ctrl + P 快捷键执行脚本代码
执行结束,可以看到创建了一个cube,并且移动了。
控制台中,也可以看到输出信息:
可以接着再用下面的这段代码让blender渲染出一张图(关于这个cube的),保存在指定路径下:
import bpy
renderer = bpy.context.scene.render
renderer.image_settings.file_format='JPEG'
renderer.filepath = "D:/dev/blender/renderingImg/cube.jpg"
renderer.resolution_x = 512 #perhaps set resolution in code
renderer.resolution_y = 512
bpy.ops.render.render(write_still=True)
加载一个obj格式的模型:
import bpy
obj_filePath = "D:/dev/blender/modules/box01.obj"
imported_object = bpy.ops.import_scene.obj(filepath=obj_filePath)
obj_object = bpy.context.selected_objects[0]
print('Imported obj name: ', obj_object.name)
开启Scripting脚本的即时运行(编辑后立刻自动运行)
方式三,直接在CMD或者其他程序中调用blender.exe,并将python脚本文件当做参数传入。
1. 将上述python代码写到一个.py类型的文本文件里面,这里明明为createCube.py
2. 打开 window cmd命令行控制台窗口
3. 然后再window cmd命令行控制台窗口里面执行,如下图:
注意blender.exe的路径和createCube.py的路径要写成自己的。
blender通过的python script示例源码:your path \blender\3.2\scripts\templates_py
以下是后台调用blender.exe加载obj格式的模型文件并渲染以及保存渲染PNG图片的代码示例:
import sys
import bpy
import time
def renderAObj() :
obj_file = "D:/dev/webProj/xblender/models/box02.obj"
output_file = "D:/dev/webProj/xblender/renderingImg/rendering01.png"
print("bpy.data.objects: ", bpy.data.objects)
print("lsit(bpy.data.objects): ", list(bpy.data.objects))
cube01 = bpy.data.objects["Cube"]
if cube01:
bpy.data.objects.remove(cube01)
else:
print("has not the default Cube.")
print("### ### ### ### ###")
# 加载OBJ模型
imported_object = bpy.ops.import_scene.obj(filepath=obj_file)
print("list(bpy.context.selected_objects): ", list(bpy.context.selected_objects))
obj_object = bpy.context.selected_objects[0]
print("obj_object: ", obj_object)
# 设置渲染引擎
bpy.context.scene.render.engine = 'BLENDER_EEVEE'
# 设置输出路径和文件格式
bpy.context.scene.render.filepath = output_file
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.context.scene.render.resolution_x = 512
bpy.context.scene.render.resolution_y = 512
# 等待1秒钟, 这一句代码是故意操作,不是必须的
time.sleep(0.5)
# 渲染并保存图片
bpy.ops.render.render(write_still=True)
print("rendering task end ...")
# 命令调用方式: D:\programs\blender\blender.exe -b -P .\loadAndRendering.py
if __name__ == "__main__":
# 获取命令行参数
argv = sys.argv
print("argv: \n", argv)
# argv = argv[argv.index("--") + 1:]
print("rendering task init ...")
renderAObj()
通过命令行(Shell)blender.exe调用python代码的一些其他方式
1. blender.exe -b your_blend_file.blend -P rep.py
2. PATH_TO_/blender.exe BLENDER_FILE.blend --python-expr "import bpy ; bpy.data.scenes[\"Scene\"].cycles.samples = VALUE"
Blender 执行程序的命令行参数:
1. 可以通过 blender.exe -h获得详细信息
2. 命令行参数文档: 命令行参数 — Blender Manual
关于blender的API:
1. Quickstart — Blender Python API
https://docs.blender.org/api/blender_python_api_current/info_quickstart.html
2. Blender 3.5 Python API Documentation — Blender Python API
3. https://docs.blender.org/api/current/bpy.ops.wm.html