Path: utzoo!news-server.csri.toronto.edu!cs.utexas.edu!usc!rpi!batcomputer!llenroc!cornell!klassen From: klassen@gvax.cs.cornell.edu (R. Victor Klassen) Newsgroups: comp.graphics Subject: Re: Bezier Surface Patches -> NURBS ?? Message-ID: <53133@cornell.UUCP> Date: 15 Mar 91 15:40:07 GMT References: <1991Mar14.225606.26325@news.nd.edu> Sender: nobody@cornell.UUCP Reply-To: klassen@gvax.cs.cornell.edu (R. Victor Klassen) Organization: Cornell Univ. CS Dept, Ithaca NY Lines: 28 What you need to do is convert from Bezier surface patches to ordinary B-spline patches. Then use a 1 as the w (homogeneous) coordinate of every control point, and voila - you have a uniform rational B-spline patch. This is a special case of a non-uniform b-spline, (NURBS) so you're there. In order to do this conversion, find the matrix BZ that takes Bezier control points to monomial form, and the matrix B that takes Bspline control points to monomial form, then apply B BZ^-1 to the control points, first in one (it matters not which) dimension, and then in the other. Do this on a patch by patch basis. To find the matrices, see Farin's book or the Killer B's book (Bartels, Beatty, Barsky), and then use a symbolic manipulation package such as Maple, Macsyma, Mathematica... to compute and invert them. Normally there are some continuity constraints enforced in the NURBS world by overlapping patch control vertices, so that each new patch in a column has only one new row of control vertices. This makes them nice to manipulate, since you never have to worry about inadvertently introducing kinks. In this way a NURBS surface is generally an array of control points, with patches being specified as a subarray of the control points, with overlapping subarrays. Bezier patches, on the other hand, are really arrays in their own right, but can be optionally stored with one row/column overlap to enforce C^0 continuity. Using the above method, you get a large set of NURBS surfaces, one per patch, and they happen to line up as well as the original Bezier surface. If you want to manipulate them, it would be a good idea to put neighbouring patches together, making them overlap as far as possible by checking for control vertices that almost match and then taking (say) their average. Get it working for cubics, and then generalize if you have 7th order; higher orders aren't much harder, but it's easier to see what's going on.