Next Previous Contents

5. NURBS Modelling Tools

This section describes NURBS curve and surface related modelling tools of Ayam.

Note that pressing the <F1> key in tool dialog windows can be used to directly jump to the appropriate sub-section of this part of the documentation.

5.1 General Remarks

All NURBS modelling tools are accessible via the "Tools" menu of the main window or the toolbox. In addition, there are also corresponding scripting interface commands. See sections Manipulating NURBS Curves and Manipulating NURBS Surfaces.

Many modifying tools work on multiple selected objects and execute the selected operation on all those selected objects in the order of their appearance in the current level.

Tools that take only NURBS curves or only NURBS surfaces from the selection will warn if the selection contains objects of unsuitable type, but processing will continue regardless.
In case of an error, however, the processing of multiple selected objects immediately stops, possibly leaving modified and unmodified objects behind.

If an operation executed successfully on an object, the point selection may be removed from the object.

The notification of the selected objects will be run immediately after the tool operation. The notification of the parent object(s), however, will be run after processing of all selected objects finished (for more information on notification, see also section The Modelling Concept Tool-Objects).

Tools that create tool objects may use the clipboard to move the new children around, i.e. the clipboard contents may be lost afterwards.

Most tools open a dialog window where additional operation parameters can be adjusted, see also the figure below.

Tool Dialog Example

The "Ok"-button starts the tool and "Cancel" just closes the dialog. Furthermore, the currently set parameters can be tried using the "Preview" button.[∗] A successful preview will be signaled by a green tick mark on the button, a failed preview (e.g. caused by unsuitable parameters) by a red exclamation mark. Note, that the meaning of the "Ok"- and "Cancel"-buttons change, when a preview was generated (green tick mark present). In this case, "Ok" simply closes the dialog and "Cancel" restores the selected objects to the state before the dialog opened. Also note, that repeated use of preview just starts the tool again on the selected objects in their original state.
If the tool parameters are changed, after a successful preview was generated, the green tick mark will change to a question mark.[∗]

5.2 Curve Creation Tools

These tools create parametric curve objects.

 

Circular B-Spline Tool

B-Spline Curves Created by the Circular B-Spline Tool

Arguments

Radius, Arc, Sections, Order.

Operation

This tool creates a non-rational B-Spline curve with Sections+1+Order (Arc=360.0) or Sections+1+(Order/2) (other Arc values) control points in the XY-plane. The control points are arranged in a circle of the given radius, centered around the origin. This gives the curve a circular appearance (see image above) but it is not a true circle: If only few control points are used, the radius of the circular curve is clearly smaller than the specified radius value (see the left curve in the image above). Furthermore, shape, parameterisation, and curvature of the B-Spline curve are not exactly as one would expect from a circle. To create true circular curves, the NURBCircle tool (see below) should be used instead.

Notes

Sections must be at least 1.

If Arc is 360.0, the first n control points of the new curve will be identical to the last n (where n is Order-1). Compare the left and middle curves in the image above which are of order 4 and 2 respectively, the first having 3 and the latter just having 2-1=1 equal control points. If Arc is 360.0, the curve will also be marked periodic and the generation of multiple points will be enabled, so that point edit actions know that they may need to move two points (see also section Multiple Points).

If Arc is smaller than 360.0, the curve will be open, and, as is natural for a B-Spline curve, will not interpolate the first and last control points unless the order is 2 (see the right curve in the image above, which was created with an arc value of 180.0, 10 sections, and order 4).

 

NURBCircle Tool

A NURBS Circle

Arguments

Radius, Arc.

Operation

The NURBCircle tool creates a circular NURBS curve of desired radius and arc in the XY-plane, centered around the origin (see also the image above). The order of the curve will be 3. The number of control points used differs according to the arc, e.g. 9 points for full circles, 5 for half circles, 3 for a quarter circle.

Notes

The NURBS curve created by the NURBCircle tool is rational (uses weights). This means, editing the curve (e.g. moving control points) may lead to unpredicted results (the curve does not behave exactly as wished). If the curve is to be modified further, a closed B-Spline, created with the Circular B-Spline tool (see above), should be used instead. Additionally, the created curve will be marked as closed and the generation of multiple points will be enabled, so that point edit actions know that they may need to move two points. See also section Multiple Points.

A NURBS circle created by this tool can be used to easily create a NURBS torus by moving the circle along X a bit and then revolving it. The amount of movement determines the radius of the torus, whereas the radius of the circle determines the thickness.

 

Rectangle Tool

A Rectangle

Arguments

Width, Height

Operation

The rectangle tool creates a non-rational, piecewise linear, planar, centered NURBS curve of rectangular shape and twice the specified width and height in the XY-plane (see also the image above).

Notes

The created curve will be marked as closed and the generation of multiple points will be enabled, so that point edit actions know that they may need to move two points. See also section Multiple Points.

 

TrimRect Tool

A TrimRect

Arguments

The TrimRect tool takes the selected NPatch objects (or NPatch providing objects[∗]) from the selection. If the current level is inside a NPatch object, the respective parent object is used.

Operation

For each selected patch, the TrimRect tool creates a non-rational, piecewise linear, planar NURBS curve of rectangular shape in the XY-plane, that fits in the (u, v) parameter space of this NURBS patch, for use as outer trim curve. See also the image above, depicting a rectangle for a NPatch defined on the knot intervals
0.0, 0.0, 1.0, 1.0
and
0.0, 0.083, 0.16, 0.25, ... , 0.75, 0.83, 0.916, 1.0.

The created curve will be marked as closed and the generation of multiple points will be enabled, so that point edit actions know that they may need to move two points. See also section Multiple Points.

If a NPatch object is selected, the new curve will be linked as child of this NPatch object. Otherwise it will be linked to the current level.

The "CreateAt" and "CreateIn" options are ignored.

See section Trim Curves for a more detailed discussion of trim curves and how to use the rectangular curve created by the TrimRect tool.

 

Tween Curve Tool

Tweened Curve (white) from two Parameter Curves (blue) with r = 0.5

Arguments

The tween curve tool takes two NURBS curves from the selection and requests a parameter r. In addition, an append option can be set.[∗]

Operation

The selected NURBS curves will be interpolated (tweened) and a new curve incorporating features from both of the original curves will be created. See also the image above. The parameter r defines the ratio of influence of the first and the second curve (the latter is using a ratio of 1 - r).

|-NCurve1             |-NCurve1
|-NCurve2     ==>     |-Tweened_Curve(NCurve)
                      |-NCurve2
If a third curve is selected, the parameter r is ignored and this third curve defines the ratio of influence with its y coordinates. Unless the append option is set, the new curve will be created after the first curve.

Notes

The two curves must be of the same length and order. They need not be defined on the same knot vector, however.

The interpolation control curve does not need to be compatible with any of the original curves.

If one of the curves knot vector types is "Custom" or the respective knot vector types are different, the resulting knot vector type will be "Custom" and the knot values will also be interpolated/tweened. Otherwise a matching knot vector will be generated according to the type.

The original NURBS curves will not be deleted by this tool.

See also the documentation of the corresponding scripting interface command tweenNC and the related tool for surfaces Tween Surfaces Tool.

To tween NURBS curve providing objects or incompatible NURBS curve objects, a Script object must be used, as shown in the distributed example scene file "tweenc.ay" and script "tweenc.tcl".

5.3 Curve Modification Tools

These tools modify parametric curve objects.

Unless noted otherwise, PV tags are not supported/modified by these tools.

 

Revert Tool

Revert Tool (l: Original Curve, r: Reversed Curve)

Arguments

The revert tool takes all NCurve, ICurve, ACurve, NCircle, and ConcatNC objects from the selection. In addition, plugin defined curve object types can support the revert operation.[∗]

Operation

The direction of the selected curves will be reversed. This tool also reverts the relative knot distances of NURBS curves so that for example a NURBS curve defined on the (asymmetric) knot vector
[ 0 0 0 0.75 1 1 1 ]
will get the new knot vector
[ 0 0 0 0.25 1 1 1 ]
after reversal. This ensures that the shape of a NURBS curve does not change during reversal. Interpolating and approximating curves may change their shape as the underlying interpolation/approximation algorithms are not direction-invariant.
For interpolating curves, the end derivatives are also reversed properly.

Notes

The revert tool can be conveniently invoked from view windows using the keyboard shortcut <!> (exclamation mark).

Eventually selected points will still be selected after this operation.

See also the documentation of the corresponding scripting interface command revertC and the related tools for surfaces Revert U Surface Tool and Revert V Surface Tool.

 

Open Tool

Open Tool (l: Closed Curve, r: Opened Curve)

Arguments

The open tool takes all NCurve, ICurve, ACurve, and ConcatNC objects from the selection. In addition, plugin defined curve object types can support the open operation.[∗]

Operation

The curves will be opened. For closed NCurve objects, the last point will be moved away from the first (multiple end points will be managed correctly), see also the image above.

For periodic NURBS curves, the last p points will be moved away from the first p (where p is the degree of the curve).

