Example scene: Cut menger sponge with recursion depth 6.
// C++ code
Object3D* make_menger(double length, int depth) {
if (depth>0) {
Object3D* piece = make_menger(length/3,depth-1);
CSG* u = new CSG(CSG::UNION);
Object3D* q = piece->duplicate();
q->translate(Vector3(-length/3,-length/3,-length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(-length/3,-length/3,length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(-length/3,length/3,-length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(-length/3,length/3,length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(length/3,-length/3,-length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(length/3,-length/3,length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(length/3,length/3,-length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(length/3,length/3,length/3));
u->addObject(q);
//
q = piece->duplicate();
q->translate(Vector3(-length/3,-length/3,0));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(length/3,-length/3,0));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(-length/3,length/3,0));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(length/3,length/3,0));
u->addObject(q);
//
q = piece->duplicate();
q->translate(Vector3(0,-length/3,-length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(0,length/3,-length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(0,-length/3,length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(0,length/3,length/3));
u->addObject(q);
//
q = piece->duplicate();
q->translate(Vector3(-length/3,0,-length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(length/3,0,-length/3));
u->addObject(q);
q = piece->duplicate();
q->translate(Vector3(-length/3,0,length/3));
u->addObject(q);
q = piece;
q->translate(Vector3(length/3,0,length/3));
u->addObject(q);
u->close();
return u;
} else
{
Object3D* o = new Box(-length/2*1.0001,length/2*1.0001);
return o;
}
}
Pigment3D* setUpScene_Menger() {
Scene* s = new Scene();
CSG* csg = new CSG(CSG::INTERSECT);
Object3D* menger = make_menger(3,3);
csg->addObject(menger);
Plane *pl = new Plane(Vector3(0,1,0));
pl->translate(Vector3(0,1.1,0));
pl->rotate(Vector3(-45,-40,0));
csg->addObject(pl);
csg->setPigment(Pigment3DConstant(Colour5(.7,.7,.7,0,0)));
csg->setFinish(Finish(0.03,0.3,0.6,1,5));
csg->rotate(Vector3(11,23,0));
csg->translate(Vector3(0,0,6));
s->addObject(csg);
PointLight* p = new PointLight(Vector3(0,10,-8),Colour3(1),s);
s->addLight(p);
PointLight* p2 = new PointLight(Vector3(-3,4,-6),Colour3(.5),s);
s->addLight(p2);
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;
};
// same in pov SDL
#macro menger(l,d)
#if (d>0)
#local p = menger(l/3,d-1)
union{
#declare ix=-1; #while(ix<2)
#declare iy=-1; #while(iy<2)
#declare iz=-1; #while(iz<2)
#if ((ix!=0 & iy!=0) | (iy!=0 & iz!=0) | (ix!=0 & iz!=0))
object{p translate <ix,iy,iz>*l/3}
#end
#declare iz=iz+1; #end
#declare iy=iy+1; #end
#declare ix=ix+1; #end
}
#else box{-l/2*1.0001,l/2*1.0001} #end
#end
intersection{
object{menger(3,6)}
plane{y,0 translate<0,1.1,0> rotate<-45,-40,0>}
pigment{rgb .7}
finish{ambient .03 diffuse 0.3 reflection .6 phong 1 phong_size 5}
rotate<11,23,0>
translate<0,0,6>
}
light_source{<0,10,-8>,1}
light_source{<-3,4,-6>,.5}
global_settings{
max_trace_level 100
adc_bailout 1/100
}
Don't try to render the pov code with POV-Ray. It would take tons of memory and months of render time.
Different ways are needed to model this in POV-Ray.