public static void CreateWavefrontOBJFile(WavefrontObject wavefront, string filename) { FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Read); StreamWriter sw = new StreamWriter(fs); sw.NewLine = "\r\n"; if (wavefront.VertexCount > 0) foreach (Vector3 v in wavefront.Vertices) { sw.WriteLine("v " + Math.Round((double)v.X, 5, MidpointRounding.ToEven).ToString() + " " + Math.Round((double)v.Y, 5, MidpointRounding.ToEven).ToString() + " " + Math.Round((double)v.Z, 5, MidpointRounding.ToEven).ToString()); } sw.WriteLine("# " + wavefront.VertexCount.ToString() + " Vertices"); sw.WriteLine(); if (wavefront.TexcoordCount > 0) foreach (Vector2 vt in wavefront.Texcoords) { sw.WriteLine("vt " + Math.Round((double)vt.X, 5, MidpointRounding.ToEven).ToString() + " " + Math.Round((double)vt.Y, 5, MidpointRounding.ToEven).ToString()); } sw.WriteLine("# " + wavefront.TexcoordCount.ToString() + " Texcoords"); sw.WriteLine(); if (wavefront.NormalCount > 0) foreach (Vector3 vn in wavefront.Normals) { sw.WriteLine("vn " + Math.Round((double)vn.X, 5, MidpointRounding.ToEven).ToString() + " " + Math.Round((double)vn.Y, 5, MidpointRounding.ToEven).ToString() + " " + Math.Round((double)vn.Z, 5, MidpointRounding.ToEven).ToString()); } sw.WriteLine("# " + wavefront.NormalCount.ToString() + " Normals"); sw.WriteLine(); if (wavefront.FaceCount > 0) { Dictionary<int, string> MaterialNames; MaterialNames = wavefront.Materials.ToDictionary(x => x.Value, x => x.Key); int[] Faces; string curMat = ""; string newMat; Face temp; for (int Group = 0; Group < wavefront.GroupCount; Group++) { Faces = wavefront.GetFaceIndicesUsingGroupID(Group); for (int Face = 0; Face < Faces.Length; Face++) { temp = wavefront.Faces[Faces[Face]]; newMat = MaterialNames[temp.MaterialID]; if (curMat != newMat) { curMat = newMat; sw.WriteLine("usemtl " + curMat); } sw.WriteLine("f " + temp.ToString()); } sw.WriteLine("# " + Faces.Length.ToString() + " Faces"); sw.WriteLine(); curMat = ""; } } sw.Dispose(); fs.Dispose(); }