For ACurve, ICurve, and ConcatNC objects the "Closed" attribute will be cleared and no control points will be modified.

Notes

The open tool can be conveniently invoked from view windows using the keyboard shortcut <(>.

See also the documentation of the corresponding scripting interface command openC.

 

Close Tool

Close Tool (l: Open Curve, r: Closed Curve)

Arguments

The close tool takes all NCurve, ICurve, ACurve, and ConcatNC objects from the selection. In addition, plugin defined curve object types can support the close operation.[∗]

Operation

The curves will be closed. For NCurve objects the last point will be made identical to the first, however, this does not guarantee a closed curve shape unless the knot vector is clamped, see also the image above.

For ACurve, ICurve, and ConcatNC objects the "Closed" attribute will be set and no control points will be modified.

Notes

The close tool can be conveniently invoked from view windows using the keyboard shortcut <)>.

To close a curve with a fillet, the ConcatNC tool object can be used instead of this tool, see also section ConcatNC object.

See also the documentation of the corresponding scripting interface command closeC.

 

Refine Tool

Successive Application of Refine Tool

Arguments

The refine tool takes all NCurve, ICurve, and ACurve objects from the selection.[∗] In addition, plugin defined curve object types can support the refine operation.[∗]

Operation

The selected curves will be refined by inserting a control point in the middle of each control point interval, changing the shape of the curve. The original control points will not be changed. For periodic NURBS curves, no control points will be inserted in the last p intervals (where p is the degree of the curve), this allows to maintain the periodicity, see also the image below where a periodic curve of length 9 (8 sections) has been refined, resulting in a periodic curve of length 15 (not 17).

Refining a Periodic NURBS Curve

If there are selected points, only the intervals between the first and the last selected point are refined, see also the image below.

Refining a Selected Region

The point selection will be adapted so that the refine tool can be applied multiple times.

Notes

The refine tool can be conveniently invoked from view windows using the keyboard shortcut <#>.[∗]

See also the documentation of the corresponding scripting interface command refineC.

 

Refine Knots Tool

Successive Application of Refine Knots Tool

Arguments

The refine knots tool takes a number of NURBS curves from the selection.

Operation

The knot vectors of the selected NURBS curves will be refined by inserting a knot in the middle of each inner knot interval without changing the shape of the curve. New control points will be added and the position of old control points may be changed in the progress. See also the image above where a curve defined on the knot vector
[ 0 0 0 0 1 1 1 1 ]
is successively refined to the knot vector
[ 0 0 0 0 0.5 1 1 1 1 ]
and then
[ 0 0 0 0 0.25 0.5 0.75 1 1 1 1 ].

Notes

Because new knots are inserted into inner intervals only, the clamping state of the knot vectors does not change. Furthermore, knot vectors of type "NURB" will not change in type, other knot vectors will be changed to type "Custom".

The curve type of periodic curves will not be preserved.

The point selection will be removed from the processed objects.

See also the documentation of the corresponding scripting interface command refineknNC and the related tool for surfaces Refine Knots Surface Tool.

 

Refine Knots With Tool

Arguments

The refine knots with tool takes a number of NURBS curves from the selection and requests a vector of new knot values.

Operation

The knot vectors of the selected NURBS curves will be refined by inserting all knots from the specified vector at once. New control points will be added and the position of old control points may be changed in the progress. The resulting knot vector must be valid, otherwise an error will be reported and the respective curve is not changed.

Notes

Note that the shapes of the curves do not change, but the position of certain control points does.

The point selection will be removed from the processed objects.

See also the documentation of the corresponding scripting interface command refineknNC and the related tool for surfaces Refine Knots With Surface Tool.

 

Coarsen Tool

Successive Application of Coarsen Tool

Arguments

The coarsen tool takes all NCurve, ICurve, and ACurve objects from the selection.[∗] In addition, plugin defined curve object types can support the coarsen operation.[∗]

Operation

Every second control point in the control vectors of the selected curves will be deleted. If the new length of the curve would be smaller than the current order, the coarsen tool will not change anything.

Notes

For periodic NURBS curves the coarsen tool will not remove control points from the first (last) p intervals (where p is the degree of the curve).

For closed curves, the coarsen tool will not remove the last point.

The coarsen tool will also remove knot values from NURBS curves with custom knot vectors.

If there are selected points, only the intervals between the first and the last selected point are affected.

The point selection will be modified so that the tool may be applied multiple times.[∗]

The coarsen tool can be conveniently invoked from view windows using the keyboard shortcut <Shift-#>.[∗]

See also the documentation of the corresponding scripting interface command coarsenC.

 

Elevate Tool

Successive Application of Elevate Tool (Order 3 (left), 4 (middle), 5 (right))

Arguments

The elevate tool takes a number of NURBS curves from the selection and additionally requests an integer value.

Operation

The order of the selected NURBS curves will be raised by the specified integer value without changing the shape of the curve. See also the example image above.

Notes

If the knot vector of the curve is not clamped, it will be clamped automatically. The knot type of the curve will be changed to "Custom". New control points will be added and the position of old control points may be changed in the progress.

The point selection will be removed from the processed objects.

See also the documentation of the corresponding scripting interface command elevateNC and the related tool for surfaces Elevate Surface Tool.

 

Reduce Tool

Reduce Tool (Order 5 (left), 4 (right))

Arguments

The reduce tool takes a number of NURBS curves from the selection and additionally requests a tolerance value.

Operation

The order of the selected NURBS curves will be decreased by one if the shape of the reduced curves does not deviate from the original curves by the given tolerance in any point.

See also the example image above where a curve of order five and length 11, defined on the knot vector
[ 0 0 0 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1 1 1 ],
has been reduced to order four and is now of length seven and defined on the knot vector
[ 0 0 0 0 0.25 0.5 0.75 1 1 1 1 ].

Notes

If the knot vector of the curve is not clamped, it will be clamped automatically. The knot type of the curve will be changed to "Custom". Control points will be removed and the position of old control points may be changed in the progress.

The point selection will be removed from the processed objects.

The ability to reduce a certain curve can be improved by increasing the multiplicity of internal knots first. Furthermore, if the shape of the reduced curve has priority over the distribution of control points suitable for further editing, the curve approximation tool may be able to deliver a result even if curve reduction fails, see section Approximate Tool.

See also the documentation of the corresponding scripting interface command reduceNC and the related tools for surfaces Reduce Surface Tools.

 

Extend Tool

Extend Tool Example (Original Curve (upper), Original Curve and Extended Curve Superimposed (lower))

Arguments

The extend tool takes a number of NURBS curves from the selection and additionally requests a point in space.

Operation

The selected NURBS curves will be extended to the specified point in space without changing the already existing shape of the curves.

The knot vector of the curves will be rescaled to the range [0, 1]. If the knot vector of a curve is not clamped at the end, it will be clamped automatically. The knot type of each curve will be changed to "Custom". A new control point will be added and the position of old control points may be changed in the progress.

Notes

Due to the constraints that only one control point will be added to the curve and the current shape must be maintained, the new curve may form unusual/unwanted big arcs if the new point deviates too much from the tangent in the endpoint of the original curve.

The point selection will be removed from the processed objects.

See also the documentation of the corresponding scripting interface command extendNC.

 

Clamp Tool

Clamp Tool (left: original curve, right: clamped curve)

Arguments

The clamp tool takes a number of NURBS curves from the selection.

Operation

The knot vectors of the selected NURBS curves will be changed using knot insertion so that the first and the last knot have a multiplicity equal to the order of the curve, without changing the shape of the curve. The curve will interpolate the first and the last control point afterwards (unless the weights of those points are not 1.0).

See also the image above, where a curve of length seven and order four, originally defined on the knot vector:
[ 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 ]
has been clamped and is now defined on the knot vector:
[ 0.3 0.3 0.3 0.3 0.4 0.5 0.6 0.7 0.7 0.7 0.7 ].

Notes

The knot type of the curves will be changed to "Custom".

In Ayam versions prior to 1.18 it was an error if the curve was already clamped at either side, this is no longer the case. Furthermore, curves with multiple knots in the end region(s) could not be clamped, this works ok now.

See also the documentation of the corresponding scripting interface command clampNC and the related tool for surfaces Clamp Surface Tool.

 

Unclamp Tool

Unclamp Tool (left: original curve, right: unclamped curve)

Arguments

The unclamp tool takes a number of NURBS curves from the selection.

Operation

The knot vectors of the selected NURBS curves will be changed so that there are no multiple knots at the respective ends of the knot vectors. The shape of the curve will not change but the position of some control points will. The knot type of the curve can be changed to type "Custom".

See also the image above where a NURBS curve of length four and order three, defined on the knot vector
[ 0 0 0 0.5 1 1 1 ],
has been unclamped and is now using the new knot vector:
[ 0 0.1333 0.3333 0.5 0.6667 0.8333 1 ].

Notes

Unclamping is not an exact reversal of clamping (and vice versa).

