Blender быстрее с одним объектом , который имеет один миллион вершин, чем если бы он имел 1000 объектов по 1000 вершин в каждом.Вместо того, чтобы создавать несколько кубов и объединять их вместе, используйте bmesh , чтобы добавить несколько кубов в один объект сетки.
Другим соображением является использование операторов , каждый операторcall выполняет обновление и перерисовку сцены, работая напрямую с данными сетки, а затем, выполнив одно обновление, вы предотвращаете множество ненужных обновлений.
Используя случайные цвета вместо изображений ct, следующий скрипт выполняется примерно в 10%время.Я также сделал кубы больше, если начальные кубы слишком малы, удаляемые двойники могут объединить больше, чем вы хотите, вы всегда можете уменьшить их после построения меша.
import bpy
import bmesh
import mathutils
import numpy as np
# replace these two lines with your data filling code
x_size = y_size = z_size = 10
data = np.random.rand(x_size, y_size, z_size)
me = bpy.data.meshes.new("Mesh_new")
scene = bpy.context.scene
obj = bpy.data.objects.new("CT_Scan_new", me)
scene.objects.link(obj)
scene.objects.active = obj
obj.select = True
bm = bmesh.new()
for yy in range(y_size):
for xx in range(x_size):
for zz in range(z_size):
c = data[yy, xx, zz]
bmesh.ops.create_cube(bm, size=0.1,
matrix=mathutils.Matrix.Translation((xx / 10, zz / 10, yy / 10)))
mat = bpy.data.materials.new(name="MaterialName")
mat.diffuse_color = (c, c, c)
obj.data.materials.append(mat)
mat_idx = len(obj.data.materials)-1
bm.faces.ensure_lookup_table()
for i in range(6):
# assign the last material to the last six faces created
bm.faces[-i].material_index = mat_idx
bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.001)
bm.to_mesh(me)