【问题标题】:more efficient Python scripting in Blender3DBlender3D 中更高效的 Python 脚本
【发布时间】:2013-02-28 03:38:43
【问题描述】:

我基本上是在使用原始 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 

我意识到,对于这样一个简单的脚本,任何性能提升都可能微不足道,但无论如何我还是想试一试。

【问题讨论】:

    标签: python performance blender processing-efficiency


    【解决方案1】:

    一些可能的建议

    • 我会预先计算 x、y、z 值,将它们存储在 mathutil 向量中,然后将其添加到要迭代的 dict 中。
    • 复制应提供比复制更小的内存占用 实例化新对象。 bpy.ops.object.duplicate_move(OBJECT_OT_duplicate=(linked:false, TRANSFORM_OT_translate=(transform)

    编辑:

    做进一步的研究,每次 bpy.ops.* 被称为重绘函数时都会出现。一位用户记录了生成 UV 球所需的时间呈指数级增长。

    CoDEmanX 将以下代码 sn-p 提供给另一个用户。

    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]
    

    【讨论】:

    • 是的。惊人的。与我正在做的事情相比,复制实际上更有意义——应该在动画期间产生很好的效果。谢谢!
    猜你喜欢
    • 2014-06-09
    • 2018-03-08
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2011-01-03
    • 2013-09-02
    相关资源
    最近更新 更多