Furthermore, as the unclamp operation only works on completely clamped curves, the unclamp tool may need to clamp the curve first.

See also the documentation of the corresponding scripting interface command unclampNC and the related tool for surfaces Unclamp Surface Tool.

 

Insert Knot Tool

Insert Knot Tool (left: original curve, right: a knot has been inserted one time at u = 0.5)

Arguments

The insert knot tool takes a number of NURBS curves from the selection and requests two additional values, a parametric value u and an integer value i.

Operation

A knot with the specified value u will be inserted i times into the knot vector of the selected curves, without changing the shape of the curves.

See also the image above, where a knot has been inserted at u = 0.5 one time into a curve of length four and order four that was originally defined on the knot vector:
[ 0 0 0 0 1 1 1 1 ].
The processed curve of length five is defined on the knot vector:
[ 0 0 0 0 0.5 1 1 1 1 ].

Notes

The knot type of the curves will be changed to "Custom".

The point selection will be removed from the processed objects.

See also the documentation of the corresponding scripting interface command insknNC and the related tool for surfaces Insert Knot Surface Tool.

 

Remove Knot Tool

Remove Knot Tool (left: original curve, right: the knot at t = 0.5 has been removed one time)

Arguments

The remove knot tool takes a number of NURBS curves from the selection and requests three additional values, a parametric value t, an integer value r, and a tolerance value tol.

Operation

The knot at the specified parametric value t will be removed r times from the knot vector of the selected curves if the shape of the resulting curve does not deviate more than tol from the original curve in any point. Since Ayam 1.20 the knot to remove may also be specified using its (zero based) index in the knot vector; for instance by entering "-i 3" instead of "0.5" for the knot vector:
[ 0 0 0 0.5 1 1 1 ].
If the knot can not be removed r times due to the tolerance given, an error is reported and the original curve is left unchanged.
This operation also fails, if the knot removal would lead to a curve of lower order.

See also the image above, where the knot t = 0.5 has been removed one time from a curve of length five and order four that was originally defined on the knot vector:
[ 0 0 0 0 0.5 1 1 1 1 ].
The processed curve of length four is defined on the knot vector:
[ 0 0 0 0 1 1 1 1 ].

Notes

If tol is "0.0" the remove knot tool tries to work without changing the shape of the curve, i.e. only superfluous knots will be removed. If tol is "Inf" (infinity) the specified knot will be removed regardless of potential curve changes.

The point selection will be removed from the processed objects.

See also the documentation of the corresponding scripting interface command remknNC and the related tool for surfaces Remove Knot Surface Tool.

 

Remove Superfluous Knots Tool

Remove Superfluous Knots Tool (left: original curve, right: superfluous knots have been removed)

Arguments

The remove superfluous knots tool takes a number of NURBS curves from the selection and requests a tolerance value tol.

Operation

All knots that do not contribute to the shape of the curve will be removed from the knot vector of the selected curves if the shape of the resulting curve does not deviate more than tol from the original curve in any point.

It is no error if no knots can be removed.

See also the example image above where a curve created by the concatenation algorithm with knot type "Custom" and therefore superfluous knots has been cleaned up by the remove superfluous knots tool. The original curve of order three with 28 control points is defined on the knot vector:
[ 0 0 0 1 1 1 1.5 2 2 2 3 3 3 3.5 4 4 4 5 5 5 5.5 6 6 6 7 7 7 7.5 8 8 8 ].
The processed curve has 21 control points and is defined on the knot vector:
[ 0 0 0 1 1 1.5 2 2 3 3 3.5 4 4 5 5 5.5 6 6 7 7 7.5 8 8 8 ].

Notes

The point selection will be removed from the processed objects.

See also the documentation of the corresponding scripting interface command remsuknNC and the related tools for surfaces Remove Superfluous Knots Surface Tools.

 

Fair Tool

 a

 b

 c   d

Fair Tool (a: Original, b: Processed, c: Curvature of a, d: Curvature of b)

Arguments

The fairing tool takes a number of NURBS curves from the selection and requests a tolerance value tol.

Operation

The control points of the curves will be modified so that the shape of the curve is somewhat smoother. The movement of a single control point is restricted by the specified tolerance value. This can also be used to apply the tool multiple times until the curve shape meets the requirements.[∗]

If the option "Fair Worst" is enabled, only the control point that would be moved the longest distance will be modified.[∗]

If there are selected points, only those will be modified.

See also the example images above where a kink on the leading edge of a wing profile (a) has been removed by applying the fairing tool with a tolerance value of 0.1 two times, yielding the lower curve (b). Compare also the curvature plots of both curves (c and d).

Notes

The fairing algorithm uses the four direct and indirect neighboring control points of each point to process. This poses a problem for the end points of an open curve. Therefore, the control vector of open curves will be extended by a simple linear extrapolation algorithm, so that every point of the original curve has four neighbors. However, the fairing quality for the first, second, second to last, and last control point of an open curve will be somewhat lower.

The original algorithm only delivers optimal results for cubic curves (of order four), using curves of other degrees will work too but yield worse results.

Due to the fact that the algorithm uses already faired points as input points for other points to fair, it is not direction invariant if used on all or multiple neighboring points. Also, control points already placed on very good if not optimal positions may be moved away to less favorable positions. Further problems arise for multiple control points, used to model sharp corners, as the fairing algorithm does not differentiate between wanted and unwanted non-continuous curve features. If in doubt, just select a single control point to fair.

See also the documentation of the corresponding scripting interface command fairNC and the related tool for surfaces Fair Surface Tool.

 

Concat Tool

Arguments

The concat tool takes all NURBS curves and NURBS curve providing objects from the selection and requests parameters for closing, knot type, and fillet creation.[∗]

Operation

The selected curves will be concatenated and a new NURBS curve will be created.

|--NCurve             |--NCurve
|--NCurve     ==>     |--NCurve
                      |--NCurve

Notes

The order of the new curve is taken from the first curve. If one of the curves has weights, the resulting curve will have weights too.

The original NURBS curves will not be deleted by this tool.

See also section ConcatNC Object and the documentation of the corresponding scripting interface command concatC.

 

Split Tool

Split Tool (left: original curve, right: resulting split curves for u = 0.5)

Arguments

The split curves tool takes a number of NURBS curves from the selection and additionally requests a parametric value u. In addition, a relative and an append option can be set.

Operation

The selected NURBS curves will be split into two NURBS curves at the designated parametric value u. The splitting process involves application of knot insertion, so that all new curves will get a custom knot vector. The valid range of parametric values depends on the knot vector of the original curve unless the relative option is set, where it must be in the range (0.0, 1.0).

The new curve(s) will be inserted into the level right after the respective curve(s) to split unless the append option is set.[∗]

|--NCurve             |--NCurve
|--Sphere     ==>     |--NCurve
                      |--Sphere

See also the image above, where a curve of length and order four, originally defined on the knot vector
[ 0 0 0 0 1 1 1 1 ],
was split at parametric value 0.5 resulting in a new curve of length and order four that is defined on the knot vector
[ 0.5 0.5 0.5 0.5 1 1 1 1 ].
The original curve will be defined on the knot vector
[ 0 0 0 0 0.5 0.5 0.5 0.5 ]
after this operation.

Notes

The original selected NURBS curve objects will be changed.

The point selection will be removed from the original curves.

See also the documentation of the corresponding scripting interface command splitNC and the related tool for surfaces Split Surface Tool.

 

Curve Trim Tool

Trim Tool (left: original curve, right: resulting trimmed curve for umin = 0.1, umax = 0.5)

Arguments

The trim curves tool takes all selected NURBS curves from the selection and additionally requests two parametric values, umin and umax.

Operation

The selected NURBS curves will be trimmed to the designated parametric range (umin, umax).

See also the image above, where a curve of length and order four, originally defined on the knot vector
[ 0 0 0 0 1 1 1 1 ],
was trimmed at the parametric values 0.1 0.5 resulting in a new curve of length and order four that is defined on the knot vector
[ 0.1 0.1 0.1 0.1 0.5 0.5 0.5 0.5 ].

Notes

The trimming process involves the application of knot insertion so that the curves will get a custom knot vector.

The point selection will be removed from the original objects.

See also the documentation of the corresponding scripting interface command trimNC.

 

Reparameterisation Tool

Reparameterisation Tool (ul: original curve, ur: reparameterised curve (white) over original (blue), ll: original curve used as clone trajectory, lr: reparameterised curve used as clone trajectory)

Arguments

The reparameterisation curves tool takes a number of NURBS curves from the selection and additionally requests a type t.

Operation

The selected NURBS curves will be approximately reparameterised to the given knot type t.

See also the image above, where a curve of length six and order four, originally defined on the knot vector
[ 0 0 0 0 0.8 0.9 1 1 1 1 ],
was reparameterised to type "Centripetal" resulting in a new curve of length six and order four that is defined on the knot vector
[ 0 0 0 0 0.323 0.5 1 1 1 1 ].

Notes

The reparameterisation process involves a tesselation followed by an approximation, so that

