void Triangulate(Vector3 normal, List <Vector3> points) { if (points.Count == 3) { Facet facet = new Facet { Normal = normal, Vx1 = points[0], Vx2 = points[1], Vx3 = points[2] }; Model.Facets.Add(facet); } else { Vector3 up = Vector3.Subtract(points[0], points[1]).Normalized(); Matrix4 mt = Matrix4.LookAt(normal, Vector3.Zero, up); var projected = points.Select(x => Vector3.TransformPosition(x, mt)); List <float> data = projected.SelectMany(pt => new float[] { pt.X, pt.Y }).ToList(); IList <int> triangles = Tessellator.Tessellate(data); for (int i = 0; i < triangles.Count; i += 3) { Facet facet = new Facet { Normal = normal, Vx1 = points[triangles[i]], Vx2 = points[triangles[i + 1]], Vx3 = points[triangles[i + 2]] }; Model.Facets.Add(facet); } } }
private void Awake() { lineRenderer.positionCount = vertices.Count; for (int i = 0; i < vertices.Count; i++) { lineRenderer.SetPosition(i, vertices[i]); } var tessellator = new Tessellator(); tessellator.AddContour(vertices); tessellator.Tessellate(normal: Vector3.back); meshFilter.mesh = tessellator.ToMesh(); }
public override MeshDraft Construct(Vector2 parentLayoutOrigin) { var roofDraft = ConstructRoofBase(out List <Vector2> roofPolygon2, out List <Vector3> roofPolygon3); var tessellator = new Tessellator(); tessellator.AddContour(roofPolygon3); tessellator.Tessellate(normal: Vector3.up); var roofTop = tessellator.ToMeshDraft() .Move(Vector3.up * roofConfig.thickness); for (var i = 0; i < roofTop.vertexCount; i++) { roofTop.normals.Add(Vector3.up); } return(roofDraft.Add(roofTop) .Paint(roofColor)); }
protected static MeshDraft ConstructContourDraft(List <Vector2> skeletonPolygon2, float roofPitch) { Vector2 edgeA = skeletonPolygon2[0]; Vector2 edgeB = skeletonPolygon2[1]; Vector2 edgeDirection2 = (edgeB - edgeA).normalized; Vector3 roofNormal = CalculateRoofNormal(edgeDirection2, roofPitch); var skeletonPolygon3 = skeletonPolygon2.ConvertAll(v => v.ToVector3XZ()); var tessellator = new Tessellator(); tessellator.AddContour(skeletonPolygon3); tessellator.Tessellate(normal: Vector3.up); var contourDraft = tessellator.ToMeshDraft(); for (var i = 0; i < contourDraft.vertexCount; i++) { Vector2 vertex = contourDraft.vertices[i].ToVector2XZ(); float height = CalculateVertexHeight(vertex, edgeA, edgeDirection2, roofPitch); contourDraft.vertices[i] = new Vector3(vertex.x, height, vertex.y); contourDraft.normals.Add(roofNormal); } return(contourDraft); }