.
On the left is a perfect sphere which has been given a wrinkled surface using a bump map. Mathematically, POV-Ray's internal "agate" function is used to define a value for each point on the surface of the sphere. This value is used as an apparent height of the sphere's surface above or below where the surface should be and this changes the way that light is simulated to reflect from the surface of the sphere. However, its size and shape are not changed in 3D-space. Consequently, the object's outline and the shadow cast on the ground remain those of a perfect, non-bumpy sphere. An unrealistic hard shadow is also visible on the surface of the sphere, about a third of the way from the top.
On the right is a roughly spherical object on which wrinkles have been modelled in 3D-space. Mathematically, the same "agate" function is subtracted from a function defining a sphere, x2+y2+z2-Radius2, and all points in space where this sum is zero define the surface of the resulting object, referred to as an w:isosurface. This results in an object that is a modification in 3D-space of an otherwise perfect sphere. Consequently, the object's outline and the shadow cast on the ground are also visibly wrinkled, and the shadowing on the surface of the object is more realistic.
#version 3.6;
global_settings {
assumed_gamma 1.0
ambient_light 0
radiosity {
pretrace_start 0.08
pretrace_end 0.04
count 35
nearest_count 5
error_bound 1.8
recursion_limit 3
low_error_factor .5
gray_threshold 0.0
minimum_reuse 0.015
brightness 1
adc_bailout 0.01/2
normal on
media off
always_sample on
max_sample 1.0
}
}
fog{
fog_type 1
distance 9
rgb 0
turbulence 5
}
// ----------------------------------------
camera {
location <0.0, 1.5, -4>
direction z
right x*image_width/image_height
look_at <0.0, 0, -1.4>
}
light_source { <0, 5, -3> color rgb <1, 1, 1>*.6
area_light <3,0,0>,<0,0,3> 10,10 orient circular
}
light_source { <0, 100, 80> color rgb <1, 1, 1> }
// ----------------------------------------
plane {
y, -1
pigment { color rgb 1 }
finish {ambient 0}
}
#declare mytex=texture{pigment { colour rgb <1,0,0> }
finish{ specular 0.09 roughness .0075 diffuse .85 ambient 0 reflection 0.0}}
#include "functions.inc"
#declare bump_func=function{f_agate(x/.5,y/.5,z/.5)*.1}
#declare sphere_func=function(x,y,z,Radius,xoff,yoff,zoff){pow(x-xoff,2)+pow(y-yoff,2)+pow(z-zoff,2)-pow(Radius,2)}
isosurface {
function {sphere_func(x,y,z,1,0,0,0)-bump_func(x,y,z)*.71}
max_gradient 8
contained_by { sphere { 0, 1.5 } }
texture {mytex}
translate x*1.5
}
sphere { 0, 1
texture {mytex
normal {function {bump_func(x,y,z)*10*.25} accuracy .0002 bump_size 1}
}
rotate -y*32
translate -x*1.5
}