Reference:Parametric

From POV-Wiki
Revision as of 21:56, 21 November 2016 by Jholsenback (talk | contribs) (markup and grammar cleanup)
Jump to navigation Jump to search

While the isosurface object uses implicit surface functions like F(x,y,z) = 0 the parametric object uses is a set of equations for a surface expressed in the form of the parameters that locate points on the surface. For example: x(u,v), y(u,v), z(u,v). Each of the pairs of values for u and v gives a single point <x,y,z> in 3d space.

The parametric object is not a solid it is hollow, like a thin shell. The syntax is as follows:

parametric {
  function { FUNCTION_ITEMS },
  function { FUNCTION_ITEMS },
  function { FUNCTION_ITEMS }
  
  <u1,v1>, <u2,v2>
  [contained_by { SPHERE | BOX }]
  [max_gradient FLOAT_VALUE]
  [accuracy FLOAT_VALUE]
  [precompute DEPTH, VarList]
  }

The default values are:

accuracy     : 0.001
contained_by : box {<-1,-1,-1>, <1,1,1>} 
  1. The first function calculates the x value of the surface, the second y and the third the z value. Any function that results in a float is allowed.
  2. The <u1,v1> and the <u2,v2> boundaries of the (u,v) space, in which the surface has to be calculated.
  3. The contained_by object limits the area where POV-Ray samples for the surface of the function. The container can either be a sphere or a box.
  4. The max_gradient is the maximum magnitude of all six partial derivatives over the specified ranges of u and v. That is, if you take dx/du, dx/dv, dy/du, dy/dv, dz/du, and dz/dv and calculate them over the entire range, the max_gradient is the maximum of the absolute values of all of those values.
  5. For accuracy smaller values produces more accurate surfaces, but take longer to render.
  6. Using precompute can speedup rendering of parametric surfaces. It simply divides parametric surfaces into small ones (2^depth) and precomputes the ranges of the variables (x,y,z) which you specify after depth. The maximum depth is 20. High values of depth can produce arrays that use a lot of memory, take longer to parse and render faster. If you declare a parametric surface with the precompute keyword and then use it twice, all arrays are in memory only once.

Example, a unit sphere:

parametric {
  function { sin(u)*cos(v) }
  function { sin(u)*sin(v) }
  function { cos(u) }

  <0,0>, <2*pi,pi>
  contained_by { sphere{0, 1.1} }
  max_gradient ??
  accuracy 0.0001
  precompute 10 x,y,z
  pigment {rgb 1}
  }