Rhino 9 Feature : G2 continuous patches

TL;DR

Rhino 9 WIP has a new command FillSrf. This command takes a set of curves and surface edges to create a multi-sided patch with positional (G0), tangential (G1) or curvature (G2) continuity to selected surface edges. The command refines the surface in places where the constraints are not met. This command produces better results than the existing Patch command: better conformation to input curves, allowing the patch to be joined without naked edges, better surface smoothness and up to G2 continuity, where Patch only does G1.

Command Options

During curve selection

  • Continuity - choose Position(G0), Tangential (G1) or Curvature (G2), this continuity constraint is applied to surface edges. G0 is applied to all normal curves, there is no need to change it while selecting a normal curve. By typing 0, 1 or 2 the continuity is quickly changed.
  • Use Ctrl+Click, or Ctrl+Window-Select to deselect curve(s)

Options

  • Tolerance (number) - the positional tolerance at the curves selected, defaults to the document tolerance
  • AngleTolerance (number) - the angle tolerance in degrees, defaults to the document tolerance
  • Preview (yes/no) - show a preview of the surface
  • Advanced - show advanced options, for most situations these can stay unchanged
    • DegreeU, DegreeV (integer) - the degree of the surface (default 5)
    • SpansU, SpansV (integer) - the number of initial spans (default 1)
    • Stretching, Bending, RocBending (number) - the ratio of first, second and third derivatives in the energy functional. Defaults to 0, 0.3 and 0.7. Stretching is best kept at 0.
    • Refinements (integer) - the maximum number of refinements done to attempt to match the input curves at the requested continuity.
    • Domain - choose from Molded (default), Projected, or Untrimmed. This option determines how the parameter domain is created based on the 3d arrangement of the input curves: Projected is a single step projection of the input curves to the best fit plane, while Molded takes this projection and applies the input curves constraints in a number of steps, drawing the surface closer to the curves in each step. Conceptually similar to deep drawing of metal sheets. In case 4 curves are selected that form a closed loop, the Domain defaults to Untrimmed and the result will be an untrimmed NURBS surface. You can make another choice for the domain if you want though, to create a trimmed patch.

Examples

In addition to the examples introduced with MultiSidedPatch (see below), the FillSrf command is able to make more complex patches, like in the following three examples:


fillsrf-example-1.3dm (154.5 KB)


fillsrf-example-2.3dm (246.4 KB)


fillsrf-example-3.3dm (215.3 KB)

This third example shows the untrimmed option for the two four-sided patches, while the corner is created with the aid of the two curves and manual trimming.

//
multisided-example-1.3dm
multisided-example-2.3dm
multisided-example-3.3dm

More details

The modeling is based on treating the NURBS surface as a thin membrane with elasticity and internal strain under bending. This is captured in an "energy" that the surface has, and the algorithm minimizes this energy while complying as much as possible to the positional, tangential and curvature constraints applied. This approach is also known as *variational surfacing* and is similar to what the XNurbs plug-in uses.

Future developments

Caveat: the command is under development and its options and result may change without notice.

  • “your wishes here” - let us know what works and what needs improvement
  • Internal curves, points and normals as constraints
    • While it is currently possible to select curves that do not form a closed loop, the results may vary and no trimming is applied.
  • A more interactive user experience
    • ability to change continuity during the command, currently continuties that are chosen at the start cannot be changed
    • ability to add and remove curves during the command
    • a dialog with command options
  • History support RH-86002 :white_check_mark:
  • Grasshopper suppport RH-86003
  • Automatic closed loop detection RH-86006
  • Starting surface input RH-86009

But what about MultiSidedPatch?

MultiSidedPatch, introduced in November 2024, aims to do the same but has a number of shortcomings that FillSrf does not have:

  • MultiSidedPatch is only G1 continuous and it turned out to be difficult to get it to G2
  • MultiSidedPatch works best on convex curve assemblies, while FillSrf has more advanced parameterization that allows concave curve assemblies as well
  • MultiSidedPatch used the old Patch nurbs fitting, which suffers from the same drawbacks as the Patch command.
  • FillSrf has the option to select curves that do not form a closed loop
  • FillSrf has the option to select internal curves and points
  • The modeling approach used in FillSrf is hopefully versatile enough to improve other surface modeling commands, like fillets, blends and matching.

It is likely that MultiSidedPatch will be removed in favor of FillSrf before v9 is shipped.

57 Likes

Great :+1:

1 Like

This is amazing.:slight_smile:

1 Like

I see that the latest WIP release is not yet done (I thought it was) - you’re welcome to try out the command in the 9.0.25035.12305 | 4 February 2025 version, just know that a few features and one bug were fixed that will come in the next WIP version.

1 Like

Already great tool , plus this :+1::partying_face: Fingers crossed !!

Wait, so McNeel started not just one but two efforts to replace Xnurbs?

I really hope there’s at least 3 efforts running in parallel internally to replace VSR then. :wink:

Does this have History support?

3 Likes

I added your request for history support https://mcneel.myjetbrains.com/youtrack/issue/RH-86002

4 Likes

Hi @menno
Just ran a few quick test and it looks great! I’m sure there will be things to iron out along the way, but looks to be a GREAT addition to the Rhino toolbox! Well done :muscle:
Regards, Jakob

2 Likes

This is incredible! The command will simplify my workflow.(if you are making it available in the Rhinocommon API) Good job!

It will come to the RhinoCommon API, but we’re first getting some experience with that API ourselves before it goes public. You can always script it from RhinoCommon with RhinoApp.RunScript(...).

1 Like

My needs:

  • Internal curves, points and normals as constraints/targets as in Patch.
  • Curves as surface boundaries in addition to surface edges.
  • Options to specify a starting surface as in Patch.
  • Option for “none” continuity to selected edge curves.

I model boat hulls based on “lines and offsets” or scan data using Patch. The goal is a surface which fits the input data.
_ A set of edge curves define the perimeter of the surface,
_ Internal curves and/or points are targets for the surface. A initial starting surface is created.
_ Patch is used to fit the starting surface to the data.
This can be an iterative process. The result of the previous iteration is modified by adding knots to improve the fit and removing knots where not needed, and the modified surface becomes the starting surface for the next iteration.

Let’s hope that at least we won’t be forced to use third-party plug-ins to create better surfaces for patches.

@davidcockey

  • Internal curves and points are coming in the next WIP release.
  • Selecting normal curves (not surface edges) as boundaries is coming in the next WIP release (it may already be in the 4-FEB release, I’m not sure).
  • Specifying an input surface: added RH-86009
  • Per-curve continuity input (G0/G1/G2) is in the next WIP release; I’m assuming that your “none” continuity is the G0 positional continuity?

How do you see yourself specifiing normals as constraints, as you mentioned in the first point? It can be done by selecting a surface edge and using G1 continuity, but maybe you mean something else? I have been thinking about using lines that give a positional and normal constraint: the line direction.

@menno One thing I find very useful is to constrain the patch to points or internal curves that follow the direction I want to take.


sorry, I saw that the radio can be heard in the audio while I was recording

2 Likes

Hi -

As Menno wrote, that will be available in the next public WIP.

-wim

5 Likes

No, free floating similar to the “None” options for “Preserve other end” in Match and MatchSrf.
The situation is the desired surface is not along a portion of its boundary.

Example:

3 Likes

History support is coming in the next WIP.

3 Likes

Ignore the “normal” part of my request.

1 Like

I see this as a built-in “xNurbs”, is that right?