Spaces:
Runtime error
Runtime error
| # -*- coding: utf-8 -*- | |
| import os | |
| import cv2 | |
| import numpy as np | |
| import PIL.Image | |
| from typing import Optional | |
| import trimesh | |
| def save_obj(pointnp_px3, facenp_fx3, fname): | |
| fid = open(fname, "w") | |
| write_str = "" | |
| for pidx, p in enumerate(pointnp_px3): | |
| pp = p | |
| write_str += "v %f %f %f\n" % (pp[0], pp[1], pp[2]) | |
| for i, f in enumerate(facenp_fx3): | |
| f1 = f + 1 | |
| write_str += "f %d %d %d\n" % (f1[0], f1[1], f1[2]) | |
| fid.write(write_str) | |
| fid.close() | |
| return | |
| def savemeshtes2(pointnp_px3, tcoords_px2, facenp_fx3, facetex_fx3, tex_map, fname): | |
| fol, na = os.path.split(fname) | |
| na, _ = os.path.splitext(na) | |
| matname = "%s/%s.mtl" % (fol, na) | |
| fid = open(matname, "w") | |
| fid.write("newmtl material_0\n") | |
| fid.write("Kd 1 1 1\n") | |
| fid.write("Ka 0 0 0\n") | |
| fid.write("Ks 0.4 0.4 0.4\n") | |
| fid.write("Ns 10\n") | |
| fid.write("illum 2\n") | |
| fid.write("map_Kd %s.png\n" % na) | |
| fid.close() | |
| #### | |
| fid = open(fname, "w") | |
| fid.write("mtllib %s.mtl\n" % na) | |
| for pidx, p in enumerate(pointnp_px3): | |
| pp = p | |
| fid.write("v %f %f %f\n" % (pp[0], pp[1], pp[2])) | |
| for pidx, p in enumerate(tcoords_px2): | |
| pp = p | |
| fid.write("vt %f %f\n" % (pp[0], pp[1])) | |
| fid.write("usemtl material_0\n") | |
| for i, f in enumerate(facenp_fx3): | |
| f1 = f + 1 | |
| f2 = facetex_fx3[i] + 1 | |
| fid.write("f %d/%d %d/%d %d/%d\n" % (f1[0], f2[0], f1[1], f2[1], f1[2], f2[2])) | |
| fid.close() | |
| PIL.Image.fromarray(np.ascontiguousarray(tex_map), "RGB").save( | |
| os.path.join(fol, "%s.png" % na)) | |
| return | |
| class MeshOutput(object): | |
| def __init__(self, | |
| mesh_v: np.ndarray, | |
| mesh_f: np.ndarray, | |
| vertex_colors: Optional[np.ndarray] = None, | |
| uvs: Optional[np.ndarray] = None, | |
| mesh_tex_idx: Optional[np.ndarray] = None, | |
| tex_map: Optional[np.ndarray] = None): | |
| self.mesh_v = mesh_v | |
| self.mesh_f = mesh_f | |
| self.vertex_colors = vertex_colors | |
| self.uvs = uvs | |
| self.mesh_tex_idx = mesh_tex_idx | |
| self.tex_map = tex_map | |
| def contain_uv_texture(self): | |
| return (self.uvs is not None) and (self.mesh_tex_idx is not None) and (self.tex_map is not None) | |
| def contain_vertex_colors(self): | |
| return self.vertex_colors is not None | |
| def export(self, fname): | |
| if self.contain_uv_texture(): | |
| savemeshtes2( | |
| self.mesh_v, | |
| self.uvs, | |
| self.mesh_f, | |
| self.mesh_tex_idx, | |
| self.tex_map, | |
| fname | |
| ) | |
| elif self.contain_vertex_colors(): | |
| mesh_obj = trimesh.Trimesh(vertices=self.mesh_v, faces=self.mesh_f, vertex_colors=self.vertex_colors) | |
| mesh_obj.export(fname) | |
| else: | |
| save_obj( | |
| self.mesh_v, | |
| self.mesh_f, | |
| fname | |
| ) | |