| 126 | ###################################################################################### |
| 127 | |
| 128 | def write_obj(folder, fname, mesh, idx, save_material=True, feat=None, resolution=[256, 256]): |
| 129 | obj_file = os.path.join(folder, fname + '.obj') |
| 130 | print("Writing mesh: ", obj_file) |
| 131 | with open(obj_file, "w") as f: |
| 132 | f.write(f"mtllib {fname}.mtl\n") |
| 133 | f.write("g default\n") |
| 134 | |
| 135 | v_pos = mesh.v_pos[idx].detach().cpu().numpy() if mesh.v_pos is not None else None |
| 136 | v_nrm = mesh.v_nrm[idx].detach().cpu().numpy() if mesh.v_nrm is not None else None |
| 137 | v_tex = mesh.v_tex[idx].detach().cpu().numpy() if mesh.v_tex is not None else None |
| 138 | |
| 139 | t_pos_idx = mesh.t_pos_idx[0].detach().cpu().numpy() if mesh.t_pos_idx is not None else None |
| 140 | t_nrm_idx = mesh.t_nrm_idx[0].detach().cpu().numpy() if mesh.t_nrm_idx is not None else None |
| 141 | t_tex_idx = mesh.t_tex_idx[0].detach().cpu().numpy() if mesh.t_tex_idx is not None else None |
| 142 | |
| 143 | print(" writing %d vertices" % len(v_pos)) |
| 144 | for v in v_pos: |
| 145 | f.write('v {} {} {} \n'.format(v[0], v[1], v[2])) |
| 146 | |
| 147 | if v_tex is not None and save_material: |
| 148 | print(" writing %d texcoords" % len(v_tex)) |
| 149 | assert(len(t_pos_idx) == len(t_tex_idx)) |
| 150 | for v in tqdm(v_tex): |
| 151 | f.write('vt {} {} \n'.format(v[0], 1.0 - v[1])) |
| 152 | |
| 153 | if v_nrm is not None: |
| 154 | print(" writing %d normals" % len(v_nrm)) |
| 155 | assert(len(t_pos_idx) == len(t_nrm_idx)) |
| 156 | for v in v_nrm: |
| 157 | f.write('vn {} {} {}\n'.format(v[0], v[1], v[2])) |
| 158 | |
| 159 | # faces |
| 160 | f.write("s 1 \n") |
| 161 | f.write("g pMesh1\n") |
| 162 | f.write("usemtl defaultMat\n") |
| 163 | |
| 164 | # Write faces |
| 165 | print(" writing %d faces" % len(t_pos_idx)) |
| 166 | for i in range(len(t_pos_idx)): |
| 167 | f.write("f ") |
| 168 | for j in range(3): |
| 169 | f.write(' %s/%s/%s' % (str(t_pos_idx[i][j]+1), '' if v_tex is None else str(t_tex_idx[i][j]+1), '' if v_nrm is None else str(t_nrm_idx[i][j]+1))) |
| 170 | f.write("\n") |
| 171 | |
| 172 | if save_material and mesh.material is not None: |
| 173 | mtl_file = os.path.join(folder, fname + '.mtl') |
| 174 | print("Writing material: ", mtl_file) |
| 175 | material.save_mtl(mtl_file, mesh.material, mesh=mesh.get_n(idx), feat=feat, resolution=resolution) |
| 176 | |
| 177 | print("Done exporting mesh") |