コード例 #1
0
        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();
        }