3D tisk umožňuje (v uvozovkách) „tisk“ trojdimenzionálních (trojrozměrných; ve smyslu rozměrů kartézské soustavy souřadnic; se 3 vzájemně kolmými osami) objektů. „3D tisk“ je zlidovělý pojem pro postup syntetizace (slučování, uměle vyráběné), byť by bylo přesnější uvádět 3D aditivní (přídavnou) robotizaci. Nicméně i zlidovělost má svůj význam a proto pojem „3D tisk“ vnímejme se vší vážností, bez ohledu na fakt, že „tisk“ odkazuje na postupy inkoustových tiskáren, kdy je tištěný materiál také injektován (a odtud se význam rozšířil na další techniky - vytlačování, spékání, slinování aj.).

Je nemálo typů (technologií) 3D tiskáren, jejichž ceny se pohybují od tisíců po desítky milionů Kč - FFF (Fused Filament Fabrication) / FDM (Fusing Deposition Modeling), SLA (Stereolitogrpahy apparatus; vytvrzování polymerů pomocí UV), SLS (Selective Laser Sintering), PolyJet, Laminování...​ Pro běžné lidové použití jsou k dispozici cenově dostupné 3D tiskárny, zpravidla založené na open source (při technologickém posunu lze 3D tiskárnu levně rozšířit), mezi které patří i ve své kategorii celosvětově nejlepší 3D tiskárny od českého výrobce Prusa Research.

Pořídíme-li si domů, do školy... 3D tiskárnu, poměrně brzy zjistíme její limity a byť konečné výrobky budou vydařené, zjistíme, že velmi nemalou a podstatnou součásti 3D tisku je návrh digitální podoby modelu, podle které 3D tiskárna konečný výrobek vytiskne. Zpravidla jsou využívány 2 cesty, jak získat digitální model: buď si digitální model vyhotovíme sami anebo si ho stáhneme z některého veřejně sdíleného úložiště. Třetí možností může být úprava modelu získaného z jiného zdroje.

Pokud si chceme model zhotovit sami, volbou mohou být 3 postupy:

Je-li pro nás snadnější si model stáhnout a následně použít pro tisk, je možné využít různých veřejně dostupných zdrojů, např.: ThingiverseGrabCAD RepositorySketchfabCGTraderMyMiniFactoryYeggiPinshapeYouMagin a mnoho dalších.

Existují i tematicky úzce zaměřené zdroje, např.: NASA 3D Resources3D for SchoolTouch MapperBritské muzeumLouvre.

Máme-li k dispozici digitální model, musíme ještě nějak tiskárně sdělit, podle jakých souřadnic má tisknout, jak rychle anebo třeba jakou teplotou má nahřívat trisku, kterou procházím materiál. K tomu lze použít například populární Slic3r od italského programátora Alessandra Ranellucciho, 3D Builder od Microsoftu apod.

Kopule vyhotovená s pomocí 3D tisku svým způsobem je mé první dílo, které jsem začal tisknout na své 3D tiskárně. Vlastně jsem se teprve učil pracovat s 3D tiskem. Zhotovit kopuli s vnitřním průměrem 1,5 metrů mi bylo výzvou. Takovou kopuli používám pro prototyp (předobraz) jedné velmi důležité části tzv. hmatového planetária, ve kterém si lidé mohou hvězdářské jevy prohlédnout hmatem. Avšak myslím si, že leckomu kopule může posloužit i k jiným účelům.

Nechám na vašem uvážení, jak využijete zde prezentované podklady. Kopuli 3D tiskem lze vytvořit - je však na zvážení každého, zda se vydá touto cestou anebo cestou jinou (např. laminování, frézování aj.). ).

Základní geometrie kopule

Mnou použitá 3D tiskárna umožňuje tisk objektů do maximální velikosti 250 x 210 x 200 mm - proto kopule bude složena z několika částí maximálně této velikosti. 

Kopuli bude z vnějšku tvořit mnohostěn a z vnitřní strany kulová plocha s poloměrem zakřivení 750 mm. 

Pro vytvoření vnější geometrie kopule si volím mnohostěn vycházející z Platónského tělesa. V geometrii Platónským tělesem je pravidelný konvexní polyedr (mnohostěn), který je v prostoru omezen shodnými mnohoúhelníky. Platónských těles je pět: tetraedr (čtyřstěn), hexaedr (šestistěn), oktaedr (osmistěn), dodekaedr (dvanáctistěn), ikosaedr (dvacetistěn).  

Volím si trojúhelníkový typ mnohostěnu - tomu odpovídají tetraedr, oktaedr a ikosaedr. Nejblíže kulovému tvaru je ikosaedr, proto vycházím z něj.

