在Blender3D中更高效的Python脚本编写
我正在用基本的UV球体来制作一个3D散点图,但当我尝试一次创建几百个点的时候,遇到了内存问题。我的笔记本电脑处理器是2.1Ghz,所以我想知道有没有更好的方法来写这个代码:
import bpy
import random
while count < 5:
bpy.ops.mesh.primitive_uv_sphere_add(size=.3,\
location=(random.randint(-9,9), random.randint(-9,9),\
random.randint(-9,9)), rotation=(0,0,0))
count += 1
我知道这个简单的脚本性能提升可能不大,但我还是想试试。
1 个回答
2
一些可能的建议
- 我会提前计算好x、y、z的值,把它们存储在一个数学工具的向量里,然后放到一个字典中,方便后续遍历。
- 复制对象应该比每次都新建对象占用更少的内存。可以使用这个命令:
bpy.ops.object.duplicate_move(OBJECT_OT_duplicate=(linked:false, TRANSFORM_OT_translate=(transform)
编辑:
经过进一步研究,发现每次调用bpy.ops.*时,都会触发重绘功能。有用户记录到生成UV球体所需的时间呈指数级增长。
CoDEmanX给另一位用户提供了以下代码片段。
import bpy
bpy.ops.object.select_all(action='DESELECT')
bpy.ops.mesh.primitive_uv_sphere_add()
sphere = bpy.context.object
for i in range(-1000, 1000, 2):
ob = sphere.copy()
ob.location.y = i
#ob.data = sphere.data.copy() # uncomment this, if you want full copies and no linked duplicates
bpy.context.scene.objects.link(ob)
bpy.context.scene.update()
然后只需要调整代码来设置对象的位置。
obj.location = location_dict[i]