Blender简介
Blender 是一款开源的三维计算机图形软件,它提供了广泛的功能,包括建模、动画、渲染、视频编辑等。Blender还支持Python编程接口,允许用户通过编写脚本来控制和定制软件的各个方面。
Blender的功能非常强大,它被广泛应用于电影制作、动画制作、游戏开发等领域。由于其开源的特性,Blender还拥有一个活跃的社区,用户可以分享插件、教程和艺术作品。
Blender曾用于《流浪地球》最后那个宏大场面:行星发动机从地球表面发射并将地球推向太空的壮观景象的CG生成。
安装
可以直接到官网下载安装程序:Download — blender.org
如果是FreeBSD,可以通过pkg安装,pkg install blender 具体参见:超强动画制作软件blender-CSDN博客
开始写代码
对一个什么都不懂,第一次接触Blender的人,咨询文心一言,让它给写了一个例子代码
原始代码
import bpy
# 删除默认场景中的所有物体(可选)
for obj in bpy.data.objects:
bpy.data.objects.remove(obj, do_unlink=True)
# 创建一个新的立方体
bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0))
# 获取刚刚创建的立方体对象
cube = bpy.context.object
# 创建一个新的材质
mat = bpy.data.materials.new(name="Red Material")
mat.diffuse_color = (1, 0, 0) # 设置为红色
# 将材质分配给立方体
cube.data.materials.append(mat)
# 设置渲染引擎为Cycles(如果尚未设置)
bpy.context.scene.render.engine = 'CYCLES'
# 设置输出文件的路径和格式(可选)
bpy.context.scene.render.filepath = "/path/to/your/output/file.png"
bpy.context.scene.render.image_settings.file_format = 'PNG'
# 渲染场景
bpy.ops.render.render(write_still=True)
# 如果你想要保存.blend文件,你可以使用bpy.ops.wm.save_as_mainfile(filepath="/path/to/your/blend_file.blend")
# 但请注意,在脚本执行期间,最好避免使用UI操作(如保存文件),因为它们可能会导致问题。
# 如果你确实需要保存文件,请考虑在脚本的最后部分或外部逻辑中执行此操作。
# 脚本结束
针对例子中的报错,跟文心一言和ChatGPT交互进行改错,最终能够执行不报错。
最终测试代码
import bpy
# 删除现有的所有物体
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
# 创建第一个立方体
bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0))
cube1 = bpy.context.object
# 创建第二个立方体
bpy.ops.mesh.primitive_cube_add(size=2, location=(2, 2, 0))
cube2 = bpy.context.object
# 创建一个新的材质
mat = bpy.data.materials.new(name="Red Material")
mat.diffuse_color = (1, 0, 0, 1) # 设置为红色
# 将材质分配给立方体
cube1.data.materials.append(mat)
# 创建一个新的材质
mat2 = bpy.data.materials.new(name="Red Material")
mat2.diffuse_color = (0, 0, 1, 1) # 设置为蓝色
# 将材质分配给立方体
cube2.data.materials.append(mat2)
# 添加摄像头
#bpy.ops.object.camera_add(location=(0, -6, 0))
bpy.ops.object.camera_add(location=(0, 3, 3))
camera = bpy.context.object
bpy.context.scene.camera = camera
camera.location = (0, -6, 4) # 调整摄像头的位置
camera.rotation_euler = (1.1, 0, 0) # 调整摄像头的旋转角度
# 更新场景,这样变化才会生效
bpy.context.view_layer.update()
# 设置渲染分辨率
bpy.context.scene.render.resolution_x = 1024
bpy.context.scene.render.resolution_y = 768
# 设置渲染路径
bpy.context.scene.render.filepath = 'e:/tmp/rendered_image.jpg'
# 渲染图像
bpy.ops.render.render(write_still=True)
执行代码
上面这段代码有两种运行方式:
一种方式是运行Blender软件,在软件里进入scripting 工作区,然后在文本区输入这段代码,按“三角形”运行图标开始运行即可。
第二种运行方式是纯python执行,建立一个文件testblender.py 文件,写入这段代码,然后直接执行python testblender.py 即可。执行之前需要先安装blender的库,使用
pip install bpy
然后执行
python testblender.py
Fra:1 Mem:23.91M (Peak 24.98M) | Time:00:01.83 | Syncing Cube
Fra:1 Mem:23.98M (Peak 24.98M) | Time:00:03.10 | Syncing Cube.001
Fra:1 Mem:23.99M (Peak 24.98M) | Time:00:03.10 | Syncing Camera
Fra:1 Mem:23.99M (Peak 24.98M) | Time:00:03.12 | Rendering 1 / 64 samples
Fra:1 Mem:23.99M (Peak 24.98M) | Time:00:03.66 | Rendering 26 / 64 samples
Fra:1 Mem:23.99M (Peak 24.98M) | Time:00:03.74 | Rendering 51 / 64 samples
Fra:1 Mem:23.99M (Peak 24.98M) | Time:00:03.77 | Rendering 64 / 64 samples
Saved: 'e:\tmp\rendered_image.png'
Time: 00:04.29 (Saving: 00:00.49)
只需要四秒,两个正方形,正方形涂色,渲染过程就结束了!
再次修改blender代码,再次执行后,发现只要一秒多一点了。不知道是不是blender内部有加速机制,就像c编译的时候,如果保留中间文件,那么再次编译的时候速度会快很多。
调试
报错无法渲染, 没有摄像机
>>> bpy.ops.render.render(write_still=True)
错误: 无法渲染, 没有摄像机
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
File "/usr/local/share/blender/3.6/scripts/modules/bpy/ops.py", line 113, in __call__
ret = _op_call(self.idname_py(), None, kw)
RuntimeError: 错误: 无法渲染, 没有摄像机
添加一个摄像机,可以选择用菜单添加,也可以选择在代码里添加:
# 添加摄像头
#bpy.ops.object.camera_add(location=(0, -6, 0))
bpy.ops.object.camera_add(location=(0, 3, 3))
camera = bpy.context.object
bpy.context.scene.camera = camera
camera.location = (0, -6, 4) # 调整摄像头的位置
camera.rotation_euler = (1.1, 0, 0) # 调整摄像头的旋转角度
写入错误:(No such file or directory)无法保存
>>> bpy.ops.render.render(write_still=True)
错误: 写入错误:(No such file or directory)无法保存 '/path/to/your/output/file.png'
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
File "/usr/local/share/blender/3.6/scripts/modules/bpy/ops.py", line 113, in __call__
ret = _op_call(self.idname_py(), None, kw)
RuntimeError: 错误: 写入错误:(No such file or directory)无法保存 '/path/to/your/output/file.png'
修改文件到指定的地方,比如windows10里放到e:盘:
# 设置渲染路径
bpy.context.scene.render.filepath = 'e:/tmp/rendered_image.jpg'
报错sequences of dimension 0 should contain 4 items, not 3
Python: Traceback (most recent call last):
File "C:\Users\Admin\Documents\无标题.blend\文本.001", line 17, in <module>
ValueError: bpy_struct: item.attr = val: sequences of dimension 0 should contain 4 items, not 3
维度序列应该是4个而不是3 ,原来blender物体维度需要RGB+透明度,是四个变量,
而文心一开始给的例子里面只有RGB,所以报错。加入透明度,1代表完全不透明
# 创建一个新的材质
mat = bpy.data.materials.new(name="Red Material")
mat.diffuse_color = (1, 0, 0, 1) # 设置为红色
颜色设置的@通道没有用
将diffuse_color 的第四个参数设置为0,应该是透明,但是最终渲染完之后发现跟设置为1没有区别
mat = bpy.data.materials.new(name="Red Material")
mat.diffuse_color = (1, 0, 0, 0) # 设置为红色
问题待解决。