From 7c88dc67376b9bfde8849eb8ecd02abbb3f43fb1 Mon Sep 17 00:00:00 2001 From: jackylovechina Date: Thu, 3 Dec 2020 13:34:27 +0800 Subject: [PATCH 1/2] output PLY file According to the material properties, export the simulated PLY file --- demo/demo_3d_letters2.py | 8 ++++- engine/mpm_solver.py | 64 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/demo/demo_3d_letters2.py b/demo/demo_3d_letters2.py index 0058d79..f8b6837 100644 --- a/demo/demo_3d_letters2.py +++ b/demo/demo_3d_letters2.py @@ -11,6 +11,8 @@ with_gui = True write_to_disk = True +w2ply = True + # Try to run on GPU ti.init(arch=ti.cuda, kernel_profiler=True, @@ -22,7 +24,7 @@ if with_gui: gui = ti.GUI("MLS-MPM", res=512, background_color=0x112F41) -if write_to_disk: +if write_to_disk or w2ply: output_dir = create_output_folder('./sim') @@ -117,5 +119,9 @@ def visualize(particles): if write_to_disk: mpm.write_particles(f'{output_dir}/{frame:05d}.npz') + + if w2ply: + mpm.write_ply(output_dir,frame + 1) + print(f'Frame total time {time.time() - t:.3f}') print(f'Total running time {time.time() - start_t:.3f}') diff --git a/engine/mpm_solver.py b/engine/mpm_solver.py index 125be66..6fd0035 100644 --- a/engine/mpm_solver.py +++ b/engine/mpm_solver.py @@ -673,6 +673,70 @@ def write_particles(self, fn): p.start() self.writers.append(p) + + def write_ply(self,fn,frame): + p_info = self.particle_info() + + p_pos = p_info['position'] + p_mat = p_info['material'] + p_null = np.array([[np.nan]]) + + arr_water = np.where(p_mat == 0) + arr_elast = np.where(p_mat == 1) + arr_snow = np.where(p_mat == 2) + arr_sand = np.where(p_mat == 3) + + series_prefix_0 = fn + "/water.ply" + series_prefix_1 = fn + "/elast.ply" + series_prefix_2 = fn + "/snow.ply" + series_prefix_3 = fn + "/sand.ply" + + print("粒子总数:{0},弹性体:{1},水:{2},雪:{3},沙:{4},实际渲染数:{5}".format(self.n_particles,len(arr_elast[0]) ,len(arr_water[0]) ,len(arr_snow[0]) ,len(arr_sand[0]) ,len(arr_water[0]) + len(arr_elast[0]) + len(arr_snow[0]) + len(arr_sand[0])),end='\n') + + if len(arr_water[0]) > 0: + min_water = np.min(arr_water) + max_water = np.max(arr_water) + writer_0 = ti.PLYWriter(num_vertices=max_water - min_water + 1) + writer_0.add_vertex_pos(p_pos[min_water: max_water + 1, 0],p_pos[min_water: max_water + 1, 1],p_pos[min_water: max_water + 1, 2]) + writer_0.export_frame_ascii(frame,series_prefix_0) + else: + writer_0 = ti.PLYWriter(num_vertices=1) + writer_0.add_vertex_pos(p_null[ : , 0],p_null[ : , 0],p_null[ : , 0]) + writer_0.export_frame_ascii(frame,series_prefix_0) + + if len(arr_elast[0]) > 0: + min_elast = np.min(arr_elast) + max_elast = np.max(arr_elast) + writer_1 = ti.PLYWriter(num_vertices=max_elast - min_elast + 1) + writer_1.add_vertex_pos(p_pos[min_elast: max_elast + 1, 0],p_pos[min_elast: max_elast + 1, 1],p_pos[min_elast: max_elast + 1, 2]) + writer_1.export_frame_ascii(frame,series_prefix_1) + else: + writer_1 = ti.PLYWriter(num_vertices=1) + writer_1.add_vertex_pos(p_null[ : , 0],p_null[ : , 0],p_null[ : , 0]) + writer_1.export_frame_ascii(frame,series_prefix_1) + + if len(arr_snow[0]) > 0: + min_snow = np.min(arr_snow) + max_snow = np.max(arr_snow) + writer_2 = ti.PLYWriter(num_vertices=max_snow - min_snow + 1) + writer_2.add_vertex_pos(p_pos[min_snow: max_snow + 1, 0],p_pos[min_snow: max_snow + 1, 1],p_pos[min_snow: max_snow + 1, 2]) + writer_2.export_frame_ascii(frame,series_prefix_2) + else: + writer_2 = ti.PLYWriter(num_vertices=1) + writer_2.add_vertex_pos(p_null[ : , 0],p_null[ : , 0],p_null[ : , 0]) + writer_2.export_frame_ascii(frame,series_prefix_2) + + if len(arr_sand[0]) > 0: + min_sand = np.min(arr_sand) + max_sand = np.max(arr_sand) + writer_3 = ti.PLYWriter(num_vertices=max_sand - min_sand + 1) + writer_3.add_vertex_pos(p_pos[min_sand: max_sand + 1, 0],p_pos[min_sand: max_sand + 1, 1],p_pos[min_sand: max_sand + 1, 2]) + writer_3.export_frame_ascii(frame,series_prefix_3) + else: + writer_3 = ti.PLYWriter(num_vertices=1) + writer_3.add_vertex_pos(p_null[ : , 0],p_null[ : , 0],p_null[ : , 0]) + writer_3.export_frame_ascii(frame,series_prefix_3) + def flush(self): for p in self.writers: From 384b304e40efac79a5eb23f62121c1518d2386a4 Mon Sep 17 00:00:00 2001 From: jackylovechina Date: Thu, 3 Dec 2020 13:53:28 +0800 Subject: [PATCH 2/2] Update mpm_solver.py Modify some output text --- engine/mpm_solver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/mpm_solver.py b/engine/mpm_solver.py index 6fd0035..6f9d44a 100644 --- a/engine/mpm_solver.py +++ b/engine/mpm_solver.py @@ -691,7 +691,7 @@ def write_ply(self,fn,frame): series_prefix_2 = fn + "/snow.ply" series_prefix_3 = fn + "/sand.ply" - print("粒子总数:{0},弹性体:{1},水:{2},雪:{3},沙:{4},实际渲染数:{5}".format(self.n_particles,len(arr_elast[0]) ,len(arr_water[0]) ,len(arr_snow[0]) ,len(arr_sand[0]) ,len(arr_water[0]) + len(arr_elast[0]) + len(arr_snow[0]) + len(arr_sand[0])),end='\n') + print("num_particles:{0},elast:{1},water:{2},snow:{3},sand:{4},out_particles:{5}".format(self.n_particles,len(arr_elast[0]) ,len(arr_water[0]) ,len(arr_snow[0]) ,len(arr_sand[0]) ,len(arr_water[0]) + len(arr_elast[0]) + len(arr_snow[0]) + len(arr_sand[0])),end='\n') if len(arr_water[0]) > 0: min_water = np.min(arr_water)