Weld command for subD and meshes based on a float distance

The TLDR version; Feature request: A weld command for subD and meshes based on a float distance.

SubDs are a great addition! Very glad they’re coming to Rhino! If the following is already a feature, please correct me! I’d love to use it. Proposed feature:

A subD and mesh command to weld selected subD or mesh vertices based on a user-specified float distance.

If distance is 0, only coincident vertices are welded (just like the current weld command, except weld doesn’t work on subD yet). Any selected vertices beyond this distance are silently ignored. The location of the new welded vertex is the average for all vertices in each respective search distance set. This is how Maya’s merge (MEL: polyMergeVertex) command works, or the Fuse node from Houdini.

It’s extremely useful for everyday edge/box polygon and subD modeling when set to 0. You can just snap two or more vertices together, box select them (and a bunch of others) one click and you’re done! If you select only 2 vertices, the distance is assumed to be infinite and the weld always happens. Any vertices beyond the distance are silently ignored. Any garbage in your selection that isn’t a vertex - ignored. A cool option would be only considering vertices along a naked edge, but this should be optional.

Why it’s useful:
It’s very useful for dealing with dense 3D scan data, or after breaking a model up into logical parts for things like UV mapping, deforming, and merging things back together or when doing cleanup work, i.e. dealing with downloaded not-so-water-tight meshes, mirroring a mesh with vertices that don’t all fall on the symmetry axis, etc.

The existing ‘WeldVertices’ command doesn’t give you a distance tolerance, and even for coincident vertices, it doesn’t work on subD. The Join command welds only coincident vertices for subD, but only when joining two separate subD objects. i.e. you can’t join two edges/vertices from the same subD (pictured) even if the result still be a valid subD. The stitch command does this, but requires that you select edge sets and will fail if anything in the selection cannot be stitched or the selection sets are of unequal length, etc.

Currently, you have to use stitch, select one edge set, select another edge set, stitch it, then you have to run _RemoveCrease and select the resulting edge set again. For non-trivial models with non-trivial topology this is intractable.

Weather you have 2 or 20,000 edges to join in a 3D scan of some no-edge-loops-in-sight geometry - the distance based solution works nicely. If a face collapses because the merge distance is too great, it’s my problem, I’ll deal with it.

R-Tree me! Anybody? Pretty please?!
-Kurt-

2 Likes

Hi Kurt.

I’d say the command Alignmeshvertices does what you need. Or am I missing something.

http://docs.mcneel.com/rhino/5/help/en-us/commands/alignmeshvertices.htm

-Willem

AlignMeshVertices doesn’t work for subD objects. If you try to use it on a subD object anyway and use the select mesh edges mode, Rhino will hang upon selecting the first edge, as of build: (7.0.20042.9575, 2/11/2020). Sorry if the image above is misleading, those are subDs showing their edit cages, not in smoothed mode but the same workflow should apply to both.

Unless I’m missing a command or better workflow (and I certainly could be!) in the example picture above there’s no simple way to smoothly merge those two edges/verts that doesn’t involve at least 9 mouse clicks and 2 different command invocations:

  1. Click stitch button.
  2. Click first vertex or edge on the left.
  3. Right click to accept.
  4. Click second vertex or edge on the right.
  5. Right click to accept.
  6. Right click to accept.
  7. Click remove crease button.
  8. Select the creased edge.
  9. Right click to accept.

This is for a very simple case. For more complex geometry or for doing this all day long it’s just not intuitive. I would write a tool to do this, but it’s such a common thing from the polygon/subd modeling word I think it would be a commonly used feature. Getting a smooth, crease free stitching/merging/weld, whatever you want to call it, should be 2 clicks, max: Box select, click the button. Done.

-Kurt-

All mesh operations should work on SubD cages. I don’t understand why that’s not happening.

What if for now you ExtractControlPolygon from the subD, run AlignMeshVertices, then Covert ToSubD again? Would that work?

Using ExtractControlPolygon, then AlignMeshVertices, then ToSubD almost works (see below), but if we’re looking at making the future Rhino 7 subD modeling experience pleasant, we’re getting even less intuitive. E.g:

  1. Click to select the SubD object.
  2. Click (or type) ExtractControlPolygon.
  3. Click to select the original subD object.
  4. Press Delete key.
  5. Click (or type) AlignMeshVertices.
  6. Click SelectVertices mode.
  7. Box drag a bunch of vertices.
  8. Right click to accept.
  9. Set your distance or right click again to accept.
  10. Click to select your mesh object.
  11. Click toSubD.
  12. Click DeleteInput to delete the mesh object.
  13. Right click to accept.

This is a 13-step process to merge 2 vertices.

AlignMeshVertices also doesn’t quite behave how you’d like it to in that it aligns the mesh vertices to the first vertex in the selection list, not the average position of each vertex within overlapping search distances. As a special case, if we’re trying to align just two vertices, requiring the user type in a distance to adjust shouldn’t be necessary at all.

You guys have posted good work-arounds, but a 2-click bespoke feature would be better and generally useful to many.

-Kurt-