/** * Compute the normal of the border edge. * */ private Vector3 ComputeBorderEdgeNormal(TriangleEdge edge, ITriangleMesh mesh) { Vector3 v0 = mesh.GetVertex(edge.A); Vector3 v1 = mesh.GetVertex(edge.B); Vector3 e = Vector3.Subtract(v1, v0); Vector3 n = Vector3.Cross(e, Vector3.UnitZ); n.Normalize(); return(n); }
public static void Translate(ITriangleMesh mesh, Vector3 translation) { for (int i = 0; i < mesh.GetNumberOfVertices(); i++) { mesh.SetVertex(i, Vector3.Add(mesh.GetVertex(i), translation)); } }
public static ITriangleMesh Snap(ITriangleMesh mesh, float epsilon) { Dictionary <int, int> vertexMapping = new Dictionary <int, int>(); ITriangleMesh result = new TriangleMesh(); for (int i = 0; i < mesh.GetNumberOfVertices(); i++) { Vector3 vi = mesh.GetVertex(i); bool found = false; for (int j = 0; j < result.GetNumberOfVertices(); j++) { Vector3 vj = result.GetVertex(j); if (Vector3.Subtract(vi, vj).Length < epsilon) { vertexMapping[i] = j; found = true; } } if (!found) { int idx = result.AddVertex(vi); vertexMapping[i] = idx; } } for (int i = 0; i < mesh.GetNumberOfTexCoords(); i++) { result.AddTextureCoordinate(mesh.GetTextureCoordinate(i)); } for (int i = 0; i < mesh.GetNumberOfTriangles(); i++) { Triangle t = mesh.GetTriangle(i).Clone(); t.A = vertexMapping[t.A]; t.B = vertexMapping[t.B]; t.C = vertexMapping[t.C]; result.AddTriangle(t); } Console.WriteLine("Mesh snapping: " + mesh.GetNumberOfVertices() + " -> " + result.GetNumberOfVertices() + " verts."); return(result); }
/** * Generated the unification of two meshes. Attention: no new mesh is generated, in fact the * geometry of mesh2 is added to mesh1. */ public static void Unite(ITriangleMesh mesh1, ITriangleMesh mesh2) { int numberOfVertsMesh1 = mesh1.GetNumberOfVertices(); int numberOfTexCoordsMesh1 = mesh1.GetNumberOfTexCoords(); for (int i = 0; i < mesh2.GetNumberOfVertices(); i++) { mesh1.AddVertex(mesh2.GetVertex(i)); } for (int i = 0; i < mesh2.GetNumberOfTexCoords(); i++) { mesh1.AddTextureCoordinate(mesh2.GetTextureCoordinate(i)); } for (int i = 0; i < mesh2.GetNumberOfTriangles(); i++) { Triangle t = mesh2.GetTriangle(i).Clone(); t.VertexIndexOffset(numberOfVertsMesh1); t.TexCoordsIndexOffset(numberOfTexCoordsMesh1); mesh1.AddTriangle(t); } mesh1.ComputeTriangleNormals(); }
/** * Create the VBO for the triangles * */ void CreateTrianglesVBO() { trianglesVBO.Invalidate(); List <RenderVertex> renderVertices = new List <RenderVertex>(); for (int triangleIndex = 0; triangleIndex < mesh.GetNumberOfTriangles(); triangleIndex++) { Triangle t = mesh.GetTriangle(triangleIndex); for (int vertexIndex = 0; vertexIndex < 3; vertexIndex++) { Vector3 pos = mesh.GetVertex(t.GetVertexIndex(vertexIndex)); Vector2 textCoords = mesh.GetTextureCoordinate(t.GetTexCoordIndex(vertexIndex)); renderVertices.Add(new RenderVertex(pos, t.Normal, color, textCoords)); } } trianglesVBO.Setup(renderVertices, PrimitiveType.Triangles); }
private ITriangleMesh CreateBoundary(ITriangleMesh mesh, float height, float borderHeightTop, float borderHeightBottom, Vector3 offset, Vector2[] cornerTexCoords) { List <TriangleEdge> border = mesh.GetBorder(); int vertsPerBorderEdge = 3; ITriangleMesh borderMesh = new TriangleMesh(); for (int i = 0; i < border.Count; i++) { borderMesh.AddVertex(mesh.GetVertex(border[i].A)); } for (int i = 0; i < border.Count; i++) { TriangleEdge borderEdge = border[i]; TriangleEdge prevEdge = border[(i + border.Count - 1) % border.Count]; Vector3 v = borderMesh.GetVertex(i); // v0 Vector3 edgeNormal = ComputeBorderEdgeNormal(borderEdge, mesh); Vector3 prevEdgeNormal = ComputeBorderEdgeNormal(prevEdge, mesh); Vector3 borderNormal = Vector3.Add(edgeNormal, prevEdgeNormal); borderNormal.Normalize(); borderNormal = Vector3.Multiply(borderNormal, Math.Max(borderHeightTop, borderHeightBottom) / (float)Math.Sin(30.0 / 180.0 * Math.PI)); Vector3 v0 = Vector3.Add(Vector3.Add(v, borderNormal), new Vector3(0, 0, -borderHeightTop)); borderMesh.AddVertex(v0); // v1 Vector3 v1 = Vector3.Add(v0, Vector3.Multiply(Vector3.UnitZ, -(height - (borderHeightTop + borderHeightBottom)))); borderMesh.AddVertex(v1); // v2 Vector3 v2 = Vector3.Add(v, Vector3.Multiply(Vector3.UnitZ, -height)); borderMesh.AddVertex(v2); } float alpha = (float)(borderHeightTop * Math.Sqrt(2) / (borderHeightTop * Math.Sqrt(2) + borderHeightBottom * Math.Sqrt(2) + height)); float beta = 1 - (float)(borderHeightBottom * Math.Sqrt(2) / (borderHeightTop * Math.Sqrt(2) + borderHeightBottom * Math.Sqrt(2) + height)); int ti0 = borderMesh.AddTextureCoordinate(cornerTexCoords[0]); int ti1 = borderMesh.AddTextureCoordinate(Vector2.Add(Vector2.Multiply(cornerTexCoords[0], 1 - alpha), Vector2.Multiply(cornerTexCoords[1], alpha))); int ti2 = borderMesh.AddTextureCoordinate(Vector2.Add(Vector2.Multiply(cornerTexCoords[0], 1 - beta), Vector2.Multiply(cornerTexCoords[1], beta))); int ti3 = borderMesh.AddTextureCoordinate(cornerTexCoords[1]); int ti_0 = borderMesh.AddTextureCoordinate(cornerTexCoords[2]); int ti_1 = borderMesh.AddTextureCoordinate(Vector2.Add(Vector2.Multiply(cornerTexCoords[2], 1 - alpha), Vector2.Multiply(cornerTexCoords[3], alpha))); int ti_2 = borderMesh.AddTextureCoordinate(Vector2.Add(Vector2.Multiply(cornerTexCoords[2], 1 - beta), Vector2.Multiply(cornerTexCoords[3], beta))); int ti_3 = borderMesh.AddTextureCoordinate(cornerTexCoords[3]); // Triangles for (int i = 0; i < border.Count; i++) { TriangleEdge borderEdge = border[i]; int vi0 = border.Count + vertsPerBorderEdge * i + 0; int vi1 = border.Count + vertsPerBorderEdge * i + 1; int vi2 = border.Count + vertsPerBorderEdge * i + 2; int vi_0 = border.Count + vertsPerBorderEdge * ((i + 1) % border.Count) + 0; int vi_1 = border.Count + vertsPerBorderEdge * ((i + 1) % border.Count) + 1; int vi_2 = border.Count + vertsPerBorderEdge * ((i + 1) % border.Count) + 2; // A Triangle t = new Triangle(i, vi0, (i + 1) % border.Count, ti0, ti1, ti_1); borderMesh.AddTriangle(t); // B t = new Triangle((i + 1) % border.Count, vi0, vi_0, ti_0, ti1, ti_1); borderMesh.AddTriangle(t); // C t = new Triangle(vi0, vi1, vi_0, ti1, ti2, ti_1); borderMesh.AddTriangle(t); // D t = new Triangle(vi1, vi_1, vi_0, ti2, ti_2, ti_1); borderMesh.AddTriangle(t); // E t = new Triangle(vi1, vi2, vi_1, ti2, ti3, ti_2); borderMesh.AddTriangle(t); // F t = new Triangle(vi2, vi_2, vi_1, ti3, ti_3, ti_2); borderMesh.AddTriangle(t); } return(borderMesh); }