home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Inside Multimedia 1995 December
/
IMM1295.ISO
/
share
/
grafik
/
povhelp
/
bicubic.hlp
< prev
next >
Wrap
Text File
|
1994-07-04
|
5KB
|
87 lines
A bicubic patch is a 3D curved surface created from a mesh of triangles.
POV-Ray supports a type of bicubic patch called a Bezier patch. A bicubic
patch is defined as follows:
bicubic_patch {
type PATCH_TYPE
flatness FLATNESS_VALUE
u_steps NUM_U_STEPS
v_steps NUM_V_STEPS
<CP1>, <CP2>, <CP3>, <CP4>,
<CP5>, <CP6>, <CP7>, <CP8>,
<CP9>, <CP10>, <CP11>, <CP12>,
<CP13>, <CP14>, <CP15>, <CP16>
}
The keyword 'type' is followed by a float PATCH_TYPE which currently must
be either 0 or 1. For type 0 only the control points are retained within
POV-Ray. This means that a minimal amount of memory is needed, but POV- Ray
will need to perform many extra calculations when trying to render the
patch. Type 1 preprocesses the patch into many subpatches. This results in
a significant speedup in rendering, at the cost of memory.
These 4 parameters: type, flatness, u_steps & v_steps, may appear in any
order. They are followed by 16 vectors that define the x,y,z coordinates of
the 16 control points which define the patch. The patch touches the 4 cor-
ner points <CP1>, <CP4>, <CP13> and <CP16> while the other 12 points pull
and stretch the patch into shape.
The keywords 'u_steps' and 'v_steps' are each followed by float values
which tell how many rows and columns of triangles are the minimum to use to
create the surface. The maximum number of individual pieces of the patch
that are tested by POV-Ray can be calculated from the following:
sub-pieces = 2^u_steps * 2^v_steps
This means that you really should keep 'u_steps' and 'v_steps' under 4
or 5. Most patches look just fine with 'u_steps 3' and 'v_steps 3', which
translates to 64 subpatches (128 smooth triangles).
As POV-Ray processes the Bezier patch, it makes a test of the current
piece of the patch to see if it is flat enough to just pretend it is a rec-
tangle. The statement that controls this test is: 'flatness xxx'. Typical
flatness values range from 0 to 1 (the lower the slower).
If the value for flatness is 0, then POV-Ray will always subdivide the
patch to the extend specified by u_steps and v_steps. If flatness is grea-
ter than 0, then every time the patch is split, POV-Ray will check to see if
there is any need to split further.
There are both advantages and disadvantages to using a non-zero flatness.
The advantages include:
a) If the patch isn't very curved, then this will be detected and
POV-Ray won't waste a lot of time looking at the wrong pieces.
b) If the patch is only highly curved in a couple of places, POV-Ray
will keep subdividing there and concentrate it's efforts on the
hard part.
The biggest disadvantage is that if POV-Ray stops subdividing at a parti-
cular level on one part of the patch and at a different level on an adjacent
part of the patch, there is the potential for 'cracking'. This is typically
visible as spots within the patch where you can see through. How bad this
appears depends very highly on the angle at which you are viewing the patch.
Like triangles, the bicubic patch is not meant to be generated by hand.
These shapes should be created by a special utility. You may be able to
acquire utilities to generate these shapes from the same source from which
you obtained POV-Ray. For example:
bicubic_patch {
type 1
flatness 0.01
u_steps 4
v_steps 4
<0, 0, 2>, <1, 0, 0>, <2, 0, 0>, <3, 0, -2>,
<0, 1 0>, <1, 1, 0>, <2, 1, 0>, <3, 1, 0>,
<0, 2, 0>, <1, 2, 0>, <2, 2, 0>, <3, 2, 0>,
<0, 3, 2>, <1, 3, 0>, <2, 3, 0>, <3, 3, -2>
}
The triangles in a POV-Ray bicubic_patch are automatically smoothed using
normal interpolation but it is up to the user (or the user's utility pro-
gram) to create control points which smoothly stitch together groups of
patches.
As with the other shapes, bicubic_patch objects can be translated, rota-
ted, and scaled. Because they are finite they respond to automatic boun-
ding. Since it's made from triangles, a bicubic_patch cannot be used in CSG
intersection or difference types or inside a clipped_by modifier because
triangles have no clear 'inside'. The CSG union type works acceptably.