【问题标题】:Create model with 50 million spheres创建包含 5000 万个球体的模型
【发布时间】:2020-05-13 00:43:41
【问题描述】:

我正在尝试从 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)

我在网上找到this question 并尝试了这种方法,但它的运行速度比复制每个球体要慢。

【问题讨论】:

  • 与其创建 50mill 对象,不如创建一个 50mill verts 的网格并使用dupliverts 在每个点复制一个球体。实际上,听起来更像是您拥有体积数据并且只想查看外壳,请查看openvdb,我相信它具有将体积数据转换为网格壳的工具,它将使用iso surface generation,就像在cubesurfer 插件中使用的一样.

标签: python blender


【解决方案1】:

没有人能创造出这么多球体,因为没有人能充分处理生成的云中包含的信息。一个简化的显示就足够了。

构建一个:

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

这使您有 O(N) 时间从物理转换到显示表示。它不会是完美的,因为经过仔细检查,球体可能会出现或消失。但这是一个开始。

【讨论】:

    【解决方案2】:

    动画公司如何创造巨大的模型?总有办法吧?

    他们可能不会创建包含那么多对象的模型。 (5000 万个球体?真的吗?)

    当他们这样做时,他们可能会使用由内部专业软件工程师开发的专有软件和技术......以及非常强大的计算资源......而且可能仍然需要很长时间。


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

    1. 是在构建模型时还是在导出模型时出现问题? (我假设您正在导出模型,因为您想稍后再导入它。因此,当您使用该模型时,了解问题所在也将帮助您。)

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

    3. 您能否将对象的数量减少到更易于处理的程度?

    4. 能否调整正在复制的 UV 球体上的参数?默认情况下,原始 UV 球体是具有 32 段和 16 个环的网格。 (32 x 16 x 5000 万将是一个真正庞大的网格元素数量。)

    【讨论】:

    • 是的...但是您不使用图形渲染框架来进行严肃的(科学)物理/天文建模。问题非常不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多