There is also a way to report if the specified 2nd derivative is too small and for finding an appriate value for it.
Example scene
//C++ code
class MyFunction: public Isosurface::IsosurfaceFunction {
public:
MyFunction():evalcount("Function","Evaluations","") {}
DBL evaluateAt(const Vector3& v) const {
evalcount.eval();
DBL x = v.a[0]; DBL y = v.a[1]; DBL z=v.a[2];
DBL k=5, a=0.95, b=0.8;
return pow( (x*x+y*y+z*z-a*k*k),2 )-b*( pow(z-k,2)-2*x*x )*( pow(z+k,2)-2*y*y );
}
private:
mutable HitStatistics evalcount;
};
Pigment3D* setUpScene_Isosurface() {
Scene* s = new Scene();
Pigment3DMapped check = Pigment3DMapped(new Checker());
check.insertCol(0.5,Colour3(1,0,0));
check.insertCol(.5,Colour3(0,0,0));
Pigment3DMapped imap = Pigment3DMapped(new Gradient(Vector3(1,0,0)));
imap.insertCol(0,Colour3(1,1,1));
imap.insert(1,check.copy());
Plane *pl = new Plane(Vector3(0,1,0));
pl->setPigment(imap);
pl->setFinish(Finish(0.1,0.6,0.2,1,1));
pl->translate(Vector3(0,-2,0));
s->addObject(pl);
pl = new Plane(Vector3(0,0,1));
pl->setPigment(Pigment3DConstant(Colour5(1,1,1,0,0)));
pl->translate(Vector3(0,0,15));
s->addObject(pl);
MyFunction* myf = new MyFunction();
Isosurface* myiso = new Isosurface(myf,new Sphere(6),160,true);
myiso->scale(Vector3(.5,.5,.5));
myiso->rotate(Vector3(0,35,0));
myiso->translate(Vector3(0,0,5));
myiso->setPigment(Pigment3DConstant(Colour5(1,1,1,0,0.65)));
myiso->setInterior(Interior(1.33,0));
myiso->setFinish(Finish(0.05,0.6,0.3,1.5,10));
s->addObject(myiso);
PointLight* p = new PointLight(Vector3(0,10,-8),Colour3(1),s);
s->addLight(p);
Material3D m = Material3D(new Texture3D(new Pigment3DConstant(Colour5(0)), new Finish(0.1,0.6,0,0,0)), new Interior() );
s->setDefaultMaterial(m);
s->object.prepareToRender();
CameraPerspective* c = new CameraPerspective(s);
return c;
};
// equvalient pov scene code
#declare check = pigment{checker rgb <1,0,0>,rgb 0};
plane{y,0
pigment{
gradient x
pigment_map{
[0 rgb 1]
[1 check]
}
}
finish{ambient 0.1 diffuse .6 reflection .2 phong 1 phong_size 1}
translate<0,-2,0>
}
plane{z,0
pigment{rgb 1}
translate<0,0,15>
}
#declare k=5;
#declare a=0.95;
#declare b=0.8;
isosurface{
function{
pow( (x*x+y*y+z*z-a*k*k),2 )-b*( pow(z-k,2)-2*x*x )*( pow(z+k,2)-2*y*y )
}
contained_by{
sphere{0,6}
}
max_gradient 900
scale .5
rotate<0,35,0>
translate<0,0,5>
pigment{rgbt <1,1,1,.65>}
interior{
ior 1.33
}
finish{ambient 0.05 diffuse .6 reflection .3 phong 1 phong_size 10}
}
light_source{
<0,10,-8>,1
}
global_settings{
max_trace_level 100 adc_bailout 1/100
}