diff --git a/utils/generate_figures.py b/utils/generate_figures.py new file mode 100644 index 0000000..b08abbf --- /dev/null +++ b/utils/generate_figures.py @@ -0,0 +1,126 @@ +import os +import sys +sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..') + +import numpy as np + +from custom_utils.custom_utils import save_stl, write_obj +from data.cloth3d_io import readPC2Frame +from data.utils import Frame +from custom_utils.custom_utils import _maskFaces +import plotly.graph_objects as go +from plotly.subplots import make_subplots + + +def remove_long_edges(vertices, faces): + # Compute edge lengths + edges = np.vstack((faces[:,[0,1]], faces[:,[1,2]], faces[:,[2,0]])) + edge_lengths = np.linalg.norm(vertices[edges[:,0]] - vertices[edges[:,1]], axis=1) + + # Find edges longer than 0.1 + long_edges = edges[edge_lengths > 0.1] + + # Find vertices that are part of long edges + vertices_to_remove = np.unique(long_edges) + + # Remove vertices and update faces + mask = np.ones(vertices.shape[0], dtype=bool) + mask[vertices_to_remove] = False + new_vertices = vertices[mask] + + + return new_vertices, mask + + +def plot_unposing_example(): + frame = Frame('00438', 146, 'Jumpsuit') + mesh_static = np.load(f'{folder_test}/mesh_static/{frame.id}_{frame.garment}.npy') + + mesh_mask = np.load(f'{folder_test}/mesh_mask/{frame.id}_{frame.garment}.npy') + mesh_posed = readPC2Frame(os.path.join(folder_test, 'mesh_posed_no_orient', f'{frame.id}_{frame.garment}.pc16'), frame.frame_nr, True) + mesh_unposed = readPC2Frame(os.path.join(folder_test, 'mesh_unposed_no_shape', f'{frame.id}_{frame.garment}.pc16'), frame.frame_nr, True) + mesh_unposed_shaped = readPC2Frame(os.path.join('temp', f'{frame.id}_{frame.garment}_unposed_shaped.pc16'), frame.frame_nr, True)[mesh_mask] + + + F = np.load('smpl/smpl_faces.npy') + _, faces = _maskFaces(np.zeros((14475, 3)), F, mesh_mask) + + mesh_static, v_mask = remove_long_edges(mesh_static, faces.astype(np.int32)) + + mesh_posed = mesh_posed[v_mask] + mesh_unposed = mesh_unposed[v_mask] + mesh_unposed_shaped = mesh_unposed_shaped[v_mask] + new_mask = np.zeros_like(mesh_mask) + new_mask[mesh_mask] = v_mask + _, faces = _maskFaces(np.zeros((14475, 3)), F, new_mask) + + fig = make_subplots(rows=1, cols=4, specs=[[{'type': 'mesh3d'}, {'type': 'mesh3d'}, {'type': 'mesh3d'}, {'type': 'mesh3d'}]]) + + fig.add_trace(go.Mesh3d(x=mesh_static[:,0], y=mesh_static[:,2], z=mesh_static[:,1], i=faces[:,0], j=faces[:,1], k=faces[:,2], color='lightpink', opacity=1), row=1, col=1) + fig.add_trace(go.Mesh3d(x=mesh_posed[:,0], y=mesh_posed[:,2], z=mesh_posed[:,1], i=faces[:,0], j=faces[:,1], k=faces[:,2], color='lightblue', opacity=1), row=1, col=2) + fig.add_trace(go.Mesh3d(x=mesh_unposed_shaped[:,0], y=mesh_unposed_shaped[:,2], z=mesh_unposed_shaped[:,1], i=faces[:,0], j=faces[:,1], k=faces[:,2], color='lightgreen', opacity=1), row=1, col=3) + fig.add_trace(go.Mesh3d(x=mesh_unposed[:,0], y=mesh_unposed[:,2], z=mesh_unposed[:,1], i=faces[:,0], j=faces[:,1], k=faces[:,2], color='lightyellow', opacity=1), row=1, col=4) + + fig.update_layout(scene=dict( + xaxis=dict(range=[-1, 1]), + yaxis=dict(range=[-1, 1]), + zaxis=dict(range=[-1, 1]), + ), scene_aspectmode='cube') + + # fig.show() + faces = faces.astype(np.uint32) + + save_stl(f'temp/unposing_plots/{frame.id}_{frame.frame_nr}_{frame.garment}_mesh_static.stl', mesh_static, faces) + save_stl(f'temp/unposing_plots/{frame.id}_{frame.frame_nr}_{frame.garment}_mesh_posed.stl', mesh_posed, faces) + save_stl(f'temp/unposing_plots/{frame.id}_{frame.frame_nr}_{frame.garment}_mesh_unposed.stl', mesh_unposed, faces) + save_stl(f'temp/unposing_plots/{frame.id}_{frame.frame_nr}_{frame.garment}_mesh_unposed_shaped.stl', mesh_unposed_shaped, faces) + + pass + + +def plot_normals_example(): + frame = Frame('00438', 146, 'Jumpsuit') + mesh_static = np.load(f'{folder_test}/mesh_static/{frame.id}_{frame.garment}.npy') + + mesh_mask = np.load(f'{folder_test}/mesh_mask/{frame.id}_{frame.garment}.npy') + mesh_posed = readPC2Frame(os.path.join(folder_test, 'mesh_posed_no_orient', f'{frame.id}_{frame.garment}.pc16'), frame.frame_nr, True) + # mesh_unposed = readPC2Frame(os.path.join(folder_test, 'mesh_unposed_no_shape', f'{frame.id}_{frame.garment}.pc16'), frame.frame_nr, True) + # mesh_unposed_shaped = readPC2Frame(os.path.join('temp', f'{frame.id}_{frame.garment}_unposed_shaped.pc16'), frame.frame_nr, True)[mesh_mask] + mesh_normals = readPC2Frame(os.path.join(folder_test, 'mesh_normals', f'{frame.id}_{frame.garment}.pc16'), frame.frame_nr, True) + uv_normals = np.load(os.path.join(folder_test, 'uv_normals', f'{frame.id}_{frame.frame_nr}_{frame.garment}.npz')) + + F = np.load('smpl/smpl_faces.npy') + _, faces = _maskFaces(np.zeros((14475, 3)), F, mesh_mask) + + mesh_static, v_mask = remove_long_edges(mesh_static, faces.astype(np.int32)) + + mesh_posed = mesh_posed[v_mask] + # mesh_unposed = mesh_unposed[v_mask] + # mesh_unposed_shaped = mesh_unposed_shaped[v_mask] + new_mask = np.zeros_like(mesh_mask) + new_mask[mesh_mask] = v_mask + _, faces = _maskFaces(np.zeros((14475, 3)), F, new_mask) + + fig = make_subplots(rows=1, cols=4, specs=[[{'type': 'mesh3d'}, {'type': 'mesh3d'}, {'type': 'mesh3d'}, {'type': 'mesh3d'}]]) + + fig.add_trace(go.Mesh3d(x=mesh_static[:,0], y=mesh_static[:,2], z=mesh_static[:,1], i=faces[:,0], j=faces[:,1], k=faces[:,2], color='lightpink', opacity=1), row=1, col=1) + fig.add_trace(go.Mesh3d(x=mesh_posed[:,0], y=mesh_posed[:,2], z=mesh_posed[:,1], i=faces[:,0], j=faces[:,1], k=faces[:,2], color='lightblue', opacity=1), row=1, col=2) + fig.add_trace(go.Mesh3d(x=mesh_unposed_shaped[:,0], y=mesh_unposed_shaped[:,2], z=mesh_unposed_shaped[:,1], i=faces[:,0], j=faces[:,1], k=faces[:,2], color='lightgreen', opacity=1), row=1, col=3) + fig.add_trace(go.Mesh3d(x=mesh_unposed[:,0], y=mesh_unposed[:,2], z=mesh_unposed[:,1], i=faces[:,0], j=faces[:,1], k=faces[:,2], color='lightyellow', opacity=1), row=1, col=4) + + fig.update_layout(scene=dict( + xaxis=dict(range=[-1, 1]), + yaxis=dict(range=[-1, 1]), + zaxis=dict(range=[-1, 1]), + ), scene_aspectmode='cube') + + + +if __name__ == '__main__': + folder_train = '/data-local/127/cloth3d_processed' + folder_test = '/data-local/127/cloth3d_processed_test' + + # plot_unposing_example() + plot_normals_example() + + pass \ No newline at end of file