Embosování hvězdokup v OpenSCADu

AgoraTmavomodrý festival společně s Hvězdárnou a planetáriem Brno pro nevidomé a slabozraké připravili na 17. května 2019 jedinečnou akci – pozorování večerní oblohy. Všechny podstatné informace se dozvíte na www.nesmir.cz; avšak jinou měrou podstatná je příprava, která probíhá již nyní a s níž si alespoň z pohledu tvorby některých pomůcek dovolím čtenáře Pélionu seznámit.

Bude-li 17. května 2019 večer jasno, oblohu ovládne Měsíc téměř v úplňku, jehož dosáhne 18. května. Model Měsíce máme již vyhotovený – viz článek 3D model Měsíce (A Touch of the Universe), tak se nyní zaměřujeme na tvorbu hmatových modelů dalších – dnes se zmíním o tvorbě relativně nízkých reliéfů kulové hvězdokupy M13 (ze souhvězdí Herkula) a otevřené hvězdokupy M45 (ze souhvězdí Býka; jinak označované jako Kuřátka či Sedm sester).

Hvězdokupy jsou fyzikálně seskupené (gravitačně vázané) hvězdy. Známe dva základní typy hvězdokup – otevřené a kulové. Zatímco méně početné (desítky až stovky hvězd) otevřené hvězdokupy nemají specifický tvar, početnější (statisíce hvězd) kulové hvězdokupy mají tvar téměř kulový. O hvězdokupách bychom mohli zapáleně hovořit hodiny – více vás s nimi seznámí pracovníci Hvězdárny a planetária Brno na zmiňované akci. Nicméně z našeho pohledu jistě stojí za zmínku fakt, že jak otevřené, tak kulové hvězdokupy jsou od nás velmi vzdálené: hvězdokupa M13 přibližně 23150 světelných let, hvězdokupa M45 přibližně 440 světelných let. Přitom světelný rok je vzdálenost, kterou světlo ve vakuu urazí za jeden juliánský rok – a světlo je setsakramentsky rychlé, za rok urazí přibližně 10 bilionů kilometrů. Tyto objekty jsou od nás natolik vzdálené, že ani dalekohledem je lidé nevidí trojrozměrně, ale dvourozměrné. Člověk si s rozvojem poznání odvodil jejich třírozměrnou podobu, která se stala součástí sociálně-kulturního prostředí, takže při zobrazení dalekohledem si mnozí pozorovatelé automaticky představí jejich alespoň přibližnou třírozměrnou podobu.

Příkazy OpenSCADu – linear_extrude() a surface()

Dnes se budu zabývat tím, jak si zájemci mohou vytvořit reliéf dvourozměrné podoby zmíněných hvězdokup. V OpenSCADu lze s výhodou pro reliéfování použít dva zajímavé příkazy: linear_extrude()surface(). Ve skutečnosti existují další možnosti, ale ty mi aktuálně nepřipadají tak zajímavé.

Linear_extrude() i surface() nám umožňují z původně dvourozměrného obrázku vytvořit třírozměrný reliéf. Linear_extrude() využívám v případě, že chci získat reliéf s definovanou výškou v celé rovině reliéfu. Surface() využívám v případě, že chci vyšší výškou reliéfu znázornit jasnější objekty a nižší výškou méně jasné.

Embosování kulové hvězdokupy M13 příkazem linear_extrude()

Abych v OpenSCADu mohl použít příkaz linear_extrude(), musím si nejdříve připravit obrázek, který chci zpracovat. Cílem je získat soubor DXF – CAD formát, zpravidla používaný mezi různými programy, s kterým si příkaz linear_extrude() rozumí – a teprve pak použít samotný příkaz linear_extrude().

V následujícím postupu využívám tři grafické programy: GIMP, Inkscape s implementovaným rozšířením Inkscape Open SCAD DXF Export, OpenSCAD. Všechny uvedené programy lze používat zdarma. Samozřejmě je možné zvolit jiné postupy s jinými programy – záleží na tom, co kterému tvůrci vyhovuje.

