def __init__(self, obj_file): """ Create a surface from an obj file """ self.logger = get_logger(__name__) try: obj = ObjParser() obj.read(obj_file) self.triangles = [] self.vertices = obj.vertices self.normals = [(0.0, 0.0, 0.0)] * len(self.vertices) self.have_normals = len(obj.normals) for face in obj.faces: triangles = self._triangulate(face) for v_idx, t_idx, n_idx in triangles: self.triangles.append(v_idx) if n_idx != -1: # last normal index wins # alternative: self.normals[v_idx] += obj.normals[n_idx] # The correct behaviour is to duplicate the vertex # self.vertices.append(self.vertices[v_idx]) # self.tex_coords.append(self.tex_coords[v_idx]) self.normals[v_idx] = obj.normals[n_idx] # checks if not self.vertices or not self.triangles: raise ParseException("No geometry data in file.") self._to_numpy() except ValueError as ex: self.logger.exception(" Error in obj") raise ParseException(str(ex))
def test_write_parse_cycle(self): f = StringIO() w = ObjWriter(f) vertices = [(0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1)] normals = [(0, 0, 1), (0, 0, 1), (0, 0, 1), (0, 0, 1)] triangles = [(0, 1, 2), (0, 1, 3)] w.write(vertices, triangles, normals) f.seek(0) p = ObjParser() p.read(f) assert vertices == p.vertices assert normals == p.normals
def test_write_parse_cycle(self): f = StringIO() w = ObjWriter(f) vertices = [(0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1)] normals = [(0, 0, 1), (0, 0, 1), (0, 0, 1), (0, 0, 1)] triangles = [(0, 1, 2), (0, 1, 3)] w.write(vertices, triangles, normals) f.seek(0) p = ObjParser() p.read(f) self.assertEqual(vertices, p.vertices) self.assertEqual(normals, p.normals)