public static void test_auto_fill() { DMesh3 mesh = TestUtil.LoadTestInputMesh("autofill_cases.obj"); //DMesh3 mesh = TestUtil.LoadTestInputMesh("autofill_tempcase1.obj"); //DMesh3 mesh = TestUtil.LoadTestInputMesh("autofill_planarcase.obj"); //DMesh3 mesh = TestUtil.LoadTestInputMesh("autofill_box_edge_strip.obj"); //DMesh3 mesh = TestUtil.LoadTestInputMesh("autofill_box_edge_strip_2.obj"); //DMesh3 mesh = TestUtil.LoadTestInputMesh("crazyhole.obj"); double mine, maxe, avge; MeshQueries.EdgeLengthStats(mesh, out mine, out maxe, out avge); int ROUNDS = 1; for (int k = 0; k < ROUNDS; ++k) { MeshBoundaryLoops loops = new MeshBoundaryLoops(mesh); foreach (EdgeLoop loop in loops) { AutoHoleFill fill = new AutoHoleFill(mesh, loop); fill.TargetEdgeLength = avge; fill.Apply(); } if (k == ROUNDS - 1) { continue; } RemesherPro r = new RemesherPro(mesh); r.SetTargetEdgeLength(avge); for (int j = 0; j < 10; ++j) { r.FastSplitIteration(); } MergeCoincidentEdges merge = new MergeCoincidentEdges(mesh); merge.Apply(); } TestUtil.WriteTestOutputMesh(mesh, "autofill_result.obj"); //DMesh3 mesh = new DMesh3(); //SphericalFibonacciPointSet ps = new SphericalFibonacciPointSet(); //for (int k = 0; k < ps.N; ++k) { // MeshEditor.AppendBox(mesh, ps[k], ps[k], 0.05f); //} //Random r = new Random(31337); //Vector3d[] pts = TestUtil.RandomPoints3(10000, r, Vector3d.Zero); //foreach ( Vector3d pt in pts ) { // pt.Normalize(); // int nearest = ps.NearestPoint(pt, true); // Vector3d p = ps[nearest]; // MeshEditor.AppendLine(mesh, new Segment3d(p, p + 0.25f * pt), 0.01f); //} //TestUtil.WriteTestOutputMesh(mesh, "fibonacci.obj"); }
public static void basic_test() { DMesh3 target = TestUtil.LoadTestInputMesh("twocylinder_orig.obj"); DMesh3 mesh = TestUtil.LoadTestInputMesh("twocylinder_approx.obj"); DMeshAABBTree3 targetSpatial = new DMeshAABBTree3(target, true); ConstantMeshSourceOp sourceOp = new ConstantMeshSourceOp(mesh, true, true); ConstantMeshSourceOp targetOp = new ConstantMeshSourceOp(target, true, true); RemesherPro remesher = new RemesherPro(mesh); remesher.SetTargetEdgeLength(0.5f); //remesher.MinEdgeLength = 0.25; remesher.SmoothSpeedT = 0.5f; var ProjTarget = new MeshProjectionTarget(target, targetSpatial); remesher.SetProjectionTarget(ProjTarget); remesher.SharpEdgeReprojectionRemesh(20, 40); TestUtil.WriteTestOutputMesh(mesh, "reproject_cylinder.obj"); }
public static void quick_test_2() { DMesh3 target = TestUtil.LoadTestInputMesh("cylinder_orig.obj"); DMeshAABBTree3 targetSpatial = new DMeshAABBTree3(target, true); DMesh3 mesh = TestUtil.LoadTestInputMesh("cylinder_approx.obj"); DMeshAABBTree3 meshSpatial = new DMeshAABBTree3(mesh, true); double search_dist = 10.0; MeshTopology topo = new MeshTopology(target); topo.Compute(); RemesherPro r = new RemesherPro(mesh); r.SetTargetEdgeLength(2.0); r.SmoothSpeedT = 0.5; r.SetProjectionTarget(MeshProjectionTarget.Auto(target)); MeshConstraints cons = new MeshConstraints(); r.SetExternalConstraints(cons); int set_id = 1; foreach (var loop in topo.Loops) { DCurveProjectionTarget curveTarget = new DCurveProjectionTarget(loop.ToCurve(target)); set_id++; // pick a set of points we will find paths between. We will chain // up those paths and constrain them to target loops. // (this part is the hack!) List <int> target_verts = new List <int>(); List <int> mesh_verts = new List <int>(); for (int k = 0; k < loop.VertexCount; k += 5) { target_verts.Add(loop.Vertices[k]); Vector3d vCurve = target.GetVertex(loop.Vertices[k]); int mesh_vid = meshSpatial.FindNearestVertex(vCurve, search_dist); mesh_verts.Add(mesh_vid); } int NT = target_verts.Count; // find the paths to assemble the edge chain // [TODO] need to filter out junction vertices? or will they just handle themselves // because they can be collapsed away? List <int> vert_seq = new List <int>(); for (int k = 0; k < NT; k++) { EdgeSpan e = find_edge_path(mesh, mesh_verts[k], mesh_verts[(k + 1) % NT]); int n = e.Vertices.Length; for (int i = 0; i < n - 1; ++i) { vert_seq.Add(e.Vertices[i]); } } // now it's easy, just add the loop constraint EdgeLoop full_loop = EdgeLoop.FromVertices(mesh, vert_seq); MeshConstraintUtil.ConstrainVtxLoopTo(cons, mesh, full_loop.Vertices, curveTarget, set_id); } r.FastestRemesh(); TestUtil.WriteTestOutputMesh(mesh, "curves_test_out.obj"); }