创建具有5000万个球体的模型

时间:2018-12-13 23:16:18

标签: python blender

我正在尝试根据xyz坐标数据列表创建3d模型。我创建了一个Python脚本来创建一个小球体,然后将其复制到每个数据点。不幸的是,该程序花费了不合理的长时间。我计算过,最多可能需要8天才能完成模型的创建。我什至尝试使用Google Compute Engine运行该脚本,但仍然会花费太长时间。无论如何,有没有在合理的时间范围内建立这么大的模型?我愿意尝试Blender之外的其他程序。动画公司如何创建巨大的模型?必须有某种方法,对吧?

以下是用于创建模型的Python脚本:

import bpy
import os 

radius = 0.0005
scale = 0.001

bpy.ops.object.select_all(action='DESELECT')
bpy.ops.mesh.primitive_uv_sphere_add(size=radius)
sphere = bpy.context.object

filename = 'points.xyz'
directory = 'C:\\Users\\User1\\Desktop'
fullpath = os.path.join(os.getcwd(), filename)

print("Creating OBJ file")
sphereCount = 1

def makeSphere(x,y,z):
    global sphereCount
    print("Creating Sphere #" + str(sphereCount))
    ob = sphere.copy()
    ob.location.x = x
    ob.location.y = y
    ob.location.z = z

    bpy.context.scene.objects.link(ob)
    sphereCount += 1

with open(fullpath,"r") as f:
    for line in f:
        values = line.split()
        x = values[0]
        y = values[1]
        z = values[2]
        makeSphere(scale*float(x),scale*float(y),scale*float(z))

bpy.context.scene.update()

#Export as OBJ file

filename = 'finalObject.obj'
directory = '/home/user1'
fullpath = os.path.join(os.getcwd(), filename)

print("Exporting OBJ");

bpy.ops.export_scene.obj(filepath=fullpath)

我在网上找到了这个问题(https://blender.stackexchange.com/questions/48161/object-made-of-large-number-of-spheres),并尝试了这种方法,但是它比复制每个领域要慢。

2 个答案:

答案 0 :(得分:2)

  

动画公司如何创建巨大的模型?必须有某种方法,对吧?

他们可能不会创建具有这么多对象的模型。 (5000万个球体?认真吗?)

当他们这样做时,他们可能会使用内部专家软件工程师开发的专有软件和技术……以及真正强大的计算资源……而且可能还需要很长时间。


话虽如此,我建议调查以下内容:

  1. 在构建模型或导出模型时是否出现问题? (我假设您正在导出模型,是因为以后要导入它。因此,当您使用使用模型时,知道问题出在哪里也将对您有所帮助。)

  2. 您是否有足够的(物理)内存来在内存中创建模型?如果不这样做,那么问题可能出在垃圾回收器和虚拟内存之间。

  3. 可以将对象数量减少到更容易处理吗?

  4. 您可以在要复制的UV球上调整参数吗?原始UV球是默认情况下具有32个线段和16个环的网格。 (32 x 16 x 5000万将是数量巨​​大的网格元素。)

答案 1 :(得分:2)

没有人创造这么多领域,因为没有人的头脑可以充分处理包含在结果云中的信息。简化的显示就足够了。

要建立一个:

  1. 使用任何您喜欢的物理学来演化球体的位置。
  2. 构建一个具有指定像元大小的3D矩阵,每个像元的初始值为零(您应该将其实现为哈希表,以避免矩阵太大)。
  3. 确定每个球体的中心属于哪个像元,并将该像元的值设置为其中心包含的球体的数量。
  4. 取一个阈值并消除所有值低于该阈值的像元。将其余的细胞变成球形。
  5. 或为每个具有非零值的像元制作一个球体(这是假设这些球体倾向于以明显减少其数量的方式聚集到像元中)。

这使您 O(N)的时间从物理学转向显示形式。这不是完美的,因为在仔细检查后,球可能会突然出现或消失。但这是一个开始。