Exemple #1
0
        public static MeshGeometryModel3D Create3DPolygon(List <Vector2> points, float height, Material material)
        {
            MeshBuilder builder = new MeshBuilder();

            if (points.Count < 3)
            {
                return(null);
            }

            // Create poly now to indicate winding order
            Polygon_Poly2Tri upPolygon = new Polygon_Poly2Tri(
                points: points.Select(point => new PolygonPoint(point.X, point.Y)));

            List <Vector2> pointByClockwise =
                upPolygon.WindingOrder == Point2DList.WindingOrderType.AntiClockwise
                                        ? points.AsEnumerable().Reverse().ToList()
                                        : points;

            // Adding walls
            Vector3 firstUpPoint   = pointByClockwise.First().AddZ(height);
            Vector3 firstDownPoint = pointByClockwise.First().AddZ(0);
            Vector3 lastUpPoint    = firstUpPoint;
            Vector3 lastDownPoint  = firstDownPoint;

            for (int i = 1; i < pointByClockwise.Count; i++)
            {
                Vector3 currentUpPoint   = pointByClockwise[i].AddZ(height);
                Vector3 currentDownPoint = pointByClockwise[i].AddZ(0);

                builder.AddQuad(
                    currentDownPoint.Map(),
                    lastDownPoint.Map(),
                    lastUpPoint.Map(),
                    currentUpPoint.Map());

                lastUpPoint   = currentUpPoint;
                lastDownPoint = currentDownPoint;
            }

            // Create cycle
            builder.AddQuad(
                firstDownPoint.Map(),
                lastDownPoint.Map(),
                lastUpPoint.Map(),
                firstUpPoint.Map());

            // Adding Upper Part
            P2T.Triangulate(upPolygon);
            foreach (var trianglePoints in upPolygon.Triangles.Select(x => x.Points))
            {
                builder.AddTriangle(
                    p0: new Vector3_SharpDX((float)trianglePoints.Item0.X, (float)trianglePoints.Item0.Y, height),
                    p1: new Vector3_SharpDX((float)trianglePoints.Item1.X, (float)trianglePoints.Item1.Y, height),
                    p2: new Vector3_SharpDX((float)trianglePoints.Item2.X, (float)trianglePoints.Item2.Y, height));
            }

            MeshGeometry3D      polyWall = builder.ToMesh();
            MeshGeometryModel3D element  = new MeshGeometryModel3D()
            {
                Geometry = polyWall,
                Material = material
            };

            return(element);
        }