save_obj
int saveMeshAsObjWithTexture(Mesh& mgtext, const string& filename) { size_t nVerts = mgtext.pointnum; size_t nfaces = mgtext.facenum; ofstream outfile; outfile.open(filename); if (!outfile) { std::cout << "file open failed.\n"; return -1; } string mtlname = filename; mtlname.erase(mtlname.end() - 4, mtlname.end()); ofstream mtl; mtl.open(mtlname + ".mtl"); if (!mtl) { std::cout << "file mtl open failed.\n"; return -1; } //mtl mtl << "#\n" << "# Wavefront material file\n" << "# Converted by Meshlab Group\n" << "#\n\n" << "newmtl material_0\n" << "Ka 0.200000 0.200000 0.200000\n" << "Kd 1.000000 1.000000 1.000000\n" << "Ks 1.000000 1.000000 1.000000\n" << "Tr 1.000000\n" << "illum 2\n" << "Ns 0.000000\n" << "map_Kd material0000.png\n\n"; mtl.close(); //obj header outfile << "####\n" << "#\n" << "# OBJ File Generated by Meshlab\n" << "#\n" << "####\n" << "# Object out.obj\n" << "#\n" << "# Vertices: " << nVerts << "\n" << "# Faces : " << nfaces << "\n" << "#\n" << "####\n" << "mtllib ./out.mtl\n\n\n"; // Vertices for (size_t i = 0; i < nVerts; i++) { outfile << setiosflags(ios::fixed) << setprecision(6) << "vn " << mgtext.normals[i].x << " " << mgtext.normals[i].y << " " << mgtext.normals[i].z << "\n" << "vt " << mgtext.point_uv_vect[i].x << " " << mgtext.point_uv_vect[i].y << "\n" << "v " << mgtext.point_vect[i].x << " " << mgtext.point_vect[i].y << " " << mgtext.point_vect[i].z << "\n"; } outfile << "\n\n"; outfile << "usemtl material_0\n"; for (size_t i = 0; i < nfaces; i++) { outfile << "f " << mgtext.face[3 * i] + 1 << "/" << mgtext.face[3 * i] + 1 << "/" << mgtext.face[3 * i] + 1 << " " << mgtext.face[3 * i + 1] + 1 << "/" << mgtext.face[3 * i + 1] + 1 << "/" << mgtext.face[3 * i + 1] + 1 << " " << mgtext.face[3 * i + 2] + 1 << "/" << mgtext.face[3 * i + 2] + 1 << "/" << mgtext.face[3 * i + 2] + 1 << "\n"; } outfile << "# End of File\n"; outfile.close(); return 0; }