An Observation about NURBS

Given that the reader probably understands more about the Math of NURBS than I do, the reader will also understand that in general, true NURBS Curves will not touch their control-points. My own earlier misperception of that subject came through the use of the (now-defunct) application ‘TrueSpace’, which arbitrarily labeled objects as NURBS, which were really not that.

It should also be understood, that classic cubic (Bézier) splines are not NURBS either. According to my own understanding, a classical, cubic Bézier spline has as basis-function:

 


v = ( 1 - u )
a = a30u3 + 3a21u2v + 3a12uv2 + a03v3


 

This is different from the basis-function of a NURBS Curve. But for certain types of 3D graphics, an exact curvature and therefore basis function, is not needed.

Given this understanding, a question might arise as to why the actual application “Ayam” is capable of taking an arbitrary CSG-primitive, and converting that into a NURBS-Patch.

ayam_7

And there are really several separate cases, in which this is possible:

(Last Updated 08/29/2017, 13h10 : )

  1. The Order of the NURBS may only be 2, given that the application in question has fully-general Math to work with NURBS. In that case, by default, the position of 1 point along a curve will be determined by 2 adjacent Control-Points, and at one exact parameter-value, will be controlled by only 1 Control-Point. This is a simpler type of NURBS, which will show as straight lines between the CPs, and which touches each CP. It’s useful to convert a Cube.
  2. True NURBS have a Knot-Vector, which states possible repetitions (“Multiplicity”), and Which the application in question does implement. When the Knot has a Multiplicity equal to the Order of the NURBS Curve, it takes over the position of the Curve completely. However, a set of three NURBS Control Points can form a linear, equidistant sequence, with one CP having a Multiplicity equal to the Order minus one. The two NURBS CPs that form the endpoints can correspond to the ICurve Handles, while the NURBS CP in the middle can correspond to the ICurve CP. What will happen is that the NURBS Curve will touch the CP in the middle, but not the ones at the ends. This is similar to how a circle is formed, with an Order of 3.
  3. As an example of the type of spline described in item (2) above, if the Order is 4 – implying a cubic spline – and if it has its minimum of 4 ICurve Control Points, then the corresponding NURBS Curve will have 10 Control Points, and a Knot-Vector of { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3 } . Please bear in mind that in general, the Knot-Vector may be scalar-multiplied by an arbitrary constant, and have the same meaning. ‘Ayam’ tends to scale its -Vectors such, that their range is [ 0.0 … 1.0 ] . Either way, the range corresponds to the range, which the continuous parameter needs to traverse, until the entire Curve is drawn.
  4. A NURBS-Surface – i.e., a -Patch – is a special case derived from a Curve, that has the two parameters U and V, where a Curve only used to have one parameter. The CPs are sometimes conceived to form a grid with rectangular topology. It seems entirely plausible to me, that the Order along U may be different from the Order along V, and then having a linear Order along one parameter, may be the correct way to convert a Cylinder or a Cone. In that case, a Disk may simply be a special case of a Cone, where one parameter forms a circle, and the other, linear parameter defines either the radius or the height – with a single CP defining either the center or the vertex.
  5. Most plausibly, if the NURBS-Patch is to have a different Order along U from its Order along V, it should also have two separate Knot Vectors.

‘Ayam’ is an application that will allow its users to edit the Knot-Vector manually, if we switch to the “Custom” Knot-Type. However, if we’re experimenting with this randomly, we may easily create Knot-Vectors which the Ayam can’t render, thereby resulting in some error messages. Finally, I was able to implement my above idea in full:

ayam_8

This screen-shot actually reveals that ‘Ayam’ is not always able to determine what the correct increment is, of its parameter, for the Curve always to appear smooth. However, because this application’s preview panels are just that, and because final rendering is meant to be performed by an external renderer, I don’t mind.

The WiKiPedia article explains, that in order for a 3rd-order NURBS Curve to form a circle, its Knot-Vector should be:

wiki_nurbs_1

But the same article also explains,

“For the purposes of representing shapes, however, only the ratios of the difference between the knot values matter; in that case, the knot vectors (0, 0, 1, 2, 3, 3) and (0, 0, 2, 4, 6, 6) produce the same curve.” (Both quotations from 08/29/2017. )

So while it may have been important to prove the above Knot-Vector, in ways that involve the constant π, according to the same reference, the entire Knot can be multiplied by ( 1 / 2π ), revealing a linear spacing between Knot-Values.

In my own example with 4th-order NURBS Curves, my only aim was that the handles around each control-point, that would have corresponded to a12 and a21 in the case of a Bézier spline above, and which I tend to denote with the character H, form working handles around each control point, which I tend to denote with the character P. I never aimed to prove that the resulting NURBS Curve forms an exact geometry.

Dirk

Continue reading An Observation about NURBS