See also the documentation of the corresponding scripting interface command reparamNC

 

Plot Curvature Tool

Curvature Plot (top) of simple NURBS curve (bottom)

Arguments

The plot curvature tool takes a number of NURBS curves from the selection and requests three additional values: the number of data points, the width value and the height value.

Operation

A new NURBS curve, depicting the curvature of the selected NURBS curve, will be created for each of the selected NURBS curves. The curvature plots will have a length defined by the number of data points and will be scaled to the specified width and by the specified height value. See also the image above.

 

Interpolate Tool

Interpolate Curve Tool (left-white: original curve, left-blue and right: interpolating curve)

Arguments

The interpolate tool takes a number of NURBS curves from the selection and requests five additional parameters.

Operation

The curves will be modified so that they interpolate all original control points with the desired interpolation order, parameterisation type and end derivatives. For a detailed description of the parameters see section ICurveAttr Property. See also the image above.

Notes

Eventually present weight information of the original curves will be ignored.

The point selection will be removed from the original objects.

See also the documentation of the corresponding scripting interface command interpNC and the related tool for surfaces Interpolate Surface Tool.

 

Approximate Tool

Approximate Curve Tool (left: original curve, middle and right: approximating curve)

Arguments

The approximate tool takes a number of NURBS curves from the selection and requests additional parameters: new length, new order, whether to create a closed curve, a parameterization type, and a tesselation parameter.

Operation

The curves will be modified so that they approximate their respective original curve shape(s) using a new non-rational NURBS curve with an adjustable number of new control points, order and parameterization type. The centripetal parameterization is better suited than the default (chordal) if the input data contains sharp turns. The uniform type is optimal if regular/symmetric distribution of output control points is desired and the resulting curve is to be edited manually further on. The data points to approximate are created by tesselating the original curves. The tesselation parameter controls how fine this tesselation shall be, larger values lead to more data points and possibly higher approximation fidelity but also slower processing. A value of 0 disables the tesselation completely and the original control points will be used as approximation input.[∗]
The total number of data points generated by the tesselation is nd+(nd-1)×t, where nd is the total number of distinct knots in the valid range of the knot vector and t the tesselation parameter.
See also the image above where a curve with seven original control points of order four has been approximated by a curve with just three control points and order three (middle) and by a curve with seven control points and order three (left).

Notes

The point selection will be removed from the original objects.

Potentially present weights will be removed from the processed curves.

See also the documentation of the corresponding scripting interface command approxNC, and the related tool for surfaces Approximate Surface Tools.

Approximation is also used by the Reparameterisation Tool.

 

Shift Closed Curve Tool

Shift Closed Curve Tool (left: Closed B-Spline Curve, right: Shifted Curve)

Arguments

The shift closed curve tool takes a number of closed curves (NCurve, ICurve, and ACurve objects are supported), from the selection and requests one additional integer parameter i.

Operation

The control points of the curve(s) will be shifted i times.
The parameter i may be negative to revert the direction of the shifting.
For a simple closed curve, shifting with i = 1, the first control point will get the coordinates of the former last control point. This means, positive shifts occur in the direction of the curve. Note that for closed and periodic NURBS curves, the multiple points will be managed correctly.

Notes

Eventually selected points will still be selected after this operation. See also the image above.

See also the documentation of the corresponding scripting interface command shiftC.

 

To XY Tool

To XY Tool (left: original curve, right: modified curve)

Arguments

The To XY tool takes a number of NCurve, ACurve, or ICurve objects from the selection. The curves should be planar. Curves that form a single straight line are not supported.

Operation

The control points of the curves will be rotated, so that they are in the XY-plane of the respective object space defined by the curve objects. Additionally, the rotation attributes of the curve objects will be changed so that the curve does not change its orientation with regard to other objects or the world space. The scale attributes will be reset to 1.0.

See also the image above, where the left curve, planar but not defined in the XY-plane will be changed, so that it is defined in the XY-plane (mind the two different object coordinate systems in conjunction with the world coordinate system in the middle).

Notes

A reverse operation, apart from undo, would be to apply the current transformation attributes to the control points of the curves.

See also the documentation of the corresponding scripting interface command toXYC.

 

Make Compatible Tool

Make Compatible Tool (left: Original Curves, right: Compatible Curves)

Arguments

The make compatible tool takes a number of NURBS curves from the selection and requests a level.

Operation

The curves will be made compatible, so that, based on the level parameter given, they are of the same length, order and defined on the same knot vector.
This eases the application of the build from curves tool (see section Build from Curves Tool) or the application of skinning (see section Skin Object).

Notes

This tool does not change the geometry of the curves. However, since clamping, degree elevation, and knot insertion may be used on the curves, their order, knot vectors, and control points may be changed.

The orders of all curves will simply be raised to the maximum order of all curves; no attempt is made to check, whether lowering orders would lead to a simpler result.

The point selection will be removed from the original objects.

See also the documentation of the corresponding scripting interface command makeCompNC and the related tool for surfaces Make Surfaces Compatible Tool.

 

Rescale Knots to Range Tool

Arguments

The rescale knots to range tool takes a number of NURBS curves from the selection and requests a range (two float values).

Operation

The knot vectors of the curves will be scaled, so that their first and last values match the given range.

Notes

Since Ayam 1.20 the knot type of the curve does not have to be "Custom" anymore. Furthermore, rescaling the knots does not change the knot type.

This tool does not change the geometry of the curves.

See also the documentation of the corresponding scripting interface command rescaleknNC and the related tool for surfaces Rescale Knots to Range Surface Tool.

 

Rescale Knots to Mindist Tool

Arguments

The rescale knots to mindist tool takes a number of NURBS curves from the selection and request a minimum distance value.

Operation

The knot vectors of the curves will be scaled, so that no two knots have a distance smaller than the given minimum distance (except for multiple knots).

Notes

Since Ayam 1.20 the knot type of the curve does not have to be "Custom" anymore. Furthermore, rescaling the knots does not change the knot type.

This tool does not change the geometry of the curves.

See also the documentation of the corresponding scripting interface command rescaleknNC and the related tool for surfaces Rescale Knots to Mindist Surface Tool.

 

Collapse Points Tool

Arguments

The collapse tool expects a number of selected objects with selected (tagged) control points (see section Selecting Points for information on how to select (tag) control points).

Operation

The selected control points will be made a single multiple point, all points will get the coordinate values of the respective center point. This means that the shape of the processed curve/surface can change.

Notes

This command used to only create multiple points for NURBS curve/surface objects and clear the point selection.

In view windows this tool is bound to the <q> key.

 

Explode Points Tool

Arguments

The explode tool expects some objects with a number of selected (tagged) multiple points (see section Selecting Points for information on how to select (tag) control points).

Operation

The points forming the selected multiple points will be moved away from each other. The shapes of the processed objects will change.

Notes

This command used to only remove already existing multiple points of NURBS curves/surfaces that were created by the "CreateMP" option or the collapse tool above before.

In view windows this tool is bound to the <Q> key.

5.4 Surface Creation Tools

These tools create parametric surface objects.

 

NURBSphere Tool

NURB Sphere (l: Control Polygon, r: Shaded Surface)

Arguments

Radius.

Operation

The NURBSphere tool creates a half circle NURBS curve of given radius and revolves it about the Y-axis thus forming a sphere.

Notes

Due to the construction method, the NURBS surface is degenerate at the poles which can lead to shading artefacts (compare the image above).

 

NURBSphere2 Tool

Cobb NURB Sphere (l: Control Polygon, r: Shaded Surface)

Arguments

None.

Operation

The NURBSphere2 tool creates a Cobb NURB sphere of radius 1.0, consisting of six NURBS patches arranged in a configuration resembling a box, see also the above image.

Notes

The NURBS patches are of comparatively high order (5). In contrast to the standard NURBS sphere, the Cobb sphere is not degenerate and no shading artefacts result.

 

Revolve Tool

Arguments

The revolve tool takes all selected objects or their selected boundaries.

Operation

The tool creates a Revolve object, and moves the selected objects to it.

|-NCurve     ==>     +-Revolve
                       \-NCurve

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Revolve        |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Revolve Object for more information regarding the revolve object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Swing Tool

Arguments

The swing tool takes all selected objects or their selected boundaries.

Operation

The tool creates a Swing object, moves the selected objects to it, and rotates the first curve to the YZ-plane and the second curve to the XZ-plane. If the respective curve object is of type NCurve, ICurve, or ACurve, the control points will be modified and the rotation attributes will be reset, objects of other types will be rotated by their transformation attributes.[∗] The rotation will be recorded in the undo buffer.

|-Cross_section(NCurve)         +-Swing
|-Trajectory(NCurve)      ==>    |-Cross_section(NCurve)
                                 \-Trajectory(NCurve)

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Swing          |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Swing Object for more information regarding the Swing object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curves selected and the current level will also be changed.

 

Extrude Tool

Arguments

The extrude tool takes all selected objects or their selected boundaries.

Operation

The tool creates an Extrude object, and moves the selected objects to it.