Avšak ikosaedr je příliš vzdálen od hladké spojité sféry. Navíc jednotlivé stěny pro kopuli s poloměrem křivosti vnitřní stěny 750 mm by byly pro tisk stále příliš veliké. Namístě tedy je ikosaedr zjemnit. Algoritmů pro zjemnění je více, použiji následující (algoritmus I. (Class 1)): 

  • rozdělení hran na n částí, 
  • spojení vrcholů úsečkami, které jsou rovnoběžné s hranami stěny, 
  • vznik nových průsečíků nových úseček (vrcholů), 
  • předchozí kroky aplikovat na všechny stěny dvacetistěnu, 
  • vznik vrcholů geodetické sféry - tzn. středová projekce nových vrcholů na sféru, která opisuje dvacetistěn 
  • spojení vrcholů geodetické sféry úsečkami. 

Na dvacetistěnu tímto způsobem vznikne (n je stupeň dělení): 

  • počet stěn (s)   10 x n2 + 2 
  • počet vrcholů (v)  20 x n2 
  • počet hran (h)  30 x n2 

Po středové projekci nových vrcholů na sféru v uvedeném případě nejsou všechny trojúhelníky stejné. 

Z vnější části kopule má geometrii geodetické sféry, ale protože vyrábím jen výseč geodetické sféry, je vhodnější hovořit o geodetické kopuli (což samo o sobě neznamená, že bychom geodetickou sféru nemohli vytvořit). 

Protože chci, aby v místě řezu geodetické sféry (resp. kopule) vznikla souvislá hrana, zvolím stupeň dělení n = 6. Potom pro geodetickou sféru platí: 

  • počet vrcholů (v) 10 x 62 + 2 = 362 
  • počet stěn (s)   20 x 62 = 720 
  • počet hran (h)  30 x 62 =  1080 

Výpočet délek hran geodetické kopule mohu spočítat „manuálně“ anebo mohu využít některý software. Samotný podrobný výpočet je mimo rozsah tohoto článku, proto efektivně využijme např. software CADRE Geo. V případě, že máš čtenáři zájem, doporučuji blíže nastudovat Geodesic Dome od Toma Davise. 

Kopule se skládá z 360 panelů

Kopuli tvoří 360 částí – ty jsou tvořeny osmi typy trojúhelníkových stěn (ploch) následujících rozměrů a počtů:

Panel Počet strana a [mm] strana b [mm] strana c [mm]
P1 60 155.157 151.480 157.519
P2 60 165.721 165.721 164.746
P3 60 164.746 157.519 157.519
P4 30 155.157 143.348 139.160
P5 60 157.519 151.480 155.157
P6 30 139.160 139.160 145.715
P7 30 145.715 124.364 124.364
P8 30 155.157 139.160 143.348

Abyste mohli složit celou kopuli, musíte vytisknout 60 kusů panelů P1, P2, P3, P5 a 30 kusů panelů P4, P6, P7, P8.

Soubory ke stažení

Soubory pro tisk:

Soubor pro další úpravu:

Kompletace geodetické kopule

Jednotlivé 3D tiskem vytvořené části jsem se rozhodl poskládat do 40 větších dílčích částí geodetické kopule. Tyto dílčí části jsou zastoupeny dvěma typy:

  • První (na obrázku červená, růžová, modrá, fialová a zelená) je shodně složen z částí P1, P5, P3, P1, P5, P4, P6, P8, P7.
  • Druhý (na obrázku hnědá a šedá) je shodně složen z částí P3, P2, P2, P2, P3, P2, P2, P2, P3.

Ve výsledné kopuli jsou tyto typy různě orientované.

Níže uvádím obrázky, které znázorňují složení jednotlivých části. První obrázek je půdorysným zobrazením, na stranách jsou uvedeny čísla bočních pohledů 1, 2, 3 a 4. Boční pohledy jsou znázorněny na obrázcích následujících.

OpenSCAD (.scad)

Cílová kopule bude složena z jednotlivých panelů, v základně trojúhelníkových. Uvedl jsem rozměry nejen základny (a, b, c) každého panelu, ale také rozměry kopule (vnější a vnitřní průměr). S těmito údaji si nadále vystačím pro naprogramování 3D modelu v OpenSCADu. Styl zápisu programu si dokáži představit v několika jiných podobách, možná i vhodnějších. Níže uvedený kód mi však dostačuje a proto se jeho podobou dále více nezabývám (do budoucna zvažuji komplikovanější útvary, proto jistě více využiji další možnosti OpenSCADu, jako např. module, function aj.).

