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(); }
/** * Read an OBJ file an create a mesh from the content. * */ public void Read(string filename, ITriangleMesh mesh) { this.mesh = mesh; mesh.Clear(); // Read input string objSource = System.IO.File.ReadAllText(AssetPath.GetPathToAsset(filename)); string[] lines = objSource.Split('\n'); foreach (String line in lines) { string[] tokens = line.Trim().Split(' ', '\t'); if (tokens.Length > 0) { if (tokens [0].CompareTo("v") == 0) { ParseVertex(tokens); } else if (tokens [0].CompareTo("f") == 0) { ParseFacet(tokens); } else if (tokens [0].CompareTo("vt") == 0) { ParseTextureCoordinate(tokens); } } } mesh.ComputeTriangleNormals(); Console.WriteLine("Read mesh from file " + filename + " with " + mesh.GetNumberOfTriangles() + " triangles and " + mesh.GetNumberOfVertices() + " vertices."); }