Tvorbu jsem si rozdělil do několika fází:

  1. Získání obrázku hvězdokupy.
  2. Úprava obrázku.
  3. Převod do formátu DXF.
  4. Tvorba reliéfu s linear_extrude().

Získání obrázku hvězdokupy

Pomoci většího dalekohledu bych si mohl pořídit fotografii hvězdokupy. Ale protože nemám potřebné vybavení, stáhnu si nějaký dobrý obrázek z internetu. Líbí se mi fotografie hvězdokupy pořízená dalekohledem Schulman. Obrázek je barevný, ve formátu JPG.

Barevný obrázek kulové hvězdokupy M13 - tak, jak ji pořídil dalekohled Schulman

Obr. 1. Kulová hvězdokupa M13 – tak, jak ji pořídil dalekohled Schulman

Úprava obrázku

  • Výsledným reliéfem nebudu znázorňovat barvy. Obrázek proto barev zbavím v programu GIMP: Obrázek / Režim / Stupně šedi.
  • Na obrázku se mi nyní hvězdy zobrazují bílou barvou. Pozadí je černé. Ale já to potřebuji přesně naopak – aby se hvězdy znázorňovali černé a pozadí bílé. Bílé hvězdy na bílém papíře by nevynikly. Obdobné to je s příkazem linear_extrude(), který mi do třetího rozměru vytáhne to, co je černé. Proto černou převedu na bílou a bílou na černou. Opět v GIMPu: Barvy / Invertovat. Totéž bych mohl provést použitím Barvy / Úrovně.
  • Na obrázku se mi zobrazuje stále mnoho šedých oblastí – obrázek se zdá jakoby trochu ušpiněný. Proto v GIMPu vhodně nastavím: Barvy / Práh.
  • Obrázek si nyní uložím ve formátu PNG.
Obrázek kulové hvězdokupy M13 zbavený barev (po provedení inverze)

Obr. 2. Kulová hvězdokupa M13 zbavený barev (po provedení inverze)

Převod do formátu DXF

Převést PNG soubor do DXf neumí každý program – použiji proto program Inkscape s implementovaným rozšířením Inkscape Open SCAD DXF Export:

  • Importovat PNG obrázek připravený programem GIMP.
  • Vybrat pipetou černou barvu: Vyberte barvu z obrázku (F7).
  • Vektorizovat bitmapu: Křivka / Vektorizovat bitmapu (Shift+Alt+B). V zobrazeném dialogovém okně obvykle stačí ponechat defaultní hodnoty a potvrdit.
  • Nyní se mi zobrazují dva objekty – původní bitmapa a nová zvektorizovaná bitmapa. Tu původní bitmapu odstraním.
  • Zvektorizovanou bitmapu uložím ve formátu DFX: Soubor / Uložit / Uložit jako typ: OpenSCAD DFX Output (*.DFX). Obrázek nazvu třeba m13le.dxf.

Tvorba reliéfu s linear_extrude()

DXF soubor mám připravený pro zpracování v OpenSCADu. Linear_extrude() v následujícím skriptu do výšky půl milimetru vytáhne dvourozměrný obrázek m13le.dxf:

linear_extrude(height = 0.5) import("m13le.dxf");

Jednoduché. Rozměry v osách x a y změním pomocí příkazu resize() (mohl bych použít také příkaz scale()) na 160 mm × 160 mm. Výšku reliéfu v ose z nechám původní.

resize([160, 160]) linear_extrude(height = 0.5) import("m13le.dxf");
Obrázek reliéfu hvězdokupy M13 - bez podložky

Obr. 3. Reliéf hvězdokupy M13 – bez podložky

Reliéf ale nemá základnu – reliéfně znázorněné hvězdy jsou ve stejné rovině, ale „v prázdnu“. Proto příkazem cube() je podložím podložkou o velikosti 160 mm × 160 mm × 1,5 mm. Příkazem translate() v osách x, y, z podložku posunu tak, aby byla pěkně umístěna vůči reliéfním hvězdám.

resize([160, 160]) linear_extrude(height = 0.5) import("m13le.dxf");
translate([0,0,-1.5/2]) cube([160, 160, 1.5], center=true);
Obrázek reliéfu hvězdokupy M13 s podložkou

