예제 #1
0
    public static MMesh GetMMesh()
    {
        mesh = new MMesh();
        MPoint     a     = mesh.CreatePoint(new Vector3(0, 0.75f, 0));
        MPoint     b     = mesh.CreatePoint(new Vector3(0, -0.75f, 0));
        MCurveEdge curvb = mesh.CreateCurveEdge(b, 0.5f, Vector3.up);

        mesh.CreateCircleFace(curvb);
        mesh.CreateConeFace(a, curvb);
        return(mesh);
    }
예제 #2
0
 // 针对导入模型的初始化
 public MObject(GameObject template, string filename)
 {
     this.template = template;
     gameObject = GameObject.Instantiate(template);
     mesh = new MMesh();
     using(StreamReader sr = new StreamReader(MDefinitions.SAVE_PATH + "/" + filename))
     {
         string line = sr.ReadLine();
         string[] lineComponent;
         bool parseLine;
         while (line!=null)
         {
             lineComponent = line.Split(' ');
             string type = lineComponent[0];
             parseLine = true;
             switch (type)
             {
                 case "p":
                     float x = (float)Convert.ToDouble(lineComponent[1]);
                     float y = (float)Convert.ToDouble(lineComponent[2]);
                     float z = (float)Convert.ToDouble(lineComponent[3]);
                     Vector3 position = new Vector3(x, y, z);
                     mesh.CreatePoint(position);
                     break;
                 case "le":
                     int start = Convert.ToInt32(lineComponent[1]);
                     int end = Convert.ToInt32(lineComponent[2]);
                     List<MPoint> pointList = mesh.pointList;
                     mesh.CreateLinearEdge(pointList[start], pointList[end]);
                     break;
                 case "ce":
                     int center = Convert.ToInt32(lineComponent[1]);
                     float radius = (float)Convert.ToDouble(lineComponent[2]);
                     Vector3 normal = new Vector3(
                         (float)Convert.ToDouble(lineComponent[3]), 
                         (float)Convert.ToDouble(lineComponent[4]), 
                         (float)Convert.ToDouble(lineComponent[5]));
                     mesh.CreateCurveEdge(mesh.pointList[center], radius, normal);
                     break;
                 case "ge":
                     List<Vector3> points = new List<Vector3>();
                     line = sr.ReadLine();
                     while (line != null)
                     {
                         lineComponent = line.Split(' ');
                         if(lineComponent[0] != "v")
                         {
                             parseLine = false;
                             break;
                         }
                         else
                         {
                             points.Add(new Vector3(
                             (float)Convert.ToDouble(lineComponent[1]),
                             (float)Convert.ToDouble(lineComponent[2]),
                             (float)Convert.ToDouble(lineComponent[3])));
                         }
                         line = sr.ReadLine();
                     }
                     mesh.CreateGeneralEdge(points);
                     break;
                 case "polyf":
                     List<MLinearEdge> edgeList = new List<MLinearEdge>();
                     line = sr.ReadLine();
                     while (line != null)
                     {
                         lineComponent = line.Split(' ');
                         if (lineComponent[0] != "e")
                         {
                             parseLine = false;
                             break;
                         }
                         else
                         {
                             int index = Convert.ToInt32(lineComponent[1]);
                             edgeList.Add((MLinearEdge)mesh.edgeList[index]);
                         }
                         line = sr.ReadLine();
                     }
                     mesh.CreatePolygonFace(edgeList);
                     break;
                 case "circf":
                     int circle = Convert.ToInt32(lineComponent[1]);
                     mesh.CreateCircleFace((MCurveEdge)mesh.edgeList[circle]);
                     break;
                 case "conf":
                     int top = Convert.ToInt32(lineComponent[1]);
                     int bottom = Convert.ToInt32(lineComponent[2]);
                     mesh.CreateConeFace(mesh.pointList[top], (MCurveEdge)mesh.edgeList[bottom]);
                     break;
                 case "cylf":
                     top = Convert.ToInt32(lineComponent[1]);
                     bottom = Convert.ToInt32(lineComponent[2]);
                     mesh.CreateCylinderFace((MCurveEdge)mesh.edgeList[top], (MCurveEdge)mesh.edgeList[bottom]);
                     break;
                 case "sf":
                     center = Convert.ToInt32(lineComponent[1]);
                     radius = (float)Convert.ToDouble(lineComponent[2]);
                     mesh.CreateSphereFace(mesh.pointList[center], radius);
                     break;
                 case "gff":
                     points = new List<Vector3>();
                     line = sr.ReadLine();
                     while (line != null)
                     {
                         lineComponent = line.Split(' ');
                         if (lineComponent[0] != "v")
                         {
                             parseLine = false;
                             break;
                         }
                         else
                         {
                             points.Add(new Vector3(
                             (float)Convert.ToDouble(lineComponent[1]),
                             (float)Convert.ToDouble(lineComponent[2]),
                             (float)Convert.ToDouble(lineComponent[3])));
                         }
                         line = sr.ReadLine();
                     }
                     mesh.CreateGeneralFlatFace(points);
                     break;
                 case "gcf":
                     List<Vector3> vertices = new List<Vector3>();
                     line = sr.ReadLine();
                     while (line != null)
                     {
                         lineComponent = line.Split(' ');
                         if (lineComponent[0] != "v")
                         {
                             parseLine = false;
                             break;
                         }
                         else
                         {
                             vertices.Add(new Vector3(
                             (float)Convert.ToDouble(lineComponent[1]),
                             (float)Convert.ToDouble(lineComponent[2]),
                             (float)Convert.ToDouble(lineComponent[3])));
                         }
                         line = sr.ReadLine();
                     }
                     List<int> triangles = new List<int>();
                     if (!parseLine) line = sr.ReadLine();
                     while (line != null)
                     {
                         lineComponent = line.Split(' ');
                         if (lineComponent[0] != "f")
                         {
                             parseLine = false;
                             break;
                         }
                         else
                         {
                             triangles.Add(Convert.ToInt32(lineComponent[1]));
                             triangles.Add(Convert.ToInt32(lineComponent[2]));
                             triangles.Add(Convert.ToInt32(lineComponent[3]));
                         }
                         line = sr.ReadLine();
                     }
                     Mesh m = new Mesh();
                     m.vertices = vertices.ToArray();
                     m.triangles = triangles.ToArray();
                     m.RecalculateNormals();
                     mesh.CreateGeneralCurveFace(m);
                     break;
             }
             if(parseLine)line = sr.ReadLine();
         }
         sr.Close();
     }
     InitObject();
 }