import numpy as np def load_obj(filename): # Read entire file with open(filename, 'r') as f: lines = f.readlines() # load vertices vertices, texcoords = [], [] for line in lines: if len(line.split()) == 0: continue prefix = line.split()[0].lower() if prefix == 'v': vertices.append([float(v) for v in line.split()[1:]]) elif prefix == 'vt': val = [float(v) for v in line.split()[1:]] texcoords.append([val[0], 1.0 - val[1]]) uv = len(texcoords) > 0 faces, tfaces = [], [] for line in lines: if len(line.split()) == 0: continue prefix = line.split()[0].lower() if prefix == 'usemtl': # Track used materials pass elif prefix == 'f': # Parse face vs = line.split()[1:] nv = len(vs) vv = vs[0].split('/') v0 = int(vv[0]) - 1 if uv: t0 = int(vv[1]) - 1 if vv[1] != "" else -1 for i in range(nv - 2): # Triangulate polygons vv1 = vs[i + 1].split('/') v1 = int(vv1[0]) - 1 vv2 = vs[i + 2].split('/') v2 = int(vv2[0]) - 1 faces.append([v0, v1, v2]) if uv: t1 = int(vv1[1]) - 1 if vv1[1] != "" else -1 t2 = int(vv2[1]) - 1 if vv2[1] != "" else -1 tfaces.append([t0, t1, t2]) vertices = np.array(vertices, dtype=np.float32) faces = np.array(faces, dtype=np.int64) if uv: assert len(tfaces) == len(faces) texcoords = np.array(texcoords, dtype=np.float32) tfaces = np.array(tfaces, dtype=np.int64) else: texcoords, tfaces = None, None return vertices, faces, texcoords, tfaces def write_obj(filename, v_pos, t_pos_idx, v_tex, t_tex_idx): with open(filename, "w") as f: for v in v_pos: f.write('v {} {} {} \n'.format(v[0], v[1], v[2])) if v_tex is not None: assert(len(t_pos_idx) == len(t_tex_idx)) for v in v_tex: f.write('vt {} {} \n'.format(v[0], 1.0 - v[1])) # Write faces for i in range(len(t_pos_idx)): f.write("f ") for j in range(3): f.write(' %s/%s' % (str(t_pos_idx[i][j]+1), '' if v_tex is None else str(t_tex_idx[i][j]+1))) f.write("\n")