Ronde 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
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:
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.