Základ - tetraedr s kulovým výřezem

Každý panel v podstatě netvoří nic jiného než tetraedr (o výšce rovnající se vnějšímu poloměru kopule a se základnou s rozměry a, b, c, které jsou různé pro každý typ panelu (a tyto rozměry jsou mj. odvozeny také od vnějšího průměru kopule, avšak výpočet do kódu nezanáším, neboť se jedná o samostatnou tematickou oblast)) bez značné části svého vrcholu, který odebírá pomyslná koule o poloměru rovnajícímu se vnitřnímu poloměru kopule, přičemž střed myšlené koule splývá s vrcholem kýženého tetraedru. Zjednodušeně řečeno „neviditelná koule odřízla značnou část čtyřstěnu“.

// rozmery zakladny panelu
a=155.157; b=151.480; c=157.519; // panel P1
//a=165.721; b=165.721; c=164.746; // panel P2
//a=164.746; b=157.519; c=157.519; // panel P3
//a=155.157; b=143.348; c=139.160; // panel P4
//a=157.519; b=151.480; c=155.157; // panel P5
//a=139.160; b=139.160; c=145.715; // panel P6
//a=145.715; b=124.364; c=124.364; // panel P7
//a=155.157; b=139.160; c=143.348; // panel P8

vnejsi_r_kopule=765; // vnejsi polomer kopule
vnitrni_r_kopule=750; // vnitrni polomer kopule

p = (c+b+a)/2; 
h = 2/a * sqrt(p*(p-a)*(p-b)*(p-c)); 
gama = asin(h/b); beta = asin(h/c); alfa = 180-beta-gama; 
R_opsana=(a*b*c)/(4*sqrt(p*(p-a)*(p-b)*(p-c))); // polomer kruznice opsane (trojuhelnikove zakladny) 
r_vepsana=sqrt(((p-a)*(p-b)*(p-c))/p); // polomer kruznice vepsane (trojuhelnikove zakladny) 

dx=a/2; 
dy=sqrt(pow(R_opsana,2)-pow(a/2,2)); 
dz=sqrt(pow(vnejsi_r_kopule,2)-pow(R_opsana,2)); 
posun_x = dx; posun_y = dy; 
Ax = (sqrt(pow(b,2)-pow(h,2)))-posun_x; Ay = h-posun_y; Az = 0; 
Bx = a-posun_x; By = 0-posun_y; Bz = 0; 
Cx = 0-posun_x; Cy = 0-posun_y; Cz = 0; 
Dx=0; Dy=0; Dz=dz; 

ctyrsten_alfa = acos(h/(2*vnejsi_r_kopule)); 