Obr. 4. Reliéf hvězdokupy M13 – s podložkou

Embosování kulové hvězdokupy M13 příkazem surface()

Jak jsem již zmínil, surface() využívám v případě, že chci vyšší výšku reliéfu pro jasnější objekty a nižší pro méně jasné. Surface() čte informace tzv. výškové mapy (resp. hloubkové mapy) obrazových souborů. Výšková mapa popisuje relativní výšku v konkrétním bodě vůči nulové hladině. Využívá hodnot šedi – nulová hladina odpovídá šedé barvě, nejnižší hladina odpovídá černé barvě a nejvyšší hladina bílé barvě. Díky tomu mohu s pomocí surface() vytvářet třírozměrný reliéf z původně dvourozměrného obrázku. Barva nám nevadí (ačkoliv osobně se mi v některých případech lépe pracuje s odstíny šedi), neboť každá barva má svou interpretaci v míře šedosti (resp. bělosti, černosti). Bílá je položena nejvýše, o něco níže je žlutá, ještě níže jsou zelená, červená, modrá a nejníže černá.

Tvorbu jsem si rozdělil do dvou fází:

  1. Získání obrázku hvězdokupy.
  2. Úprava obrázku.
  3. Tvorba reliéfu se surface().

Získání obrázku hvězdokupy

Jako v předchozím případě použiji fotografii hvězdokupy pořízenou dalekohledem Schulman. Obrázek je barevný, ve formátu JPG.

Úprava obrázku

  • Výsledným reliéfem nebudu znázorňovat barvy. Obrázek proto barev zbavím v programu GIMP: Obrázek / Režim / Stupně šedi. Obrázek je zbytečně příliš veliký, proto ho mohu zmenšit: Obrázek / Škálovat obrázek.
  • Příkaz surface() si rozumí s formátem PNG. Proto povedu export do PNG souboru: Soubor / Exportovat jako… / m13s.png.

Tvorba reliéfu se surface

Skript v OpenSCADu není náročný.

surface("m13s.png", center=true);
Obrázek hvězdokupy M13 - příliš vysoký reliéf hvězd

Obr. 5. Hvězdokupa M13 – příliš vysoký reliéf hvězd.

Reliéf se nyní zobrazuje příliš vysoký. Proto změním velikost reliéfu na požadovanou velikost. Použiji resize(), abych změnil velikost na 160 mm × 160 mm × 0,8 mm (maximální výšku v tomto případě definuji na 0,8 mm, zvažte však specifičnost každého použití)..

resize([160, 160, 0.8]) surface("m13s.png", center=true);

Takto vzniklý reliéf je opět vhodné doplnit o podložku.

resize([160, 160, 0.8]) surface("m13s.png", center=true);
translate([0,0,-1.5/2]) cube([160, 160, 1.5], center=true);
Obrázek hvězdokupy M13 - snížený reliéf hvězd.

Obr. 6. Hvězdokupa M13 – snížený reliéf hvězd.

Embosování otevřené hvězdokupy M45 příkazem linear_extrude()

Zaujala mě fotografie M45 z Raw Astrophotography Data. Obrázek je barevný, ve formátu JPG. Obrázek v GIMPu zbavím barev, zmenším a uložím ve formátu PNG.

Fotografie otevřené hvězdokupy M45 z Raw Astrophotography Data

Obr. 7. Fotografie hvězdokupy M45 z Raw Astrophotography Data

Stejně jako v případě hvězdokupy M13, v GIMPu a Inkscapu si připravím DXF soubor, abych ho mohl následně zpracovat v OpenSCADu pomocí příkazu linear_extrude().

resize([160, 160]) linear_extrude(height = 0.5) import("m45le.dxf");
translate([0,0,-1.5/2]) cube([160, 160, 1.5], center=true);
Obrázek reliéfu hvězdokupy M45 s podložkou

Obr. 8. Reliéf hvězdokupy M45 s podložkou

Embosování otevřené hvězdokupy M45 příkazem surface()

