0

我试图在我的 Printrbot 上打印出一个 300 毫米的空心球体,方法是将球体的内腔塑造为规则的外接多面体,并根据外接多面体的侧面分割球体。我首先用一个立方体进行了尝试,得到了 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);
}
4

1 回答 1

1

您实际上可以使用类似于现有 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]);
    }
}

您还可以通过使用in来简化hollow_sphere(并使其名称更准确)。这在计算上更加昂贵,但大大简化了代码。传递的 to最终将成为十二面体顶点处的最小厚度:hullsideshell_thicknesshollow_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 截图

于 2015-05-15T23:04:49.577 回答