rotate(a=[90+(90-ctyrsten_alfa)/2,0,0]) { 
difference() {
  //ctyrsten 
  polyhedron( 
    points=[ 
    //x,y,z 
    [Ax,Ay,Az], //0 
    [Bx,By,Bz], //1 
    [Cx,Cy,Cz], //2 
    [Dx,Dy,Dz]  //3 
    ], 
    faces=[ 
    [0,1,3], 
    [1,2,3], 
    [2,0,3], 
    [1,0,2] 
    ]); 
  //koule 
  translate([0,0,Dz]) 
  rotate (a= [90,0,0]) 
  sphere(vnitrni_r_kopule, $fa=1, $fs=0.1); 

} 

Ztenčení

Je zbytečné, aby jednotlivé panely obsahovaly tolik materiálu (může mít vliv na výslednou hmotnost a jednotlivé panely by bylo nutné nepřiměřeně dlouho tisknout - obojí uvedené nemusí platit vždy, záleží totiž na způsobu tisku). Pro kopuli nakonec jsou využity jen vnitřní stěna kopule a pak stěny, které spojují jednotlivé panely. A proto od výše uvedeného základu můžeme „odečíst svou zmenšeninu“.

// rozmery zakladny panelu
a=155.157; b=151.480; c=157.519; // panel P1
//a=165.721; b=165.721; c=164.746; // panel P2
//a=164.746; b=157.519; c=157.519; // panel P3
//a=155.157; b=143.348; c=139.160; // panel P4
//a=157.519; b=151.480; c=155.157; // panel P5
//a=139.160; b=139.160; c=145.715; // panel P6
//a=145.715; b=124.364; c=124.364; // panel P7
//a=155.157; b=139.160; c=143.348; // panel P8

vnejsi_r_kopule=765; // vnejsi polomer kopule
vnitrni_r_kopule=750; // vnitrni polomer kopule

p = (c+b+a)/2; 
h = 2/a * sqrt(p*(p-a)*(p-b)*(p-c)); 
gama = asin(h/b); beta = asin(h/c); alfa = 180-beta-gama; 
R_opsana=(a*b*c)/(4*sqrt(p*(p-a)*(p-b)*(p-c))); // polomer kruznice opsane (trojuhelnikove zakladny) 
r_vepsana=sqrt(((p-a)*(p-b)*(p-c))/p); // polomer kruznice vepsane (trojuhelnikove zakladny) 

dx=a/2; 
dy=sqrt(pow(R_opsana,2)-pow(a/2,2)); 
dz=sqrt(pow(vnejsi_r_kopule,2)-pow(R_opsana,2)); 
posun_x = dx; posun_y = dy; 
Ax = (sqrt(pow(b,2)-pow(h,2)))-posun_x; Ay = h-posun_y; Az = 0; 
Bx = a-posun_x; By = 0-posun_y; Bz = 0; 
Cx = 0-posun_x; Cy = 0-posun_y; Cz = 0; 
Dx=0; Dy=0; Dz=dz; 

ctyrsten_alfa = acos(h/(2*vnejsi_r_kopule)); 

rotate(a=[90+(90-ctyrsten_alfa)/2,0,0]) { 
difference() {
  //ctyrsten 
  polyhedron( 
    points=[ 
    //x,y,z 
    [Ax,Ay,Az], //0 
    [Bx,By,Bz], //1 
    [Cx,Cy,Cz], //2 
    [Dx,Dy,Dz]  //3 
    ], 
    faces=[ 
    [0,1,3], 
    [1,2,3], 
    [2,0,3], 
    [1,0,2] 
    ]); 
  //koule 
  translate([0,0,Dz]) 
  rotate (a= [90,0,0]) 
  sphere(vnitrni_r_kopule, $fa=1, $fs=0.1); 

//---------------- 
  translate([0,0,-4]) { 
   difference() { 
    scale([0.96,0.96,0.96])  
     polyhedron( 
       points=[ 
       //x,y,z 
       [Ax,Ay,Az], //0 
       [Bx,By,Bz], //1 
       [Cx,Cy,Cz], //2 
       [Dx,Dy,Dz]],  //3 
       faces=[ 
       [0,1,3], 
       [1,2,3], 
       [2,0,3], 
       [1,0,2] 
       ]); 
     //koule 
     translate([0,0,Dz]) 
     sphere(vnitrni_r_kopule, $fa=1, $fs=0.1); 
   } 
  } 

//----------------
 
} 

Otvory pro spojovací šroubky

Jednotlivé panely je nutné nějak poskládat. Je možné volit slepení vhodným pojidlem, svaření, či mnohé jiné způsoby. Já jsem zvolil spojení šroubky. Proto na každé stěně, která přiléhá k jinému panelu jsem vytvořil tři otvory.

// rozmery zakladny panelu
a=155.157; b=151.480; c=157.519; // panel P1
//a=165.721; b=165.721; c=164.746; // panel P2
//a=164.746; b=157.519; c=157.519; // panel P3
//a=155.157; b=143.348; c=139.160; // panel P4
//a=157.519; b=151.480; c=155.157; // panel P5
//a=139.160; b=139.160; c=145.715; // panel P6
//a=145.715; b=124.364; c=124.364; // panel P7
//a=155.157; b=139.160; c=143.348; // panel P8

vnejsi_r_kopule=765; // vnejsi polomer kopule
vnitrni_r_kopule=750; // vnitrni polomer kopule

p = (c+b+a)/2; 
h = 2/a * sqrt(p*(p-a)*(p-b)*(p-c)); 
gama = asin(h/b); beta = asin(h/c); alfa = 180-beta-gama; 
R_opsana=(a*b*c)/(4*sqrt(p*(p-a)*(p-b)*(p-c))); // polomer kruznice opsane (trojuhelnikove zakladny) 
r_vepsana=sqrt(((p-a)*(p-b)*(p-c))/p); // polomer kruznice vepsane (trojuhelnikove zakladny) 

dx=a/2; 
dy=sqrt(pow(R_opsana,2)-pow(a/2,2)); 
dz=sqrt(pow(vnejsi_r_kopule,2)-pow(R_opsana,2)); 
posun_x = dx; posun_y = dy; 
Ax = (sqrt(pow(b,2)-pow(h,2)))-posun_x; Ay = h-posun_y; Az = 0; 
Bx = a-posun_x; By = 0-posun_y; Bz = 0; 
Cx = 0-posun_x; Cy = 0-posun_y; Cz = 0; 
Dx=0; Dy=0; Dz=dz; 

ctyrsten_alfa = acos(h/(2*vnejsi_r_kopule)); 

rotate(a=[90+(90-ctyrsten_alfa)/2,0,0]) { 
difference() {
  //ctyrsten 
  polyhedron( 
    points=[ 
    //x,y,z 
    [Ax,Ay,Az], //0 
    [Bx,By,Bz], //1 
    [Cx,Cy,Cz], //2 
    [Dx,Dy,Dz]  //3 
    ], 
    faces=[ 
    [0,1,3], 
    [1,2,3], 
    [2,0,3], 
    [1,0,2] 
    ]); 
  //koule 
  translate([0,0,Dz]) 
  rotate (a= [90,0,0]) 
  sphere(vnitrni_r_kopule, $fa=1, $fs=0.1); 

//---------------- 
  translate([0,0,-4]) { 
   difference() { 
    scale([0.96,0.96,0.96])  
     polyhedron( 
       points=[ 
       //x,y,z 
       [Ax,Ay,Az], //0 
       [Bx,By,Bz], //1 
       [Cx,Cy,Cz], //2 
       [Dx,Dy,Dz]],  //3 
       faces=[ 
       [0,1,3], 
       [1,2,3], 
       [2,0,3], 
       [1,0,2] 
       ]); 
     //koule 
     translate([0,0,Dz]) 
     sphere(vnitrni_r_kopule, $fa=1, $fs=0.1); 
   } 
  } 

//----------------

  spoj_xa1 = 0; 
  spoj_ya1 = 0-posun_y; 

  spoj_xb1 = b/2*cos(gama)-posun_x; 
  spoj_yb1 = b/2*sin(gama)-posun_y; 
  spoj_xc1 = a-(c/2*cos(beta))-posun_x; 
  spoj_yc1 = c/2*sin(beta)-posun_y; 
   
  spoj_xa2 = 0-50; 
  spoj_ya2 = 0-posun_y; 
  spoj_xb2 = (b-100)/2*cos(gama)-posun_x; 
  spoj_yb2 = (b-100)/2*sin(gama)-posun_y; 
  spoj_xc2 = a-((c-100)/2*cos(beta))-posun_x; 
  spoj_yc2 = (c-100)/2*sin(beta)-posun_y; 
 
  spoj_xa3 = 0+50; 
  spoj_ya3 = 0-posun_y; 
  spoj_xb3 = (b+100)/2*cos(gama)-posun_x; 
  spoj_yb3 = (b+100)/2*sin(gama)-posun_y; 
  spoj_xc3 = a-((c+100)/2*cos(beta))-posun_x; 
  spoj_yc3 = (c+100)/2*sin(beta)-posun_y; 

  translate([spoj_xa1,spoj_ya1,3]) rotate(a=[90,0,0]) { 
  translate([0,0,-5]) cylinder(h=5,r=1.5,$fs=0.1, 
  center=false); 
  } 
  translate([spoj_xb1,spoj_yb1,3]) rotate(a=[90,0,gama+180]) { 
  translate([0,0,-5]) cylinder(h=5,r=1.5,$fs=0.1, 
  center=false); 
  } 
  translate([spoj_xc1,spoj_yc1,3]) rotate(a=[90,0,180-beta]) { 
  translate([0,0,-5]) cylinder(h=5,r=1.5,$fs=0.1, 
  center=false); 
  }   
      
  translate([spoj_xa2,spoj_ya2,5]) rotate(a=[90,0,0]) { 
  translate([0,0,-5]) cylinder(h=5,r=1.5,$fs=0.1,center=false); 
  } 
  translate([spoj_xb2,spoj_yb2,5]) rotate(a=[90,0,gama+180]) { 
  translate([0,0,-5]) cylinder(h=5,r=1.5,$fs=0.1,center=false); 
  } 
  translate([spoj_xc2,spoj_yc2,5]) rotate(a=[90,0,180-beta]) { 
  translate([0,0,-5]) cylinder(h=5,r=1.5,$fs=0.1,center=false); 
  }   
 
  translate([spoj_xa3,spoj_ya3,5]) rotate(a=[90,0,0]) { 
  translate([0,0,-5]) cylinder(h=5,r=1.5,$fs=0.1,center=false); 
  } 
  translate([spoj_xb3,spoj_yb3,5]) rotate(a=[90,0,gama+180]) { 
  translate([0,0,-5]) cylinder(h=5,r=1.5,$fs=0.1,center=false); 
  } 
  translate([spoj_xc3,spoj_yc3,5]) rotate(a=[90,0,180-beta]) { 
  translate([0,0,-5])  cylinder(h=5,r=1.5,$fs=0.1,center=false); 
  }

//---------------- 

}  
}