SubDMatch: A new command to match SubDs to other Rhino objects

Have you ever wanted to have more control over the shape of a SubD boundary? Have you ever wanted to match a SubD to some degree of continuity to other Rhino objects?

We are excited to share SubDMatch, a new test command in Rhino that matches a chain of SubD boundary edges to another Rhino curve or surface. Supported target geometry types include NURBS curves and surfaces, BReps, and SubDs. The command offers support for position and tangency continuity.

Want to try it out? Download the latest version of Rhino 9 WIP for Windows or MacOS, and type SubDMatch to take this command for a spin. If you would like to learn more about it, consider taking a look at this video with an overview of how the command works (watching at 1.5x speed recommended).

Please note that SubDMatch is in active development in the latest WIP and that it may still have plenty of rough edges. However, we are looking forward to receiving your feedback as we continue developing it towards a fully-fledged command in Rhino 9.

Command options

  • ReverseTarget: Flip the orientation of the target curve or a surface/BRep/SubD boundary.

  • MatchLocations: The command works by solving a point-wise matching problem: we move the SubD vertices on the boundary somewhere along the target. By setting the MatchLocations options, you specify where the boundary SubD vertices will go.

    • ClosestPoints: Moves the SubD vertices to the points on the target that are at the shortest distance from their initial position.
    • UniformParameters: Takes the parameter domain of the target curve/target boundary on a surface/BRep/SubD, and samples n points on the curve that are equidistant in parameter space. Here n is the number of vertices in the picked SubD boundary. For example, if the matching SubD boundary is open and contains 4 vertices, and the curve to match is parametrized in the domain 0 to 1, then the 4 points the command will pull the SubD vertices to will be located at parameters t=0, t=1/3, t=2/3, and t=1 on the target curve.
    • EditPoints*: Moves the SubD vertices to the edit points (the points you get by evaluating a curve at the Greville abcissae) of the target curve / target surface/BRep/SubD boundary.
    • Knots*: Moves the SubD vertices to points of the target evaluated at the knots of the target.
      *EditPoints and Knots are only available under certain conditions, see below for more details.
  • MatchTangents: Match the tangent vectors evaluated at the chosen MatchLocations on the target curve or boundary.

  • Bulge: This number controls the distance between the first and second rows of SubD control points that result while performing a tangency match. The allowed bulge factors are clamped between 0.1 and 5.

  • FlipTangents: Reverses the orientation of the tangent vectors on the target curve or boundary.

Tips and tricks

Some conditions will greatly help SubDMatch to achieve more accurate matches, here are a couple of tips to do that:

  • In the choice of MatchLocations, selecting EditPoints or Knots will normally produce tighter matches. However, these options will only be available if and only if the number of edit points or knots in the target object is equal to the number of vertices in the selected SubD boundary.
  • SubDs can approximate best a limited subset of NURBS objects. Oversimplifying, SubDs “are” BReps made of degree 3 NURBS surface patches. Therefore, trying to match a degree-7 polysurface is never going to produce a watertight match. Rhino commands like MakeSubDFriendly and Rebuild can help you create simpler objects before running SubDMatch.

Known limitations

The SubDMatch command will produce fairly inaccurate matches or won’t work at all in any of these cases:

  • For position matching:

    • In the presence of edges with weighted creases connected to the matching boundary of a SubD.
  • For tangency matching:

    • If all the faces next to the matching SubD boundary are not quads (i.e. if there are triangular or ngon faces next to the boundary).
    • In the presence of any creased vertex on the matching chain of SubD boundary edges, with the exception of creased vertices located at the start or end of an open chain.

We are working hard to reduce the size of this list by adding support for the abovementioned cases :slightly_smiling_face:

SubDs have zero cross-curvature at the boundaries (at least the Catmull-Clark SubD type that Rhino implements). Therefore, curvature continuous SubD matches (like in the MatchSrf command for NURBS) are not possible.



Super exciting!

1 Like

We hope you find the command useful, @martinsiegrist!

crazy stuff!!

1 Like

(1) would be great if the command options (tangent check box) are saved.

did a fast test with a corner for chamfer of a box

ToNurbs with G1xx

TestSubDEdgeMatch.3dm (3.6 MB)

(2) for more complex stuff, it would be great to have some optional kind of “matching / align guides”, input point to point… (vertex to target)

(3) I see a great potential not only in the combination SubD Nurbs but also just in more easily define some subD conditions or even more like a constraint.
are inner matches supported ? - this would be a great benefit
similar to this older topic
and if seen more as a constraint then a match - i would love to see history - support


This is a great example, @Tom_P! We only offer support for matches along the boundary edges of a SubD at this time. However, we do plan to support history for this command and to store the command settings of the last run, so please stay tuned for an update. Thanks for your feedback!


Great feature! And thanks for the detailed explanation.

A suggestion if it’s going to take until Rhino 9 to be a standard feature:

Put a UI opt-in flag in Rhino to allow accessing it as
SubDEdgeMatch (without the ‘Test’)

(Also in API’s including scripting)

Reasoning: this will be pretty widely used even while it’s an experimental feature, so it would be nice for early adopters, devs and scripters, to not have a problem for themselves or their users when it goes live and the name changes.

1 Like

Did you check this link ?

Alias has a command called

which seems to make a lot of sense / has a lot of power.

please consider inner edge match to curve - wether it s the same underlying algorithm or closer to align - command

1 Like

Thanks for the pointer to the topic, @Tom_P! The topic is on our radar. Will do our best to add support for interior SubDs edges sometime, but can’t promise just yet. I hope though that you find TestSubDEdgeMatch useful to match SubD boundaries to other objects in the meantime :slight_smile:

Hi Rafael @pastrana
Thanks a lot, this is very great.

As this is a Test command, slated for R9, Are we still going to have access to it [the Test Command] once R8 is released ?

Or will it move from WIP8 to WIP9 and get removed from the released version? [I hope not]

thanks a lot

1 Like

This is our current plan. The command would be removed from Rhino 8 once a Rhino 9 WIP is available. Development would continue in the Rhino 9 WIP, but as a real command.


Hi,I downloaded the latest WIP TestSubdEdgeMatchbut it doesn’t show up in the command line.

It’s a test command, try typing the whole name: TestSubDEdgeMatch



Hello Rafael,
your tool is fantastic, congratulation, very very useful!
Is it also possible evolve it to generate N-sided surface whit perfect G2 continuity inner and at the boundary edges. Look the images, please.


1 Like

could you post that file?

G2 continuity with SubD is probably not going to happen, because SubDs always have 0 cross curvature on their boundary. We would need a way to trim SubDs to be able to control curvatures on SubD boundaries.

For generating the patch layout, we are thinking about it for future improvements to SubD commands.

If you already have the patch created without the boundaries matched up, and an exact solution to the multi-edge G1 tangency problem exists, you should be able to find that solution by repeating the SubDMatch command for each boundary side. If there is no exact solution (for example because target tangent directions are not compatible around a corner), then applying SubDMatch repeatedly won’t work because you would risk loosing G0 continuity on an edge when matching the nest one for G1 continuity.

hi why? TestSubDEdgeMatch cannot run in Rhin8 Today update


Hi -

As was stated earlier in this thread, this is something that will be further developed in Rhino 9.

1 Like

This feature will be available as SubDMatch in Rhino 9. The Rhino 9 WIP should be available for download in the coming weeks.