Exemple #1
0
        private static ObjModel OrganizeModels(ObjModel model)
        {
            ObjModel result = new ObjModel();

            result.positionList = model.positionList;

            result.normalList.AddRange(model.normalList);

            bool hasUV = model.uvList.Count > 0;

            if (hasUV)
            {
                result.uvList.AddRange(model.uvList);
            }

            for (int i = 0; i < model.innerFaceList.Count; i++)
            {
                var face  = model.innerFaceList[i];
                var tuple = new Tuple <int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position);
                result.faceList.Add(tuple);
                if (face.vertex0.normal > 0)
                {
                    result.normalList[face.vertex0.position - 1] = model.normalList[face.vertex0.normal - 1];
                }
                if (face.vertex1.normal > 0)
                {
                    result.normalList[face.vertex1.position - 1] = model.normalList[face.vertex1.normal - 1];
                }
                if (face.vertex2.normal > 0)
                {
                    result.normalList[face.vertex2.position - 1] = model.normalList[face.vertex2.normal - 1];
                }

                if (hasUV)
                {
                    if (face.vertex0.uv > 0)
                    {
                        result.uvList[face.vertex0.position - 1] = model.uvList[face.vertex0.uv - 1];
                    }
                    if (face.vertex1.uv > 0)
                    {
                        result.uvList[face.vertex1.position - 1] = model.uvList[face.vertex1.uv - 1];
                    }
                    if (face.vertex2.uv > 0)
                    {
                        result.uvList[face.vertex2.position - 1] = model.uvList[face.vertex2.uv - 1];
                    }
                }

                result.faceList.Add(new Tuple <int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position));
                //result.faceList[i] = new Tuple<int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position);
            }

            //model.innerFaceList.Clear();

            return(result);
        }
Exemple #2
0
        private static ObjModel OrganizeModels(ObjModel model)
        {
            ObjModel result = new ObjModel();
            result.positionList = model.positionList;

            result.normalList.AddRange(model.normalList);

            bool hasUV = model.uvList.Count > 0;
            if (hasUV)
            {
                result.uvList.AddRange(model.uvList);
            }

            for (int i = 0; i < model.innerFaceList.Count; i++)
            {
                var face = model.innerFaceList[i];
                var tuple = new Tuple<int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position);
                result.faceList.Add(tuple);
                if (face.vertex0.normal > 0)
                    result.normalList[face.vertex0.position - 1] = model.normalList[face.vertex0.normal - 1];
                if (face.vertex1.normal > 0)
                    result.normalList[face.vertex1.position - 1] = model.normalList[face.vertex1.normal - 1];
                if (face.vertex2.normal > 0)
                    result.normalList[face.vertex2.position - 1] = model.normalList[face.vertex2.normal - 1];

                if (hasUV)
                {
                    if (face.vertex0.uv > 0)
                        result.uvList[face.vertex0.position - 1] = model.uvList[face.vertex0.uv - 1];
                    if (face.vertex1.uv > 0)
                        result.uvList[face.vertex1.position - 1] = model.uvList[face.vertex1.uv - 1];
                    if (face.vertex2.uv > 0)
                        result.uvList[face.vertex2.position - 1] = model.uvList[face.vertex2.uv - 1];
                }

                result.faceList.Add(new Tuple<int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position));
                //result.faceList[i] = new Tuple<int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position);
            }

            //model.innerFaceList.Clear();

            return result;
        }
Exemple #3
0
        private static void GenNormals(ObjModel model)
        {
            if (model.normalList.Count > 0)
            {
                return;
            }

            var faceNormals = new vec3[model.innerFaceList.Count];

            model.normalList.AddRange(new vec3[model.positionList.Count]);

            for (int i = 0; i < model.innerFaceList.Count; i++)
            {
                var  face    = model.innerFaceList[i];
                vec3 vertex0 = model.positionList[face.vertex0.position - 1];
                vec3 vertex1 = model.positionList[face.vertex1.position - 1];
                vec3 vertex2 = model.positionList[face.vertex2.position - 1];
                vec3 v1      = vertex0 - vertex2;
                vec3 v2      = vertex2 - vertex1;
                faceNormals[i] = v1.cross(v2);
            }

            for (int i = 0; i < model.positionList.Count; i++)
            {
                vec3 sum    = new vec3();
                int  shared = 0;
                for (int j = 0; j < model.innerFaceList.Count; j++)
                {
                    var face = model.innerFaceList[j];
                    if (face.vertex0.position - 1 == i || face.vertex1.position - 1 == i || face.vertex2.position - 1 == i)
                    {
                        sum = sum + faceNormals[i];
                        shared++;
                    }
                }
                if (shared > 0)
                {
                    sum = (sum / shared).normalize();
                }
                model.normalList[i] = sum;
            }
        }
