2015-05-01 41 views
0

我试图在我的Printrbot上打印出一个300mm的空心球体,将球体的内部空腔塑造成一个规则的外接多面体,并根据外接多面体的边分割球体。我首先尝试使用立方体,结果是6面有3d可打印的平底,但是由于打印机的构建体积有限(150x150x150毫米),所以得到的面的〜175毫米边缘不适合。基于外接十二面体的分裂空心球体

下一个合理的阶梯似乎是将被限制的多面体改变成十二面体并且打印出12个面而不是6个面,但是,我在计算如何正确地将五边形面投影到球面上并切片时遇到了一些麻烦相应地增加。有什么方法可以获得球体和投影十二面体的交点?我目前的代码如下。

$fn = 72; 

diameter=300; 

side(); 

module side() 
{ 
    difference() 
    { 
     hollow_sphere(diameter); 
     rotate([180,0,0]) 
     fiveSideMask(); 
    } 
} 

// A cubic mask to remove all sides but one from the circle 
module fiveSideMask() 
{ 
    union() 
    { 
     rotate([45,0,0]) 
     translate([0,-diameter/4, 0]) 
     cube([diameter, diameter/2, diameter], center=true); 
     rotate([-45,0,0]) 
     translate([0,-diameter/4, 0]) 
     cube([diameter, diameter/2, diameter], center=true); 
     rotate([0,0,45]) 
     translate([0,-diameter/4, 0]) 
     cube([diameter, diameter/2, diameter], center=true); 
     rotate([0,0,-45]) 
     translate([0,-diameter/4, 0]) 
     cube([diameter, diameter/2, diameter], center=true); 
    } 
} 


module hollow_sphere(diameter=300, shell_thickness=5) 
{ 
    difference() 
    { 
     sphere(d=diameter, center=true); 
     //Sphere internal cavity 
     //sphere(d=(diameter-(shell_thickness*2)), center=true); 

     //Cube internal cavity 
     cube(CubeEdgeFromDiag(diameter - shell_thickness * 2), center=true); 

     //Dodecahedron internal cavity 
     //rotate([90,0,0]) 
     //dodecahedron(225); 
    } 
} 

function CubeEdgeFromDiag(diagLength) = (sqrt(3) * diagLength)/3; 

module dodecahedron(size) 
{ 
    dihedral = 116.565; 
    intersection() 
    { 
     box(size); 
     intersection_for(i=[1:5]) 
     { 
      rotate([dihedral, 0, 360/5 * i]) box(size); 
     } 
    } 
} 

module box(size) 
{ 
    cube([2*size, 2*size, size], center = true); 
} 

回答

0

实际上,你可以使用类似于现有 fiveSideMask模块,但不是围绕一个方形金字塔切割,你将要在五棱锥被切割技术:

// A mask to remove everything from the sphere but the projection of the face. 
module sideMask() { 
    union() { 
     radius = diameter/2; 

     dihedral_angle = acos(-1/sqrt(5)); 
     // Five slabs adjacent to the pentagonal-pyramind that projects out 
     // around the face. 
     for (theta = [0:360/5:359]) { 
      rotate([90 - dihedral_angle,0,theta]) 
       translate([-diameter/2,0, 0]) 
        cube([diameter, radius, diameter]); 
     } 
     // We also want to mask out the opposite side of the sphere. 
     translate([-radius, -radius, -radius]) 
      cube([diameter, diameter, radius]); 
    } 
} 

你也可以通过在side中使用hull来简化hollow_sphere(并使其名称更准确)。这在计算上更加昂贵,但是大大简化了代码。该shell_thickness传递给hollow_sphere最终会被最小厚度,在十二面体的顶点:

module side() { 
    // hull() is pretty expensive, but it nicely flattens out the bottom of the 
    // shape, making for something easily printable. 
    hull() difference() { 
     hollow_sphere(diameter); 
     rotate([180,0,0]) 
     sideMask(); 
    } 
} 

module hollow_sphere(diameter=300, shell_thickness=15) { 
    difference() { 
     sphere(d=diameter); 
     sphere(d=diameter - shell_thickness); 
    } 
} 

你需要保持唯一的其他东西都在该文件的顶部的几行...

$fn = 72; 

diameter=300; 

side(); 

...你会得到这样的事情:

OpenSCAD screenshot