ObjExporter.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.IO;
  4. using System.Text;
  5. public class ObjExporter
  6. {
  7. public static string MeshToString(MeshFilter mf)
  8. {
  9. Mesh m = mf.mesh;
  10. MeshRenderer mr = mf.gameObject.GetComponent<MeshRenderer>();
  11. Material[] mats = mr.sharedMaterials;
  12. StringBuilder sb = new StringBuilder();
  13. sb.Append("g ").Append(mf.name).Append("\n");
  14. foreach (Vector3 v in m.vertices)
  15. {
  16. sb.Append(string.Format("v {0} {1} {2}\n", v.x, v.y, v.z));
  17. }
  18. sb.Append("\n");
  19. foreach (Vector3 v in m.normals)
  20. {
  21. sb.Append(string.Format("vn {0} {1} {2}\n", v.x, v.y, v.z));
  22. }
  23. sb.Append("\n");
  24. foreach (Vector3 v in m.uv)
  25. {
  26. sb.Append(string.Format("vt {0} {1}\n", v.x, v.y));
  27. }
  28. for (int material = 0; material < m.subMeshCount; material++)
  29. {
  30. sb.Append("\n");
  31. sb.Append("usemtl ").Append(mats[material].name).Append("\n");
  32. sb.Append("usemap ").Append(mats[material].name).Append("\n");
  33. int[] triangles = m.GetTriangles(material);
  34. for (int i = 0; i < triangles.Length; i += 3)
  35. {
  36. sb.Append(string.Format("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n",
  37. triangles[i] + 1, triangles[i + 1] + 1, triangles[i + 2] + 1));
  38. }
  39. }
  40. return sb.ToString();
  41. }
  42. public static void MeshToFile(MeshFilter mf, string filename)
  43. {
  44. using (StreamWriter sw = new StreamWriter(filename))
  45. {
  46. sw.Write(MeshToString(mf));
  47. }
  48. }
  49. }