|-Outline(NCurve)       +-Extrude
|-Hole(NCurve)     ==>    |-Outline(NCurve)
                          \-Hole(NCurve)

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Extrude        |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Extrude Object for more information regarding the Extrude object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Sweep Tool

Arguments

The sweep tool takes all selected objects or their selected boundaries.

Operation

The tool creates a Sweep object, moves the selected objects to it, and offers to rotate the first curve object to the YZ-plane (if it is not already defined in this plane). If this curve object is of type NCurve, ICurve, or ACurve, the control points will be modified and the rotation attributes will be reset, objects of other types will be rotated by their transformation attributes.[∗] The rotation will be recorded in the undo buffer.

|-Cross_section(NCurve)         +-Sweep
|-Trajectory(NCurve)     ==>      |-Cross_section(NCurve)
                                  \-Trajectory(NCurve)

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Sweep          |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Sweep Object for more information regarding the Sweep object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Bevel Tool

Arguments

The bevel tool takes all selected objects or their selected boundaries.

Operation

The tool creates a Bevel object, and moves the selected objects to it.

|-NCurve             +-Bevel
             ==>       \-NCurve

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Bevel          |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Bevel Object for more information regarding the Bevel object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Cap Tool

Arguments

The cap tool takes all selected objects or their selected boundaries.

Operation

The tool creates a Cap object, and moves the selected objects to it.

|-Outline(NCurve)         +-Cap
|-Hole(NCurve)      ==>     |-Outline(NCurve)
                            \-Hole(NCurve)

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Cap            |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Cap Object for more information regarding the Cap object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Birail1 Tool

Arguments

The birail1 tool takes all selected objects or their selected boundaries.

Operation

The tool creates a Birail1 object, and moves the selected objects to it.

|-Cross_section(NCurve)      +-Birail1
|-Rail1(NCurve)         ==>    |-Cross_section(NCurve)
|-Rail2(NCurve)                |-Rail1(NCurve)
                               \-Rail2(NCurve)

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Birail1        |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Birail1 Object for more information regarding the Birail1 object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Birail2 Tool

Arguments

The birail2 tool takes all selected objects or their selected boundaries.

Operation

The tool creates a Birail2 object, and moves the selected objects to it.