Stejně jako v předchozím případě, použiji fotografii M45 z Raw Astrophotography Data. Obrázek je barevný, ve formátu JPG. Obrázek v GIMPu zbavím barev (ačkoliv bych je mohl ponechat – jedná se jen o můj lepší pracovní pocit), zmenším a uložím ve formátu PNG.

Podobně jako v případě hvězdokupy M13, v OpenSCADu použiji skript s příkazem surface() (maximální výšku v tomto případě definuji na 1 mm, zvažte však specifičnost každého použití).

resize([160, 160, 1]) surface("m45s.png", center=true); 
translate([0,0,-1.5/2]) cube([160, 160, 1.5], center=true);
Obrázek reliéfu hvězdokupy M45 s podložkou

Obr. 9. Reliéf hvězdokupy M45 s podložkou

Závěr

OpenSCAD příkazy linear_extrude() a surface() jednoduchým způsobem umožňují i z jednotlivých fotografií či obrázků vytvořit trojrozměrný objekt, alespoň v podobě reliéfu. Je pro to využito textur, kterými je možné s větší či menší kvalitou vykreslit trojdimenzionální povrch, aniž by byl nutný značný výpočetní výkon. V případě OpenSCADu (surface) je využívána textura typu výšková mapa (resp. hloubková mapa). Reliéfy hvězdokup M13 a M45 zhotovené 3D tiskárnou vhodným materiálem a způsobem, jsou relativně uspokojivé, neboť převážně pro nevidomé měly dostatečný informační přínos – díla zpravidla sdělují informačně a funkčně podstatné, zvýrazňují informačně důležité části (různě jasné hvězdy a jejich rozmístění v ploše). Osobně se mi daleko lépe pracuje s postupy pro linear_extrude(), jelikož s použitím surface() pracně ladím někdy až příliš „ostré“ hmatové  body, navíc pokud je okolí hvězdy zamlžené, pak hvězda může působit příliš ploše, čímž dostatečně nevinikne její jasnost. Shrnu-li problematické oblasti, tak:

  • Linear_extrude() centrum hvězdokupy M13 zobrazí jako jednolitou plochu, sice vůči podložce vyvýšenou, to však hmatem nelze poznat a někteří lidé se domnívají, že hvězdy jsou rozmístěny jakoby „do prstence“. To by bylo možné napravit úpravou kýženého místa, např. záměnou hladké plochy za strukturovanou (zdrsněnou, mřížkovanou atp.).
  • Surface() sice předchozí problém značně potlačuje, na druhou stranu vytváří často až příliš špičaté, hmatově nekomfortní, objekty. Nápravu v takovém případě lze provést dodatečnou úpravou 3D výtisku, volbou vhodného, spíše měkčího materiálu, popřípadě grafickou úpravou digitálního podkladu pro 3D tisk.
  • Zbrklé použití ať linear_extrude() nebo surface() může ve výsledku vést k nedostatečnému oddělení relativně nezávislých informací (např. splyne hvězda s mlhovinou, ve výsledku příliš ploché a oproti realitě hmatem působíci méně jasné).

Do budoucna bude jistě vhodné vypracovat algoritmus, který umí nejen vypočítat z obrázku výškovou či normálovou mapu (a zrekonstruovat tak povrch), ale jenž by také dokázal brát v potaz například hmatový komfort.

Co se mi na experimentování ať s linear_extrude(), surface() či s jinými možnostmi softwarového vytláčení reliéfu z fotografie libí, tak skutečnost, že něco takového má značný potenciál automatizovat tvorbu hmatového díla navozujícího přirozený vztah se skutečností.

Tisk hvězdokupy M45 na FFF 3D tiskárně.

Obr. 10. Tisk kulové otevřené hvězdokupy M45 na FFF 3D tiskárně. Na takové 3D tiskárně se mi nízké reliéfy tisknou lépe ve svislé poloze – hvězdy jsou tištěny jako převis.



3D tisk


Petr Dušek
Petr několik let pracoval na úchvatné pozici pozorovatele meteorů v Oddělení meziplanetární hmoty Astronomického ústavu Akademie věd ČR. V současnosti se úspěšně zabývá SW vývojařinou, zejména na úrovni zajištění kvality, testování, bezpečnosti a to primárně v oblasti komerčního sektoru.