SubD to Nurbs G0 continuity problem

Yes G0 :smiley:

‘Cx’ an also be used to describe continuity - in fact it seems to be more prevalent than ‘Gx’ in most places. Even in RhinoCommon… But as far as I know, they are not quite the same, there are subtle mathematical definition differences.

1 Like

I allways wondered this: is C0, 1, 2, … completely synonymous to G0, 1, 2,…?
Or are there small differences similar to for instance between F-stops and T-stops in photography?
Do you know more about that?

“there are two different notions of what it means to be smooth to kth order. The
first is called parametric continuity, and is written Ck; the other is called either geometric or
visual continuity, and is written Gk or VCk. Parametric continuity means smoothness both of
the curve and of its parameterization”
(from here)

So I believe this would be an example of 2 curves which meet with G2 continuity but not C2, since their parameterizations differ


Just a quick comparism Rhino 7WIP “ToNurbs” to Tsplines to Nurbs:

As I said in another tread: this is the one point were Rhino SubD really falls short of what TSplines could do. The Nurbs Breps Tsplines creates are superior in patch layout, edge continuity and also in the visible surface quality (zebra).
Especially the star points in the Rhino conversion seem to be problematic.

Wow, thank you very much!
That makes sense and is easy to understand without diving too deep into the mathmathics behind it.

These edges should be G0 since they are position only (Hard edges)

Is that what you refer to? If so then that is as expected.

1 Like

No, those edge are ok. I refer to the other edges

1 Like

G0 = continuous
G1 = G0 + tangent continuous
G2 = G1 + curvature continuous.

Rhino SubDs are Catmull Clark subdivision surfaces. Below “subd” means Catmull Clark subdivision surface.

For every interior point on a smooth subd edge, the subd is G2.
At an ordinary smooth vertex (4 faces and 4 smooth edges), the subd is also G2.

At smooth exceptional vertices (also called “star points”) the subd is G1, but often is not G2.

In many cases, the corners of subd faces at exceptional vertices are not even NURBS surfaces. This is a well known issue with Catmull Clark subdivision surfaces. As a result, ToNurbs is forced to approximate the subd surface at exceptional points. Chuck has done the hard part of getting a smoother NURBS approximation at exceptional vertices and this will be added to ToNurbs in the near future. In addition, we have finished developing the tools to automatically group subd quads into large grids that can become a single face in the ToNurbs brep and an option to make fewer and larger brep faces will be added to ToNurbs in the near future.

Zebra analysis is created by rendering a simple environment map on a polygon mesh approximation of the brep or subd. Away from the NURBS surface bispans touching exceptional points, any Zebra visualization issues are mesh rendering artifacts. You can run the Zebra command on the subd itself to get a better idea of the subd surface shape. (The mesh used for Zebra display on subds is a very regular quad mesh, the meshes on breps are often more ragged.) You may use the ExtractAnalysisMesh command to see the mesh being used to create the Zebra image.


Setting 0.2 for Tangency and Curvature is too tight a tolerance for Sub-D. 0.5 will be good enough.

In fact the problematic areas are at the starpoints.
The TSplines conversion has some problems too, but to a lesser extend.
The biggest advantage for Tsplines lies in its simplyfied patch layout, resulting in fewer surfaces.

From what I understand the secret sauce in the Tspline to NURBS conversion was a sub divide face exact operation done 5 times before conversion. If you look at the output of this operation in Tsplines you’ll see the extra Isoprams added from the sub divide. This would of course only happen on Tsplines with star points. Single spans were never sub divided.

The result of the 5x sub division was to reduce the impact/span of the discontinuity at the star point by a factor of five, perhaps to below the mfg tolerance. It had the added (bonus?) factor of making the To Nurbs operation a one way street, with the output way more messy than the Tspline it was based on. I did like this from a source protection/process reverse engineering point of view.

Good to hear SubD ToNurbs will have smaller face number count


I nearly missed that bit. Excellent!

@patrick_n - There are topology techniques to refine the shape. I have found that refining the shape around star points can help mitigate some of the area around the star. Inserting an edge or two around the area can help refine reflection lines.

I think we need some more explanations of the theory behind subD surfaces and their curvatures.

McNeel and others have done extensive tutorials and explanations for how curvature works with nurbs curves. There seems to be some similarity between how that works and how subD works.

Things I’d like to know more about:

-the mathematics/theory of how many segments a subD pipe needs before it gets indistinguishably close to circular (the rhino command for SubD pipe gives 8 segments for a reason, right?)
-how the math of the pull of wires on each other works
-how this relates, as an analogy, to control points on nurbs curves
-how ngon faces complicate things

I’m sure there’s more beyond this. I’m figuring out certain rules as I go, and as I experiment, but I’m not a mathematician or particularly well educated in geometry or how it all works under the hood, and a professional explanation/tutorial would be very useful.


@dalelear this one is for you!


The Rhino SubD Rules document that explains the mathematics of RhinoSubD surface evaluation.

I’ve added a reminder for me to write a document that clearly explains Rhino SubD surface continuity. Here’s a very brief sketch.

G0 = continuous (no gaps)
G1 = G0 + tangent continuous (no creases)
G2 = G1 + curvature continuous

Curve examples

Rhino SubD surface continuity:

Points on creased edges are at least G0 but usually not G1.
Points at crease, corner, and dart vertices are G0 but usually not G1.

  • Smooth vertices with 3 edges are G1 but usually not G2.
  • Smooth vertices with 4 smooth edges are G2.
  • Smooth vertices with 5 or more edges are G1 but usually not G2.
  • The interior of every smooth edge is G2.
  • Every quad face is G2.
  • The subdivison point in the middle of a non-quad face (triangle, 5-gon, etc) is G1 but usually not G2. The rest of the face is G2.

In the example SubD shown below. The red points are G1. The rest of the SubD is G2.



hi @dale,

If you trimmed the star point with either the red, yellow, or green circle, and then you patched it with an @XNurbs patch, would you be able to reach smoothness?

How far does the discontinuity of the star-point propagates? (Along the start edges)

EDIT: forgot to upload this…



1 Like

Zero! This is one of those things that math nerds like to drone on about for eons. (Pro tip - don’t invite me to a party.) Something can be perfectly GN everyplace except a single point.

It’s a little easier to think about with curves.

At a subd “star point” it is often the case that the the curvature simply does not exist. But it is alwasy the case that at every single point nearby but not equal to the star point, the SubD surface is G2.

There is at least one serious issue with the approach you suggest. The boundaries of subd object have zero cross boundary curvature. That means you can’t “trim the star point” without modifying the nearby surface location AND having that surface get very flat across the boundary.

Detail from Star Hole.3dm

Star Hole.3dm (308.1 KB)