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); }