Beispiel #1
0
 /// <summary>
 /// get parsed obj model
 /// </summary>
 /// <returns></returns>
 public ObjModel GetModel()
 {
     if (_model == null)
     {
         var modelName = "Untitled";
         if (!String.IsNullOrEmpty(_objFile))
         {
             modelName = Path.GetFileNameWithoutExtension(_objFile);
         }
         _model = new ObjModel {
             Name = modelName
         };
         while (!_reader.EndOfStream)
         {
             var line = _reader.ReadLine().Trim();
             if (String.IsNullOrEmpty(line))
             {
                 continue;
             }
             if (line.StartsWith("#"))
             {
                 continue;
             }
             if (StartWith(line, "mtllib"))
             {
                 _model.MatFilename = line.Substring(6).Trim();
             }
             else if (StartWith(line, "v"))
             {
                 var vStr = line.Substring(1).Trim();
                 var strs = SplitLine(vStr);
                 var v    = new Vec3(double.Parse(strs[0]), double.Parse(strs[1]), double.Parse(strs[2]));
                 _model.Vertices.Add(v);
             }
             else if (StartWith(line, "vn"))
             {
                 var vnStr = line.Substring(2).Trim();
                 var strs  = SplitLine(vnStr);
                 var vn    = new Vec3(double.Parse(strs[0]), double.Parse(strs[1]), double.Parse(strs[2]));
                 _model.Normals.Add(vn);
             }
             else if (StartWith(line, "vt"))
             {
                 var vtStr = line.Substring(2).Trim();
                 var strs  = SplitLine(vtStr);
                 var vt    = new Vec2(double.Parse(strs[0]), double.Parse(strs[1]));
                 _model.Uvs.Add(vt);
             }
             else if (StartWith(line, "g"))
             {
                 var gStr = line.Substring(1).Trim();
                 var g    = new Geometry {
                     Id = gStr
                 };
                 _model.Geometries.Add(g);
             }
             else if (StartWith(line, "usemtl"))
             {
                 var umtl = line.Substring(6).Trim();
                 var g    = GetGeometry();
                 var face = new Face {
                     MatName = umtl
                 };
                 g.Faces.Add(face);
             }
             else if (StartWith(line, "f"))
             {
                 var  fStr = line.Substring(1).Trim();
                 var  g    = GetGeometry();
                 Face face = GetFace(g);
                 var  strs = SplitLine(fStr);
                 if (strs.Length < 3)
                 {
                     continue;                  // ignore face that has less than 3 vertices
                 }
                 if (strs.Length == 3)
                 {
                     var v1 = GetVertex(strs[0]);
                     var v2 = GetVertex(strs[1]);
                     var v3 = GetVertex(strs[2]);
                     var f  = new FaceTriangle(v1, v2, v3);
                     face.Triangles.Add(f);
                 }
                 else if (strs.Length == 4)
                 {
                     var v1 = GetVertex(strs[0]);
                     var v2 = GetVertex(strs[1]);
                     var v3 = GetVertex(strs[2]);
                     var f  = new FaceTriangle(v1, v2, v3);
                     face.Triangles.Add(f);
                     var v4 = GetVertex(strs[3]);
                     var ff = new FaceTriangle(v1, v3, v4);
                     face.Triangles.Add(ff);
                 }
                 else //if (strs.Length > 4)
                 {
                     var points = new List <Vec3>();
                     for (var i = 0; i < strs.Length; i++)
                     {
                         var vv = GetVertex(strs[i]);
                         var p  = _model.Vertices[vv.V - 1];
                         points.Add(p);
                     }
                     var planeAxis = GeomUtil.ComputeProjectTo2DArguments(points);
                     if (planeAxis != null)
                     {
                         var points2D = GeomUtil.CreateProjectPointsTo2DFunction(planeAxis, points);
                         var indices  = PolygonPipeline.Triangulate(points2D, null);
                         if (indices.Length == 0)
                         {
                             // TODO:
                         }
                         for (var i = 0; i < indices.Length - 2; i += 3)
                         {
                             var vv1 = GetVertex(strs[indices[i]]);
                             var vv2 = GetVertex(strs[indices[i + 1]]);
                             var vv3 = GetVertex(strs[indices[i + 2]]);
                             var ff  = new FaceTriangle(vv1, vv2, vv3);
                             face.Triangles.Add(ff);
                         }
                     }
                     else
                     {
                         // TODO:
                     }
                 }
             }
             else
             {
                 //var strs = SplitLine(line);
             }
         }
         if (!String.IsNullOrEmpty(_model.MatFilename))
         {
             var dir     = Path.GetDirectoryName(_objFile);
             var matFile = Path.Combine(dir, _model.MatFilename);
             using (var mtlParser = new MtlParser(matFile, _encoding))
             {
                 var mats = mtlParser.GetMats();
                 _model.Materials.AddRange(mats);
             }
         }
     }
     return(_model);
 }
