Johan Jonker

Technische artikelen

20230622 Openscad round cubeRonde hoeken in OpenSCAD

Een veel gebruikte aanroep in OpenSCAD is de cube([lengte,breedte,hoogte]);  Het resultaat is precies wat er staat. Er wordt een kubus met de gegeven parameters gecreeerd.  Maar daar ronde hoeken aan geven is lastig. Er zijn verschillende mogelijkheden

20230622 Openscad cube

Het resultaat van de kubus aanroep is weinig verrassend en dat is mooi!

Maar als je deze kubus ronde hoeken wil geven dan wordt het ingewikkelder. Dat kan in OpenSCAD alleen maar door het samen te stellen uit losse onderdelen. Die kun je wel weer slim combineren in een module zodat je bijvoorbeeld de aanroep roundcube(lengte, breedte, hoogte, straal) kunt gebruiken in plaats van cube; In het onderstaande voorbeeld wordt de kubus samengesteld uit 12 cilinders op de randen van de kubus, 6 bollen op de hoekpunten en verder nog 3 kubussen om de tussenruimtes op te vullen. Best complex maar eenmaal in een module gestopt werkt het gemakkelijk. Maar helaas kost het wel wat rekenkracht.

module roundcube(breedte,dikte,hoogte,r)
 {

    union()

    {

              translate([r,r,r]) cylinder(hoogte-2*r,r,r);

              translate([r,dikte-r,r]) cylinder(hoogte-2*r,r,r);

              translate([breedte-r,r,r]) cylinder(hoogte-2*r,r,r);

              translate([breedte-r,dikte-r,r]) cylinder(hoogte-2*r,r,r);

              // liggend in breedte richting

              translate([r,r,r]) rotate([0,90,0]) cylinder(breedte-2*r,r,r);

              translate([r,dikte-r,r]) rotate([0,90,0]) cylinder(breedte-2*r,r,r);

              translate([r,r,hoogte-r]) rotate([0,90,0]) cylinder(breedte-2*r,r,r);

              translate([r,dikte-r,hoogte-r]) rotate([0,90,0]) cylinder(breedte-2*r,r,r);

              //liggend in dikte richting

              translate([r,r,r]) rotate([-90,0,0]) cylinder(dikte-2*r,r,r);

              translate([r,r,hoogte-r]) rotate([-90,0,0]) cylinder(dikte-2*r,r,r);

              translate([breedte-r,r,r]) rotate([-90,0,0]) cylinder(dikte-2*r,r,r);

              translate([breedte-r,r,hoogte-r]) rotate([-90,0,0]) cylinder(dikte-2*r,r,r);

              // hoeken

              translate([r,r,r]) sphere(r=r);

              translate([r,dikte-r,r]) sphere(r=r);

              translate([r,dikte-r,hoogte-r]) sphere(r=r);

              translate([r,r,hoogte-r]) sphere(r=r);

              translate([breedte-r,r,r]) sphere(r=r);

              translate([breedte-r,dikte-r,r]) sphere(r=r);

              translate([breedte-r,r,hoogte-r]) sphere(r=r);

              translate([breedte-r,dikte-r,hoogte-r]) sphere(r=r);

              // vullen

              translate([r,0,r]) cube([breedte-2*r, dikte, hoogte-2*r]);

              translate([0,r,r]) cube([breedte, dikte-2*r, hoogte-2*r]);

              translate([r,r,0]) cube([breedte-2*r, dikte-2*r, hoogte]);

              }

  }

 

Je kunt deze kubus ook maken met behulp van de transformatie hull() en alleen maar bollen op de hoekpunten van de kubus:

20230622 Openscad cube hull

De transformatie hull trekt de ruimte tussen twee objecten dicht. In het voorbeeld hierboven is dat twee keer voor twee bollen gedaan. Als je dat nog een paar keer doet vul je de hele kubus.

module roundcube2(breedte,dikte,hoogte,r)

  {

                  hull()

                  {

                                           hull()

                                           {

                                               hull()

                                               {

                                                              translate([r,r,r]) sphere(r=r);

                                                              translate([r,dikte-r,r]) sphere(r=r);

                                               }

                                               hull()

                                               {

                                                              translate([r,dikte-r,hoogte-r]) sphere(r=r);

                                                              translate([r,r,hoogte-r]) sphere(r=r);

                                               }

                                           }

                                           hull()

                                           {

                                               hull()

                                               {

                                                              translate([breedte-r,r,r]) sphere(r=r);

                                                              translate([breedte-r,dikte-r,r]) sphere(r=r);

                                               }

                                               hull()

                                               {

                                                              translate([breedte-r,r,hoogte-r]) sphere(r=r);

                                                              translate([breedte-r,dikte-r,hoogte-r]) sphere(r=r);

                                               }

                                           }

                  }

  }

 

Het resultaat van beide aanroepen is exact hetzelfde. Mogelijk is de ene sneller berekend dan de ander.

20230622 Openscad round cube