Exemple #4
0
        private static void LoadModels(string filename, ObjFile file)
        {
            using (var sr = new StreamReader(filename))
            {
                var model = new ObjModel();

                while (!sr.EndOfStream)
                {
                    string   line  = sr.ReadLine();
                    string[] parts = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
                    if (parts[0] == ("v"))
                    {
                        if (model.innerFaceList.Count > 0)
                        {
                            file.models.Add(model);
                            model = new ObjModel();
                        }

                        vec3 position = new vec3(float.Parse(parts[1]), float.Parse(parts[2]), float.Parse(parts[3]));
                        model.positionList.Add(position);
                    }
                    else if (parts[0] == ("vt"))
                    {
                        vec2 uv = new vec2(float.Parse(parts[1]), float.Parse(parts[2]));
                        model.uvList.Add(uv);
                    }
                    else if (parts[0] == ("vn"))
                    {
                        vec3 normal = new vec3(float.Parse(parts[1]), float.Parse(parts[2]), float.Parse(parts[3]));
                        model.normalList.Add(normal);
                    }
                    else if (parts[0] == ("f"))
                    {
                        Triangle triangle = ParseFace(parts);
                        model.innerFaceList.Add(triangle);
                    }
                }

                file.models.Add(model);
            }
        }
Exemple #5
0
 public ObjModelElement(ObjModel objModel)
 {
     this.objModelAdapter = new ObjModelAdpater(objModel);
 }
Exemple #6
0
        private static void GenNormals(ObjModel model)
        {
            if (model.normalList.Count > 0) { return; }

            var faceNormals = new vec3[model.innerFaceList.Count];
            model.normalList.AddRange(new vec3[model.positionList.Count]);

            for (int i = 0; i < model.innerFaceList.Count; i++)
            {
                var face = model.innerFaceList[i];
                vec3 vertex0 = model.positionList[face.vertex0.position - 1];
                vec3 vertex1 = model.positionList[face.vertex1.position - 1];
                vec3 vertex2 = model.positionList[face.vertex2.position - 1];
                vec3 v1 = vertex0 - vertex2;
                vec3 v2 = vertex2 - vertex1;
                faceNormals[i] = v1.cross(v2);
            }

            for (int i = 0; i < model.positionList.Count; i++)
            {
                vec3 sum = new vec3();
                int shared = 0;
                for (int j = 0; j < model.innerFaceList.Count; j++)
                {
                    var face = model.innerFaceList[j];
                    if (face.vertex0.position - 1 == i || face.vertex1.position - 1 == i || face.vertex2.position - 1 == i)
                    {
                        sum = sum + faceNormals[i];
                        shared++;
                    }
                }
                if (shared > 0)
                {
                    sum = sum / shared;
                    sum.Normalize();
                }
                model.normalList[i] = sum;
            }

        }
Exemple #7
0
        private static void LoadModels(string filename, ObjFile file)
        {
            using (var sr = new StreamReader(filename))
            {
                var model = new ObjModel();

                while (!sr.EndOfStream)
                {
                    string line = sr.ReadLine();
                    string[] parts = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);
                    if (parts[0] == ("v"))
                    {
                        if (model.innerFaceList.Count > 0)
                        {
                            file.models.Add(model);
                            model = new ObjModel();
                        }

                        vec3 position = new vec3(float.Parse(parts[1]), float.Parse(parts[2]), float.Parse(parts[3]));
                        model.positionList.Add(position);
                    }
                    else if (parts[0] == ("vt"))
                    {
                        vec2 uv = new vec2(float.Parse(parts[1]), float.Parse(parts[2]));
                        model.uvList.Add(uv);
                    }
                    else if (parts[0] == ("vn"))
                    {
                        vec3 normal = new vec3(float.Parse(parts[1]), float.Parse(parts[2]), float.Parse(parts[3]));
                        model.normalList.Add(normal);
                    }
                    else if (parts[0] == ("f"))
                    {
                        Triangle triangle = ParseFace(parts);
                        model.innerFaceList.Add(triangle);
                    }
                }

                file.models.Add(model);
            }
        }