Embosování hvězdokup v OpenSCADu
Agora a Tmavomodrý 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() a 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í:
- Získání obrázku hvězdokupy.
- Úprava obrázku.
- Převod do formátu DXF.
- 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.
Ú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.
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");
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);
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í:
- Získání obrázku hvězdokupy.
- Úprava obrázku.
- 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);
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);
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.
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);
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);
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í.