home *** CD-ROM | disk | FTP | other *** search
- 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.
-