创建具有 5000 万个球体的模型
Create model with 50 million spheres
我正在尝试根据 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 并尝试了这种方法,但它 运行 比复制每个球体慢。
How do animation companies create huge models? There has to be some way, right?
他们可能不会创建包含那么多对象的模型。 (5000 万个球体?认真的吗?)
当他们这样做时,他们可能会使用由内部专业软件工程师开发的专有软件和技术……以及非常强大的计算资源……而且这可能仍然需要很长时间。
话虽如此,我建议调查以下内容:
问题是在构建模型时还是在导出模型时出现的? (我假设你正在导出模型,因为你想稍后导入它。所以知道问题出在哪里也会对你使用模型有帮助。)
您是否有足够的(物理)内存来在内存中创建模型?如果你不这样做,你的问题可能是垃圾收集器和虚拟内存之间的交互。
你能把对象的数量减少到更易于处理的程度吗?
你能调整你正在复制的 UV 球体的参数吗?默认情况下,原始 UV 球体是具有 32 段和 16 环的网格。 (32 x 16 x 5000 万将是一个真正庞大的网格元素数量。)
没有人创造出这么多球体,因为人类的大脑无法充分处理由此产生的云中包含的信息。简化显示就足够了。
建造一个:
- 使用您喜欢的任何物理学来改变球体的位置。
- 构建一个具有指定单元格大小的 3D 矩阵,每个单元格的初始值为零(您可能应该将其实现为散列 table 以避免矩阵太大)。
- 确定每个球体的中心落入哪个单元格,并将该单元格的值设置为其中心包含的球体的数量。
- 取一个阈值并消除所有值低于该阈值的单元格。将其余的细胞变成球体。
- 或者为每个具有非零值的单元格制作一个球体(这假设球体倾向于以显着减少其数量的方式聚集到单元格中)。
这使您有 O(N) 时间从物理学转移到显示表示。它不会是完美的,因为经过仔细检查,球体可能会突然出现和消失。但这是一个开始。
我正在尝试根据 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 并尝试了这种方法,但它 运行 比复制每个球体慢。
How do animation companies create huge models? There has to be some way, right?
他们可能不会创建包含那么多对象的模型。 (5000 万个球体?认真的吗?)
当他们这样做时,他们可能会使用由内部专业软件工程师开发的专有软件和技术……以及非常强大的计算资源……而且这可能仍然需要很长时间。
话虽如此,我建议调查以下内容:
问题是在构建模型时还是在导出模型时出现的? (我假设你正在导出模型,因为你想稍后导入它。所以知道问题出在哪里也会对你使用模型有帮助。)
您是否有足够的(物理)内存来在内存中创建模型?如果你不这样做,你的问题可能是垃圾收集器和虚拟内存之间的交互。
你能把对象的数量减少到更易于处理的程度吗?
你能调整你正在复制的 UV 球体的参数吗?默认情况下,原始 UV 球体是具有 32 段和 16 环的网格。 (32 x 16 x 5000 万将是一个真正庞大的网格元素数量。)
没有人创造出这么多球体,因为人类的大脑无法充分处理由此产生的云中包含的信息。简化显示就足够了。
建造一个:
- 使用您喜欢的任何物理学来改变球体的位置。
- 构建一个具有指定单元格大小的 3D 矩阵,每个单元格的初始值为零(您可能应该将其实现为散列 table 以避免矩阵太大)。
- 确定每个球体的中心落入哪个单元格,并将该单元格的值设置为其中心包含的球体的数量。
- 取一个阈值并消除所有值低于该阈值的单元格。将其余的细胞变成球体。
- 或者为每个具有非零值的单元格制作一个球体(这假设球体倾向于以显着减少其数量的方式聚集到单元格中)。
这使您有 O(N) 时间从物理学转移到显示表示。它不会是完美的,因为经过仔细检查,球体可能会突然出现和消失。但这是一个开始。