Blender使用python代码绘画:一个简单例子

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)  # 设置为红色  

问题待解决。

相关推荐

  1. Python绘制一个简单的圣诞树

    2024-05-15 13:04:03       28 阅读
  2. selenium XPATH 使用简单例子

    2024-05-15 13:04:03       27 阅读
  3. Python实现的一个简单的GAN(生成对抗网络)例子

    2024-05-15 13:04:03       41 阅读
  4. Blender使用python设置骨骼旋转

    2024-05-15 13:04:03       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-15 13:04:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-15 13:04:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-15 13:04:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-15 13:04:03       18 阅读

热门阅读

  1. 河南省市政给排水乙级资质申请费用大揭秘

    2024-05-15 13:04:03       15 阅读
  2. C++ QT设计模式:解释器模式

    2024-05-15 13:04:03       13 阅读
  3. 项目dev打包报错 Cannot find module ‘node:util‘

    2024-05-15 13:04:03       9 阅读
  4. vue和react的区别

    2024-05-15 13:04:03       13 阅读
  5. 动态IP的应用场景

    2024-05-15 13:04:03       12 阅读
  6. Rust语言内部运行原理介绍

    2024-05-15 13:04:03       10 阅读
  7. Pytorch张量广播

    2024-05-15 13:04:03       12 阅读