|-Cross_section1(NCurve)       +-Birail2
|-Rail1(NCurve)                  |-Cross_section1(NCurve)
|-Rail2(NCurve)           ==>    |-Rail1(NCurve)
|-Cross_section2(NCurve)         |-Rail2(NCurve)
                                 \-Cross_section2(NCurve

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Birail2        |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Birail2 Object for more information regarding the Birail2 object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Gordon Tool

Arguments

The gordon tool takes all selected objects or their selected boundaries.

Operation

The tool creates a Gordon object, and moves the selected objects to it.

|-NCurve             +-Gordon
|-NCurve               |-NCurve
|-Level                |-NCurve
|-NCurve     ==>       |-Level
|-NCurve               |-NCurve
                       \-NCurve

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Gordon         |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Gordon Object for more information regarding the Gordon object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Skin Tool

Arguments

The skin tool takes all selected objects or their selected boundaries.

Operation

The tool creates a Skin object, and moves the selected objects to it.

|-NCurve             +-Skin
|-NCurve     ==>       |-NCurve
|-NCurve               |-NCurve
                       \-NCurve

For selected boundaries, properly parameterised ExtrNC objects will be created:

                     |-NPatch  <------.
|-NPatch     ==>     +-Skin           |
                       +-ExtrNC       |
                         \-Instance --'

Notes

See section Skin Object for more information regarding the Skin object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Trim Tool

Arguments

The trim tool takes the selected objects from the selection.

Operation

The tool creates a Trim object, and moves the selected objects to it.

|-NPatch             +-Trim
|-NCurve     ==>       |-NPatch
|-NCurve               |-NCurve
                       \-NCurve

Notes

See section Trim Object for more information regarding the Trim object.

This tool uses the object clipboard to move the objects so that the original clipboard contents are lost when this tool finishes.

Holding down the <Ctrl> key while clicking on the corresponding icon in the toolbox will keep the parameter curve selected and the current level will also be changed.

 

Tween Surfaces Tool

Tweened Surface (white) from two Parameter Surfaces (blue) with r = 0.5

Arguments

The tween tool takes two NURBS patches from the selection and requests a parameter r. In addition, an append option can be set.[∗]

Operation

The selected NURBS patches will be interpolated (tweened) and a new patch incorporating features from both of the original patches will be created. The parameter r defines the ratio of influence of the first and the second patch (the latter is using a ratio of 1 - r).

|-NPatch1            |-NPatch1
|-NPatch2    ==>     |-Tweened_Surface(NPatch)
                     |-NPatch2
If a third surface is selected, the parameter r is ignored and this third surface defines the ratio of influence with its y coordinates.[∗] Unless the append option is set, the new surface will be created after the first surface.

Notes

The two patches must be of the same width, height, uorder, and vorder. They need not be defined on the same knot vectors, however.

The interpolation control surface does not need to be compatible with any of the original patches.

If one of the patches knot vector types is "Custom" or the respective knot vector types are different, the resulting knot vector type will be "Custom" and the knot values will also be interpolated/tweened. Otherwise a matching knot vector will be generated according to the type.

The original NURBS patches will not be deleted by this tool.

Trim curves are completely ignored by this tool.

See also the documentation of the corresponding scripting interface command tweenNP and the related tool for curves Tween Curves Tool.

5.5 Surface Modification Tools

These tools modify parametric surface objects.

Unless noted otherwise, PV tags are not supported/modified by these tools.

 

Revert U Tool

Arguments

The revert u tool takes a number of NURBS patches, IPatch, BPatch, or PatchMesh objects from the selection.

Operation

The control point arrays of the selected objects will be reversed in the U dimension (width). For NURBS patches this tool also reverts the relative knot distances of the corresponding knot vector so that the surface does not change in shape. However, trim curves will not be modified.
For IPatch objects the respective derivatives are reverted.

Notes

PV tags will not be modified.

See also the documentation of the corresponding scripting interface command revertuS and the related tool for curves Revert Tool.

 

Revert V Tool

Arguments

The revert v tool takes a number of NURBS patches IPatch, BPatch, or PatchMesh objects from the selection.

Operation

The control point arrays of the selected objects will be reversed in the V dimension (height). For NURBS patches this tool also reverts the relative knot distances of the corresponding knot vector so that the surface does not change in shape. However, trim curves will not be modified.
For IPatch objects the respective derivatives are reverted.

Notes

PV tags will not be modified.

See also the documentation of the corresponding scripting interface command revertvS and the related tool for curves Revert Tool.

 

Swap UV Tool

Arguments

The swap uv tool takes a number of NURBS patches, IPatch, BPatch, or PatchMesh objects from the selection.

Operation

The U and V dimension of the selected objects will be swapped (width, height, and all other dimension related parameters will be exchanged) without altering the shape of the patches.

Notes

The point selection will be removed from the original objects.

PV tags will not be modified.

Also trim curves will not be modified.

See also the documentation of the corresponding scripting interface command swapuvS.

 

Close U Tool

Arguments

The close u tool takes a number of NURBS patches from the selection and requests some operation parameters.

Operation

According to the "mode" parameter value, the surfaces will be closed by copying certain control point lines. If the "extend" parameter is enabled no old control points will be changed but the width of the patch will be increased.

 

Close V Tool

Arguments

The close v tool takes a number of NURBS patches from the selection and requests some operation parameters.

Operation

According to the "mode" parameter value, the surfaces will be closed by copying certain control point lines. If the "extend" parameter is enabled no old control points will be changed but the height of the patch will be increased.

 

Refine Knots Surface Tool

Successive Application of Refine Knots Surface (U) Tool

Arguments

The refine knots surface tool takes a number of NURBS patches from the selection.

Operation

The respective knot vectors of the selected NURBS patches will be refined by inserting a knot in the middle of each inner knot interval without changing the shape of the patches. New control points will be added and the position of old control points may be changed in the progress. See also the image above where a surface defined on the knot vector
[ 0 0 0 0 1 1 1 1 ]
is successively refined to the knot vector
[ 0 0 0 0 0.5 1 1 1 1 ]
and then
[ 0 0 0 0 0.25 0.5 0.75 1 1 1 1 ].

Notes

Because new knots are inserted into inner intervals only, the clamping state of the knot vectors does not change. Furthermore, knot vectors of type "NURB" will not change in type, other knot vectors will be changed to type "Custom".

The point selection will be removed from the original objects.

There are also tools available that refine only the U or V knots.

See also the documentation of the corresponding scripting interface commands refineuNP and refinevNP and the related tool for curves Refine Knots Tool.

 

Refine Knots With Surface Tool

Refine Knots With Surface (U) Tool (left: original surface, right: refined surface)

Arguments

The refine knots with surface tool takes a number of NURBS patches from the selection and requests a vector of new knot values.

Operation

The respective knot vectors of the selected NURBS patches will be refined by inserting all knots from the specified vector at once. The shape of the patch will not be changed. New control points will be added and the position of old control points may be changed in the progress.
See also the example image above where a surface defined on the knot vector
[ 0 0 0 0 0.5 1 1 1 1 ]
has been refined with the new knots 0.2 and 0.7 in U direction to the new knot vector:
[ 0 0 0 0 0.2 0.5 0.7 1 1 1 1 ].

The resulting knot vector must be valid, otherwise an error will be reported and the respective patch is not changed.

Notes

The respective knot type of the patch may be changed to "Custom".

The point selection will be removed from the original objects.

There are also tools available that refine only the U or V knots.

See also the documentation of the corresponding scripting interface commands refineuNP and refinevNP and the related tool for curves Refine Knots With Tool.

 

Elevate Surface Tool

Elevate Surface Tool (left: original surface, right: elevated surface)

Arguments

The elevate surface tool takes a number of NURBS patches from the selection and additionally requests two integer values.

Operation

The order of the selected NURBS patches will be raised by the specified integer values without changing the shape of the patches. New control points will be added and the position of old control points may be changed in the progress.

See also the image above, where a surface of order four and width five, originally defined on the u knot vector:
[ 0 0 0 0 0.5 1 1 1 1 ]
has been elevated to order five in u direction and is now of width seven and defined on the u knot vector:
[ 0 0 0 0 0 0.5 0.5 1 1 1 1 1 ].

Notes

If the knot vector of the patch is not clamped, it will be clamped automatically.

The knot type of the patch will be changed to "Custom".

The point selection will be removed from the original objects.

There are also tools available that elevate a patch in U or V direction only.

See also the documentation of the corresponding scripting interface commands elevateuNP and elevatevNP as well as the related tool for curves Elevate Tool.

 

Reduce Surface Tools

Reduce Tool (Order 4 (left), 3 (right))

Arguments

The reduce surface tools take a number of NURBS surfaces from the selection and additionally request a tolerance value.

Operation

The order of the selected NURBS surfaces will be decreased by one if the shape of the reduced surfaces does not deviate from the original surfaces by the given tolerance in any point.

See also the example image above where a surface of order four and height four, defined on the v knot vector
[ 0 0 0 0 1 1 1 1 ],
has been reduced in v direction to order three and is now of height three and defined on the v knot vector
[ 0 0 0 1 1 1 ].

Notes

If the respective knot vector of the surface is not clamped, it will be clamped automatically. The respective knot type of the surface will be changed to "Custom". Control points will be removed and the position of old control points may be changed in the progress.

The point selection will be removed from the processed objects.

The ability to reduce a certain surface can be improved by increasing the multiplicity of internal knots first.

See also the documentation of the corresponding scripting interface commands reduceuNP and reducevNP as well as the related tool for curves Reduce Tool.

 

Clamp Surface Tool

Clamp Surface Tool (left: Original Patch with B-Spline Knot Vectors, right: Clamped Patch)

Arguments

The clamp surface tool takes a number of NURBS patches from the selection.

Operation

The knot vectors of the selected NURBS patches will be changed using knot insertion so that the first and the last knot (in each direction) have a multiplicity equal to the order of the patch (in the respective direction).

See also the image above, where a surface of width/height four and both orders also four, originally defined on the B-Spline knot vectors:
[ 0 0.1428 0.2857 0.4285 0.5714 0.7142 0.8571 1.0 ]
has been clamped and is now defined on the knot vectors:
[ 0.4285 0.4285 0.4285 0.4285 0.5714 0.5714 0.5714 0.5714 ].

Notes

The shape of the patches will not change but the position of some control points will. The patches interpolate the first and the last control points in the respective direction afterwards (unless the weights of those points are not 1.0). The knot types of the patches will be changed to type "Custom".

There are also tools available that clamp a patch in U or V direction only.

See also the documentation of the corresponding scripting interface commands clampuNP and clampvNP and the related tool for curves Clamp Tool.

 

Unclamp Surface Tool

Unclamp Surface Tool (left: Original Patch, right: Unclamped Patch)

Arguments

The unclamp surface tool takes a number of NURBS patches from the selection.

Operation

The knot vectors of the selected NURBS patches will be changed so that there are no multiple knots at the respective ends of the knot vectors. The shape of the patches will not change but the position of some control points will. The knot types of the patches may be changed to type "Custom".

See also the image above, where a surface of width/height four and both orders three, originally defined on the knot vectors:
[ 0 0 0 0.5 1 1 1 ]
has been unclamped and is now defined on the knot vectors:
[ 0 0.1666 0.3333 0.5 0.6666 0.8333 1 ].

Notes

Unclamping is not an exact reversal of clamping (and vice versa).

Furthermore, as the unclamp operation only works on completely clamped surfaces, the unclamp tool may need to clamp the surface first.

There are also tools available that unclamp a patch in U or V direction only.

See also the documentation of the corresponding scripting interface commands unclampuNP and unclampvNP and the related tool for curves Unclamp Tool.

 

Insert Knot Surface Tool

Insert Knot Surface Tool (left: original patch, right: a knot has been inserted one time at t = 0.5)

Arguments

The insert knot surface tool takes a number of NURBS patches from the selection and requests two additional values, a parametric value t and an integer value i.

Operation

A knot with the specified value t will be inserted i times into the knot vector of the selected patches, without changing their shape.

See also the image above, where a knot has been inserted at u = 0.5 one time into a surface of width four and order four that was originally defined on the u knot vector:
[ 0 0 0 0 1 1 1 1 ].
The processed surface of width five is defined on the u knot vector:
[ 0 0 0 0 0.5 1 1 1 1 ].

Notes

The knot type of the patch will be changed to "Custom".

This tool does not change the geometry of the patches.

The point selection will be removed from the original objects.

See also the documentation of the corresponding scripting interface commands insknuNP and insknvNP and the related tool for curves Insert Knot Tool.

 

Remove Knot Surface Tool

Remove Knot Surface Tool (left: original surface, right: the knot at t = 0.5 has been removed one time)

Arguments

The remove knot surface tool takes a number of NURBS surfaces from the selection and requests three additional values, a parametric value t, an integer value r, and a tolerance value tol.

Operation

The knot at the specified parametric value t will be removed r times from the knot vector of the selected surfaces if the shape of the resulting surfaces does not deviate more than tol from the original surfaces in any point. Since Ayam 1.20 the knot to remove may also be specified using its (zero based) index in the knot vector; for instance by entering "-i 3" instead of "0.5" for the knot vector:
[ 0 0 0 0.5 1 1 1 ].
If the knot can not be removed r times due to the tolerance given, an error is reported and the original surface is left unchanged.
This operation also fails, if the knot removal would lead to a surface of lower order.

See also the image above, where the knot t = 0.5 has been removed one time from a surface of width five and order four that was originally defined on the u knot vector:
[ 0 0 0 0 0.5 1 1 1 1 ].
The processed surface of width four is defined on the knot vector:
[ 0 0 0 0 1 1 1 1 ].

Notes

If tol is "0.0" the remove knot tool tries to work without changing the shape of the surface, i.e. only superfluous knots will be removed. If tol is "Inf" (infinity) the specified knot will be removed regardless of potential surface changes.

The point selection will be removed from the original objects.

See also the documentation of the corresponding scripting interface commands remknuNP, and remknvNP and the related tool for curves Remove Knot Tool.

 

Remove Superfluous Knots Surface Tools

Arguments

The remove superfluous knots tools take a number of NURBS surfaces from the selection and requests a tolerance value tol.

Operation

All knots that do not contribute to the shape of the surface will be removed from the knot vector of the selected surfaces if the shape of the resulting surface does not deviate more than tol from the original surface in any point.

It is no error if no knots can be removed.

Notes

The point selection will be removed from the processed objects.

See also the documentation of the corresponding scripting interface commands remsuknuNP and remsuknvNP. See also the related tool for curves Remove Superfluous Knots Tool.

 

Split Surface Tool

Split Surface Tool (left: original surface, right: the surface was split at t = 0.5)

Arguments

The split surface tool takes a number of NURBS patches from the selection and requests a parametric value t (in U or V parametric dimension, respectively). In addition, a relative and an append option can be set.

Operation

The patches will be split at the parametric value t into two patches (in U or V parametric dimension, respectively) using knot insertion. The valid range of parametric values depends on the knot vector of the original surface unless the relative option is set, where it must be in the range (0.0, 1.0).

The new surface(s) will be inserted into the level right after the respective surface(s) to split unless the append option is set.[∗]

|-NPatch             |-NPatch
|-Sphere     ==>     |-NPatch
                     |-Sphere

Notes

The original NURBS patch object(s) will be modified.

The point selection will be removed from the original objects.

Eventually present trim curves will not be honored properly.

See also the documentation of the corresponding scripting interface commands splituNP, splitvNP and the related tool for curves Split Tool.

 

Interpolate Surface Tool

Interpolate Surface Tool (left-white: original surface, left-blue and right: interpolating surface)

Arguments

The interpolate surface tool takes a number of NURBS patches from the selection and requests an additional parameter o.

Operation

The patches will be modified so that they interpolate all original control points with the desired interpolation order o. See also the image above.

Notes

Eventually present weight information of the original patches will be ignored.

The point selection will be removed from the original objects.

See also the documentation of the corresponding scripting interface commands interpuNP and interpvNP, as well as the related tool for curves Interpolate Tool.

 

Approximate Surface Tools

Approximate Surface Tool (left: original surface, right: approximating (white) and original (blue) surface superimposed)

Arguments

The approximate surface tools take a number of NURBS surfaces from the selection and request additional parameters. Depending on the approximation direction determined by the concrete tool selection, those are a subset or all of: width and height, orders, knot types, whether to create a closed surface, and tesselation parameters.

Operation

The surfaces will be modified so that they approximate their respective original surface shape(s) using a new non-rational NURBS surface with an adjustable number of new control points and order(s).
The centripetal knot types are better suited than the default (chordal) if the input data contains sharp features. The uniform knot types are optimal if regular/symmetric distribution of output control points is desired and the resulting surface is to be edited manually further on.
The data points to approximate are created by tesselating the original surfaces. The tesselation parameters control how fine this tesselation shall be, larger values lead to more data points and possibly higher approximation fidelity but also slower processing. A tesselation parameter of 0 disables the tesselation completely and the original control points will be used as approximation input.

See also the image above where a standard cone surface with nine rational control points in V direction of order three has been approximated by a periodic non rational surface with 11 control points and order three.

Notes

The point selection will be removed from the original objects.

Potentially present weights will be removed from the processed surfaces.

See also the documentation of the corresponding scripting interface command approxNP, and the related tool for curves Approximate Tool.

 

Fair Surface Tool

Arguments

The fair surface tool takes a number of NURBS surfaces from the selection and requests a mode and a tolerance value. In addition, a "Fair Worst" option can be set.

Operation

The control points of the surface will be modified so that the shape of the surface is somewhat smoother. The movement of a single control point is restricted by the specified tolerance value. This can also be used to apply the tool multiple times until the surface shape meets the requirements.

As the surface fairing algorithm is derived from the curve fairing algorithm, the option "Mode" allows to select in which direction the algorithm shall be applied, or, for the modes "UV" and"VU", in which order the dimensions shall be processed.

If the option "Fair Worst" is enabled, only the control point that would be moved the longest distance in each control line in the currently processed direction will be modified.

If there are selected points, only those will potentially be modified.

Notes

The fairing algorithm uses the four direct and indirect neighboring control points of each point to process. This poses a problem for the end points of an open surface. Therefore, the control vector of open surfaces will be extended by a simple linear extrapolation algorithm, so that every point of the original surface has four neighbors. However, the fairing quality for the first, second, second to last, and last control points of an open surface will be somewhat lower.

The original algorithm only delivers optimal results for cubic surfaces (of order four), using surfaces of other degrees will work too but yield worse results.

Due to the fact that the algorithm uses already faired points as input points for other points to fair, it is not direction invariant if used on all or multiple neighboring points. Also, control points already placed on very good if not optimal positions may be moved away to less favorable positions. Further problems arise for multiple control points, used to model sharp corners, as the fairing algorithm does not differentiate between wanted and unwanted non-continuous surface features. If in doubt, just select a single control point to fair.

See also the documentation of the corresponding scripting interface command fairNP and the related tool for curves Fair Tool.

 

Make Surfaces Compatible Tool

Make Compatible Tool (u: Original, m: Compatible by Order, l: Fully Compatible Surfaces)

Arguments

The make compatible tool takes a number of NURBS surfaces from the selection and requests a side and a level.

Operation

The surfaces will be made compatible, so that, based on the side and level parameters given, they are of the same orders, width/height, and defined on the same knot vector.

Notes

This tool does not change the geometry of the surfaces. However, since clamping, degree elevation, and knot insertion may be used on the surfaces, their order, knot vectors, and control points may be changed.

The orders of all surfaces will simply be raised to the maximum order of all surfaces; no attempt is made to check, whether lowering orders would lead to a simpler result.

The point selection will be removed from the original objects.

See also the documentation of the corresponding scripting interface command makeCompNP and the related tool for curves Make Compatible Tool.

 

Rescale Knots to Range Surface Tool

Arguments

The rescale knots to range surface tool takes a number of NURBS patches from the selection and requests a range.

Operation

The knot vectors of the patches will be scaled, so that their first and last values match the given range. Trim curves, if present, will also be scaled to match the new range.

Notes

Since Ayam 1.20 the knot type of the surface does not have to be "Custom" anymore. Furthermore, rescaling the knots does not change the knot type.

This tool does not change the geometry of the patches.

See also the documentation of the corresponding scripting interface command rescaleknNP and the related tool for curves Rescale Knots to Range Tool.

 

Rescale Knots to Mindist Surface Tool

Arguments

The rescale knots to mindist surface tool takes a number of NURBS patches from the selection and request a minimum distance value.

Operation

The knot vectors of the patches will be scaled, so that no two knots have a distance smaller than the given minimum distance (except for multiple knots). Trim curves, if present, will also be scaled to match the new range.

Notes

Since Ayam 1.20 the knot type of the surface does not have to be "Custom" anymore. Furthermore, rescaling the knots does not change the knot type.

This tool does not change the geometry of the patches.

See also the documentation of the corresponding scripting interface command rescaleknNP and the related tool for curves Rescale Knots to Mindist Tool.

5.6 Conversion Tools

These tools convert between parametric objects.

 

Extract Curve Tool

Arguments

The extract curve tool takes the first of the selected objects from the selection.

Operation

The tool creates an instance from the first of the selected objects then creates an ExtrNC object and moves the instance to it.

|-NPatch             |-NPatch
             ==>     +-ExtrNC
                      \-Instance_of_NPatch(Instance)

Notes

This tool uses the object clipboard to move the objects around so that the original clipboard contents are lost when this tool finishes.

See section ExtrNC Object for more information regarding the ExtrNC object.

 

Extract Patch Tool

Arguments

The extract patch tool takes the first of the selected objects from the selection.

Operation

The tool creates an instance from the first of the selected objects then creates an ExtrNP object and moves the instance to it.

|-NPatch             |-NPatch
             ==>     +-ExtrNP
                      \-Instance_of_NPatch(Instance)

Notes

This tool uses the object clipboard to move the objects around so that the original clipboard contents are lost when this tool finishes.

See section ExtrNP object for more information regarding the ExtrNP object.

See also the documentation of the corresponding scripting interface command extrNP.

 

Break into Curves Tool

Break into Curves Example

Arguments

The break into curves tool takes all NURBS patches from the selection and requests some parameters.

Operation

The selected NURBS patches will be broken into NURBS curves, along the given direction (U or V).
If the option "ApplyTrafo" is set, the transformations of the NPatch objects will be applied to the control points and the NCurve objects will be created with default transformation attributes, otherwise the NCurve objects will get the transformation attributes of the respective NPatch. See also the image above.
If the option "ReplaceOriginal" is enabled, the curves will replace each original NPatch object, however, by default new curve objects will be appended to the current level:

|-NPatch             |-NPatch
                     |-NCurve
             ==>     |-NCurve
                     |-NCurve
                     |-NCurve

Notes

See also the documentation of the corresponding scripting interface command breakNP.

 

Build from Curves Tool

Build from Curves Example

Arguments

The build from curves tool takes a number of NURBS curves from the selection and requests some parameters.

Operation

The selected NURBS curves will be parsed, all curves that are of equal length or longer than the first selected curve will be used to form a new NURBS patch of the following dimensions:
Width: number of used curves, Height: length of the first selected curve. If the supplied order is 0 (this is the default), the order of the new surface in U direction (Order_U) will be equal to the number of used curves for numbers of two to four and four for bigger numbers of used curves.
The knot type in U direction (Knot-Type_U) will always be NURB. Other parameters (Order_V, Knot-Type_V, Knots_V) are taken from the first curve.
See also the image above; note, that the extraneous control point of the upper curve and the knot vector of the curve below are ignored. To avoid this, the make compatible tool can be used first, see section Make Compatible Tool.

If the "ApplyTrafo" option is enabled the transformation attributes of the individual curve objects will be applied to the control points, otherwise they will simply be ignored.

If the "ReplaceOriginal" option is enabled, the new surface object will replace the first of the curves and the other curves will be removed. However, by default the new NPatch object will be appended to the current level:

|-NCurve               |-NCurve
|-NCurve               |-NCurve
|-NCurve     ==>       |-NCurve
|-NCurve               |-NCurve
                       |-NPatch

Notes

See also the documentation of the corresponding scripting interface command buildNP.

 

Tesselation Tool

GUI of Tesselation Tool

Arguments

The tesselation tool takes all NURBS patches and NURBS patch providing objects from the selection.

Operation

A modal dialog box (see image above) will pop up, that allows to select a tesselation method via a drop-down menu and to tune the corresponding tesselation parameter(s) using a slider and an entry widget. The initial method and parameter values will be derived from the "TP" tag of the first of the selected objects (if it has such a tag).

The selected or provided NURBS patches will be tesselated with the chosen method and parameters. The PolyMesh objects created by the tesselation will immediately be displayed in all view windows instead of the original objects. Whenever tesselation method or parameters are changed, the tesselation will be recomputed and displayed, thus, allowing an immediate estimation of the tesselation quality and the number of created polygonal elements.

If the option "LazyUpdate" is enabled, updates of the tesselation that normally occur while dragging the slider(s) will be deferred until the mouse button is released. The initial value of this option will be determined from the "LazyNotify" preference setting.

The options "UseTexCoords" and "UseVertColors" control processing of texture coordinates and vertex colors stored as PV tags in the objects to be tesselated (see also section PV Tag). When enabled, the resulting PolyMesh objects will also have PV tags of the respective type.
Note that the PV tags must be named as defined by the hidden preference options "PVTexCoordName" and "PVColorName" respectively. By default those are set to "st" and "Cs".
If the "UseTexCoords" option is enabled, but no matching PV tag is present, texture coordinates will be generated from the data provided by a TC tag or (if no TC tag is present) from the knot values of the NURBS surfaces to be tesselated.[∗] See also section TC (Texture Coordinates) Tag.

The option "UseVertNormals" controls processing of vertex normals stored as PV tags in the objects to be tesselated (see also section PV Tag). When enabled, the resulting PolyMesh objects will have normals derived from these tags instead of normals derived from the NURBS surface.
Note that the PV tags must be named as defined by the hidden preference option "PVNormalName". By default this is set to "N", so that a correct example tag looks like this:

PV N,varying,n,4,0,0,1,0,0,1,1,1,0,0,0,1

The option "RefineTrims" controls how many times the trim curves are to be refined before tesselation for improved tesselation fidelity along trim edges.[∗] See also the images below.

RefineTrims Example (left: 0, right: 2)

The option "Primitives" allows to select a primitive creation method. These methods are explained in greater detail in section Primitive Creation Methods.

If the "Ok" button is pressed, the tesselation tool will be closed and all selected objects will be replaced by their tesselated counterparts. The original objects will be deleted.
If referenced/master objects are among the selected objects or their children, and if any of their references are not selected or a child of the selected objects (i.e. would not be deleted also), then those master objects will not be deleted but moved to the clipboard instead.

If the "Save" button is used, the tesselation dialog will be closed and "TP" tags containing the currently selected method and parameter value will be added to all selected objects. These tags can be evaluated later, when the respective objects are converted to PolyMesh objects (e.g. upon export). Since Ayam 1.11 the conversion mechanism of objects keeps the "TP" tags intact, so that e.g. tesselation parameters saved to a Sphere or a Revolve object will also be preserved, and can also be used later when the object will eventually be converted to a PolyMesh (via a NURBS patch).

If "Cancel" is used, the dialog will be closed and all selected objects remain unchanged.

Notes

The tesselation tool will block most other parts of Ayam while it is running, i.e. it is not possible to change the selection or run other tools. It is, however, allowed to adjust view parameters while the tesselation tool is open, to examine the tesselation result more closely or from different viewing angles.

The values of the parameter slider bounds may be changed by simply entering values that are out of the current bounds into the respective entry widget, then pressing the <Tab> key. Range and resolution of the slider will be recalculated automatically from the value in the entry widget.

PV tags that do not provide enough data for the surface to be tesselated will be silently ignored.

The PolyMesh objects created by this tool will not be optimized.

The tesselation facility is based on the GLU (V1.3+) NURBS tesselator.

Sampling Methods and Parameters

Six sampling methods are available:

  1. "ParametricError" ensures that the distance between the tesselated surface and the original surface is no point bigger than the value specified by "SParamU".
  2. The sampling method "PathLength" ensures that no edge of a polygon generated by the tesselation is longer than the value specified by "SParamU" and the tesselation method
  3. "DomainDistance" (the default up to 1.22) simply tesselates the NURBS surface into equally sized pieces with regard to parametric space; "SParamU" and "SParamV" control the number of sampling points in U and V direction respectively per unit length. This leads to different numbers of samples for knot vectors of different total length in parameter space.
  4. "NormalizedDomainDistance" ensures that the tesselation creates the same number of sample points (as given via "SParamU" and "SParamV") for knot vectors of any total length in parameter space[∗] and
  5. "AdaptiveDomainDistance" additionally adds sample points depending on the number of control points (width or height of the patch) to provide a better adaptation to complex patches.[∗]
  6. "AdaptiveKnotDistance" normalizes the number of sample points to the number of knot intervals and the total length of the knot vector.[∗]

"SParamU" is a parameter for the sampling method above.
The default value for the sampling method "AdaptiveKnotDistance" is 3. Higher values lead to better quality and more tesselated polygons.
The default value for the sampling method "DomainDistance" is 8. Higher values lead to better quality and more tesselated polygons.
The default value for the sampling method "PathLength" is 1.5. Smaller values lead to better quality and more tesselated polygons.
The default value for the sampling method "ParametricError" is 0.25. Smaller values lead to better quality and more tesselated polygons.

Note that "SParamU" is expressed in object space units for the "PathLength" and "ParametricError" sampling methods.

"SParamV" is just available for the sampling methods "DomainDistance", "NormalizedDomainDistance", "AdaptiveDomainDistance", and
"AdaptiveKnotDistance".
The default value is equal to the respective value of the "SParamU" parameter above.

See also the next two images and corresponding tables that allow to compare the results of four main sampling methods with different parameters.

Sampling Method Comparison, Defaults (l: ParametricError, ml: PathLength, mr: DomainDistance, r: AdaptiveKnotDistance)

MethodParametricErrorPathLengthDomainDistanceAdaptiveKnotDistance
Parameter0.251.58 / 83 / 3
Cylinder88104368192
Sphere9680112120
Box3660384108
Total220244864420

Sampling Methods Parameters and Results (1/2)

 

Sampling Method Comparison, Higher Quality (l: ParametricError, ml: PathLength, mr: DomainDistance, r: AdaptiveKnotDistance)

MethodParametricErrorPathLengthDomainDistanceAdaptiveKnotDistance
Parameter0.1250.912 / 124 / 4
Cylinder152168840352
Sphere216160264224
Box36108864192
Total4044361968768

Sampling Methods Parameters and Results (2/2)

Primitive Creation Methods

The primitive creation methods determine, how the OpenGL primitives sent from the GLU NURBS tesselator (GL_TRIANGLES, GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, and GL_QUAD_STRIP) are turned into polygon faces. Four primitive creation methods are available:

  1. "Triangles": the output contains only triangles. Even if quads are originally emitted from the tesselator, those will be torn down to triangles.
  2. "TrianglesAndQuads": the output contains triangles and possibly quads (as originally emitted from the tesselator).[∗] Note that quads will be emitted from the tesselator with higher probability in the DomainDistance and KnotDistance sampling methods.
  3. "Quads": the output only contains quads that will be synthesized from neighboring triangles if they form a planar quad. The pairing algorithm is not very sophisticated, only one solution will be tried. Furthermore, triangles without suitable neighbor will be used to form degenerate quads.[∗]
  4. "QuadrangulatedTriangles": the output contains only quads that stem from refined/quadrangulated triangles.[∗] The input of the quadrangulation are the triangles as created by the "Triangles" method. Each triangle will be refined/replaced by three quads. Four new points will be introduced for that. These new points will be placed directly on the (still) underlying NURBS surface. The quads are guaranteed not to be degenerate (contrary to those created by the "Quads" method) but they may be non-planar if the tesselated surface is highly curved and the initial sampling is sufficiently coarse.
    Degeneracies will be detected and proper actions with regard to normal interpolation will be taken.
    Vertex colors supplied via PV tags are currently not supported by this method.

See also the following images and tables for a comparison of the primitive creation method results.

Primitive Creation Method Comparison, Sampling Method: Parametric Error (0.65) (l: Triangles, ml: TrianglesAndQuads, mr: Quads, r: QuadrangulatedTriangles)

MethodTrianglesTrianglesAndQuadsQuadsQuadrangulatedTriangles
Cylinder56t56t32q168q
Sphere32t32t32q96q
Box36t36t24q108q
Total124t124t88q372q

Primitive Creation Method Comparison (1/2)

Primitive Creation Method Comparison, Sampling Method: AdaptiveKnotsDistance (3.0/3.0) (l: Triangles, ml: TrianglesAndQuads, mr: Quads, r: QuadrangulatedTriangles)

MethodTrianglesTrianglesAndQuadsQuadsQuadrangulatedTriangles
Cylinder56t24t / 84q100q576q
Sphere120t24t / 48q72q360q
Box108t54q54q324q
Total284t48t / 186q226q1260q

Primitive Creation Method Comparison (2/2)


Next Previous Contents