Beispiel #2
0
        private Geometry AddGeo(Geometry g, GeomBox box,
                                List <int> pnts, List <int> normals, List <int> uvs)
        {
            var gg = new Geometry {
                Id = g.Id
            };

            var pntList  = box.Pnts;  // new List<int>(); //
            var normList = box.Norms; // new List<int>(); //
            var uvList   = box.Uvs;   // new List<int>(); //

            //if (pntList.Count == 0)
            //{
            //    foreach (var f in g.Faces)
            //    {
            //        foreach (var t in f.Triangles)
            //        {
            //            var v1 = t.V1;
            //            if (!pntList.Contains(v1.V))
            //            {
            //                pntList.Add(v1.V);
            //            }
            //            if (v1.N > 0 && !normList.Contains(v1.N))
            //            {
            //                normList.Add(v1.N);
            //            }
            //            if (v1.T > 0 && !uvList.Contains(v1.T))
            //            {
            //                uvList.Add(v1.T);
            //            }
            //            var v2 = t.V2;
            //            if (!pntList.Contains(v2.V))
            //            {
            //                pntList.Add(v2.V);
            //            }
            //            if (v2.N > 0 && !normList.Contains(v2.N))
            //            {
            //                normList.Add(v2.N);
            //            }
            //            if (v2.T > 0 && !uvList.Contains(v2.T))
            //            {
            //                uvList.Add(v2.T);
            //            }
            //            var v3 = t.V3;
            //            if (!pntList.Contains(v3.V))
            //            {
            //                pntList.Add(v3.V);
            //            }
            //            if (v3.N > 0 && !normList.Contains(v3.N))
            //            {
            //                normList.Add(v3.N);
            //            }
            //            if (v3.T > 0 && !uvList.Contains(v3.T))
            //            {
            //                uvList.Add(v3.T);
            //            }
            //        }

            //    }
            //}


            var pntDict  = new Dictionary <int, int>();
            var normDict = new Dictionary <int, int>();
            var uvDict   = new Dictionary <int, int>();

            foreach (var p in pntList)
            {
                var index = pnts.IndexOf(p);
                if (index == -1)
                {
                    index = pnts.Count;
                    pnts.Add(p);
                }
                pntDict.Add(p, index + 1);
            }

            foreach (var n in normList)
            {
                var index = normals.IndexOf(n);
                if (index == -1)
                {
                    index = normals.Count;
                    normals.Add(n);
                }
                normDict.Add(n, index + 1);
            }

            foreach (var t in uvList)
            {
                var index = uvs.IndexOf(t);
                if (index == -1)
                {
                    index = uvs.Count;
                    uvs.Add(t);
                }
                uvDict.Add(t, index + 1);
            }


            foreach (var f in g.Faces)
            {
                var ff = new Face {
                    MatName = f.MatName
                };

                foreach (var t in f.Triangles)
                {
                    var v1 = GetVertex(t.V1, pntDict, normDict, uvDict);
                    var v2 = GetVertex(t.V2, pntDict, normDict, uvDict);
                    var v3 = GetVertex(t.V3, pntDict, normDict, uvDict);
                    var fv = new FaceTriangle(v1, v2, v3);
                    ff.Triangles.Add(fv);
                }

                gg.Faces.Add(ff);
            }

            return(gg);
        }