кстати, о бесплатных решениях, есть такая штука как openfoam и paraviev https://blog.kitware.com/paraview-glance-mobile-support/про openfoam уже несколько раз писал на форуме, но попробую представить результаты визуализации как и обещал после выходных ...
Цитироватьне поверхностное отображение, а объемное. То есть просто загрузить точки и построить полисетку получиться месиво.Цитироватьвыгрузить в 3д редактор, отфильтровать точки, убрав ненужные, настроить цвета для точек исходя из density.Извините, что вмешиваюсь. Возможно, подойдёт вместо каждой "точки" формировать некие маленькие кубики/тексели?А "цветность исходя из density" - , например, можно создать некое ограниченное количество материалов/цветов, и все тексели со значениями плотностей, попавшими в соответствующий диапазон, объединять в один объект, которому присвоить этот материал. Дальнейшая "фильтрация по плотности" будет выражаться во включении/отключении отдельных объектов.
не поверхностное отображение, а объемное. То есть просто загрузить точки и построить полисетку получиться месиво.
выгрузить в 3д редактор, отфильтровать точки, убрав ненужные, настроить цвета для точек исходя из density.
import bpyimport mathutilsimport csvdef open_csv(filename): dmin = 9999 dmax = 0 csv_data = [] with open(filename, newline='') as csvfile: spamreader = csv.reader(csvfile, delimiter=',', quotechar='|') for row in spamreader: x = float(row[0]) y = float(row[1]) z = float(row[2]) d = float(row[3]) if d<dmin: dmin = d if d>dmax: dmax = d csv_data.append([(x,y,z),d]) return csv_data,dmin,dmaxdef routine(data,dmin,dmax): print(dmin,dmax) dd = dmax - dmin bpy.ops.particle.particle_edit_toggle() degp = bpy.context.evaluated_depsgraph_get() object = bpy.data.objects["Cube"] particle_systems = object.evaluated_get(degp).particle_systems particles = particle_systems[0].particles setting = particle_systems[0].settings degp = bpy.context.evaluated_depsgraph_get() setting.count = len(data) for i in range(len(data)): p = particles[i] p.alive_state = 'ALIVE' p.location = mathutils.Vector(data[i][0]) p.prev_location = mathutils.Vector(data[i][0]) p.prev_velocity = [0,0,0] p.size = 0.8+0.2*(data[i][1]-dmin)/dddata,dmin,dmax = open_csv('/home/sungreen/Рабочий стол/QRead/body_small.csv')routine(data,dmin,dmax)
Про визуализацию (рендеринг) напишу после выходных. Видимо из-за отключения некоторых фич для ускорения отображения во вьюпорте, сломал рендер. Но проблему исправлю.
Claptrap, а есть осмысленная интерпретация плотности? то есть может специалист глядя на картинку сказать, что значит плотность 500 или 700?