User:Wfpokorny
- Below we have another pass of lathe and prism reference section updates. Started, Jim, with
what you had - hoping not too much work for you to update.
The lathe
is an object generated from rotating a two-dimensional curve about an axis. This curve is defined by a set of points which are connected by linear, quadratic, cubic or bezier spline curves. The syntax is:
LATHE: lathe { [SPLINE_TYPE] Number_Of_Points, <Point_1> <Point_2>... <Point_n> [LATHE_MODIFIER...] } SPLINE_TYPE: linear_spline | quadratic_spline | cubic_spline | bezier_spline LATHE_MODIFIER: sturm | OBJECT_MODIFIER
Lathe default values:
SPLINE_TYPE : linear_spline sturm : off
The first item is a keyword specifying the type of spline. The default if none is specified is linear_spline
. The required integer value Number_Of_Points
specifies how many two-dimensional points are used to define the curve. The points follow and are specified by 2-D vectors. The curve is not automatically closed, i.e. the first and last
points are not automatically connected. You will have to do this yourself if you want a closed curve. The curve thus defined is rotated about the y-axis to form the lathe object, centered at the origin.
The following example creates a simple lathe object that looks like a thick cylinder, i.e. a cylinder with a thick wall:
lathe { linear_spline 5, <2, 0>, <3, 0>, <3, 5>, <2, 5>, <2, 0> pigment {Red} }
The cylinder has an inner radius of 2 and an outer radius of 3, giving a wall width of 1. It's height is 5 and it's located at the origin pointing up, i.e. the rotation axis is the y-axis.
Note: The first and last point are equal to get a closed curve.
The splines that are used by the lathe and prism objects are a little bit difficult to understand. The basic concept of splines is to draw a curve through a given set of points in a determined way. The default linear_spline
is the simplest spline because it's nothing more than connecting consecutive points with a line. This means the curve that is drawn between two points only depends on those two points. No additional information is taken into account. The other splines are different in that they do take other points into account when connecting two points. This creates a smooth curve and, in the case of the cubic spline, produces smoother transitions at each point.
The quadratic_spline
keyword creates splines that are made of quadratic curves. Each of them connects two consecutive points. Since those two points (call them second and third point) are not sufficient to describe a quadratic curve, the predecessor of the second point is taken into account when the curve is drawn. Mathematically, the relationship (their relative locations on the 2-D plane) between the first and second point determines the slope of the curve at the second point. The slope of the curve at the third point is out of control. Thus quadratic splines look much smoother than linear splines but
the transitions at each point are generally not smooth because the slopes on both sides of the point are different.
The cubic_spline
keyword creates splines which overcome the transition problem of quadratic splines because they also take a fourth point into account when drawing the curve between the second and third point. The slope at the fourth point is under control now and allows a smooth transition at each point. Thus cubic splines produce the most flexible and
smooth curves.
The bezier_spline
is an alternate kind of cubic spline. Points 1 and 4 specify the end points of a segment and points 2 and 3 are control points which specify the slope at the endpoints. Points 2 and 3 do not actually lie on the spline. They adjust the slope of the spline. If you draw an imaginary line between point 1 and 2, it represents the slope at point 1.
It is a line tangent to the curve at point 1. The greater the distance between 1 and 2, the flatter the curve. With a short tangent the spline can bend more. The same holds true for control point 3 and endpoint 4. If you want the spline to be smooth between segments, points 3 and 4 on one segment and points 1 and 2 on the next segment must form a straight line and point 4 of one segment must be the same as point 1 on the next segment.
You should note that the number of spline segments, i. e. curves between two points, depends on the spline type used. For linear splines you get n-1 segments connecting the points P[i], i=1,...,n. A quadratic spline gives you n-2 segments because the last point is only used for determining the slope, as explained above (thus you will need at least three points to define a quadratic spline). The same holds for cubic splines where you get n-3 segments with the first and last point used only for slope calculations (thus needing at least four points). The bezier spline requires 4 points per segment, creating n/4 segments.
If you want to get a closed quadratic and cubic spline with smooth transitions at the end points you have to make sure that in the cubic case P[n-1] = P[2] (to get a closed curve), P[n] = P[3] and P[n-2] = P[1] (to smooth the transition). In the quadratic case P[n-1] = P[1] (to close the curve) and P[n] = P[2].
The surface normal determination for lathes depends upon the order in which the splines points are specified. The following code will render with the color Red on the outside and the color Blue on the inside.
#declare Lathe_InitialOrder = lathe { bezier_spline 16, <0.45,0>,<0.45,0.0828427>,<0.382843,0.15>,<0.3,0.15> <0.3,0.15>,<0.217157,0.15>,<0.15,0.0828427>,<0.15,0> <0.15,0>,<0.15,-0.0828427>,<0.217157,-0.15>,<0.3,-0.15> <0.3,-0.15>,<0.382843,-0.15>,<0.45,-0.0828427>,<0.45,0> sturm texture { pigment { Red } } interior_texture { pigment { Blue } } }
While the following example will render inside-out, with the color Blue on the outside and the color Red on the inside.
#declare Lathe_ReverseOrder = lathe { bezier_spline 16, <0.45,0>,<0.45,-0.0828427>,<0.382843,-0.15>,<0.3,-0.15> <0.3,-0.15>,<0.217157,-0.15>,<0.15,-0.0828427>,<0.15,0> <0.15,0>,<0.15,0.0828427>,<0.217157,0.15>,<0.3,0.15> <0.3,0.15>,<0.382843,0.15>,<0.45,0.0828427>,<0.45,0> sturm texture { pigment { Red } } interior_texture { pigment { Blue } } }
The actual normal determination is more complicated for complex splines. If the surface normal is important to the visual result, it is best to check how the lathe is being rendered by testing with substantially different inside and outside textures.
Note: With the bezier spline, unlike all the other spline types used with the lathe, it is possible to create independent closed curves within a single lathe definition.
If additional accuracy is required you can add the sturm
object modifier.
The prism
is an object generated by specifying one or more two-dimensional, closed curves in the x-z plane and sweeping them along y axis. These curves are defined by a set of points which are connected by linear, quadratic, cubic or bezier splines.
The syntax for the prism is:
PRISM: prism { [PRISM_ITEMS...] Height_1, Height_2, Number_Of_Points, <Point_1>, <Point_2>, ... <Point_n> [ open ] [PRISM_MODIFIERS...] } PRISM_ITEM: linear_spline | quadratic_spline | cubic_spline | bezier_spline | linear_sweep | conic_sweep PRISM_MODIFIER: sturm | OBJECT_MODIFIER
Prism default values:
SPLINE_TYPE : linear_spline SWEEP_TYPE : linear_sweep sturm : off
The first items specify the spline type and sweep type. The defaults if none is specified is linear_spline
and linear_sweep
. This is followed by two float values Height_1
and Height_2
which are the y
coordinates of the top and bottom of the prism. This is followed by a float value specifying the number of 2-D points you will use to define the prism.This includes all control points needed for quadratic, cubic and bezier splines. This is followed by the specified number of 2-D vectors which define the shape in the x-z plane.
The interpretation of the points depends on the spline type. The prism object allows you to use any number of sub-prisms inside one prism statement, they are of the same spline and sweep type. Wherever an even number of sub-prisms overlaps a hole appears.
Note: You need not have multiple sub-prisms and they need not overlap as in the following examples.
In the linear_spline
the first point specified is the start of the first sub-prism. The following points are connected by straight lines. If you specify a value identical to the first point, this closes the sub-prism and next point starts a new one. When you specify the value of that sub-prism's start, then it is closed. Each of the sub-prisms has to be closed by repeating the first point of a sub-prism at the end of the sub-prism's point sequence.
In the following example, there are two rectangular sub-prisms nested inside each other to create a frame.
prism { linear_spline 0, 1, 10, <0,0>, <6,0>, <6,8>, <0,8>, <0,0>, //outer rim <1,1>, <5,1>, <5,7>, <1,7>, <1,1> //inner rim }
The last sub-prism of a linear spline prism is automatically closed, just like the last sub-polygon in the polygon statement, if the first and last point of the sub-polygon's point sequence are not the same. This makes it very easy to convert between polygons and prisms. Quadratic, cubic and bezier splines are never automatically closed.
In the quadratic_spline
, each sub-prism needs an additional control point at the beginning of each sub-prisms point sequence to determine the slope at the start of the curve. The first point specified is the control point which is not actually part of the spline. The second point is the start of the spline. The sub-prism ends when this second point is duplicated. The next point is the control point of the next sub-prism. The point after that is the first point of the second sub-prism.
Here is an example:
prism { quadratic_spline 0, 1, 12, <1,-1>, <0,0>, <6,0>, //outer rim; <1,-1> is control point and <6,8>, <0,8>, <0,0>, //<0,0> is first & last point <2,0>, <1,1>, <5,1>, //inner rim; <2,0> is control point and <5,7>, <1,7>, <1,1> //<1,1> is first & last point }
In the cubic_spline
, each sub-prism needs two additional control points, one at the beginning of each sub-prisms point sequence to determine the slope at the start of the curve and one at the end. The first point specified is the control point which is not actually part of the spline. The second point is the start of the spline. The sub-prism ends when this second point is duplicated. The next point is the control point of the end of the first sub-prism. Next is the beginning control point of the next sub-prism. The point after that is the first point of the second sub-prism.
Here is an example:
prism { cubic_spline 0, 1, 14, <1,-1>, <0,0>, <6,0>, //outer rim; First control is <1,-1> and <6,8>, <0,8>, <0,0>, //<0,0> is first & last point. <-1,1>, //Last control of first spline is <-1,1> <2,0>, <1,1>, <5,1>, //inner rim; First control is <2,0> and <5,7>, <1,7>, <1,1>, //<1,1> is first & last point <0,2> //Last control of first spline is <0,2> }
The bezier_spline
is an alternate kind of cubic spline. Points 1 and 4 specify the end points of a segment and points 2 and 3 are control points which specify the slope at the endpoints. Points 2 and 3 do not actually lie on the spline. They adjust the slope of the spline. If you draw an imaginary line between point 1 and 2, it represents the slope at point 1. It is a line tangent to the curve at point 1. The greater the distance between 1 and 2, the flatter the curve. With a short tangent the spline can bend more. The same holds true for control point 3 and endpoint 4. If you want the spline to be smooth between segments, point 3 and 4 on one segment and point 1 and 2 on the next segment must form a straight line and point 4 of one segment must be the same as point one on the next segment.
By default linear sweeping is used to create the prism, that is, the prism's walls are perpendicular to the x-z plane. The size of the curve does not change during the sweep. You can also use conic_sweep
that leads to a prism with cone-like walls by scaling the curve down during the sweep.
Like cylinders the prism is normally closed. You can remove the caps on the prism by using the open
keyword. If you do, you should not use it in CSG operations, because the result may not be as expected.
The surface normal determination for prism sides depends upon the order in which the splines points are specified. Prism ends have normals which face outward at one end and inward at the other end. The following code will render sides with the color Red on the outside and the color Blue on the inside.
#declare Prism_InitialOrder = prism { linear_spline linear_sweep 0,1,5, <0.5,-0.5>,<0.5,0.5>,<0.3,0.5>,<0.3,-0.5>,<0.5,-0.5> texture { pigment { Red } } interior_texture { pigment { Blue } } }
While the following example will render sides inside-out with the color Blue on the outside and the color Red on the inside. Surface normals for the prism ends are unchanged.
#declare Prism_ReverseOrder = prism { linear_spline linear_sweep 0,1,5, <0.5,-0.5>,<0.3,-0.5>,<0.3,0.5>,<0.5,0.5>,<0.5,-0.5> texture { pigment { Red } } interior_texture { pigment { Blue } } }
The actual normal determination is more complicated for complex splines. If the surface normal is important to the visual result, it is best to check how the prism is being rendered by testing with substantially different inside and outside textures.
There is presently a inconsistency with the bezier spline mode of the prism in that the point order with respect to side surface normals is reversed from all other prism spline types. The behavior of the bezier spline prism will likely be aligned with the other spline types in a later release. Further end behavior may be made consistent for all spline types.
If additional accuracy is required you can add the sturm
object modifier.
For an explanation of the spline concept read the description for the Lathe object.