Hlavní navigace

Zobrazení 3D modelů v DXF pomocí OpenGL

12. 4. 2007
Doba čtení: 10 minut

Sdílet

Dnes se budeme věnovat populárním a často používaným grafickým formátům a dokončíme popis známého vektorového formátu DXF. Na praktickém příkladě si ukážeme způsob načtení a interaktivního zobrazení trojrozměrných modelů uložených v tomto formátu.

Obsah

1. Grafické soubory typu DXF obsahující trojrozměrné modely
2. 2,5D grafika a způsob jejího použití
3. Reprezentace těles rozložených na plošky
4. Grafické entity sloužící pro ukládání plošek
5. Trojrozměrné pláty a způsob jejich uložení v DXF
6. Demonstrační příklad – interaktivní prohlížeč 3D modelů
7. Odkazy na další informační zdroje
8. Obsah dalšího pokračování tohoto seriálu

1. Grafické soubory typu DXF obsahující trojrozměrné modely

V předchozích částech tohoto seriálu jsme si ukázali způsob načítání a zobrazování jednoduchých plošných (2D) výkresů, které se skládaly ze základních grafických entit typu bod (POINT), úsečka (LINE), kružnice (CIRCLE), kruhový oblouk (ARC) či textový řádek (TEXT). Víme však, že v tomto grafickém formátu je možné přenášet i plnohodnotné trojrozměrné modely.

V praxi se můžeme setkat s několika způsoby popisu těchto modelů, s čímž souvisí i výběr grafických entit, ze kterých se modely mohou skládat. Již obstarožní verze AutoCADu podporovaly práci s takzvanou 2,5 grafikou, kterou si popíšeme ve druhé kapitole. Tato grafika si vystačila se základními 2D entitami, kterým se pouze přiřazovala „výška“ a vzdálenost od kreslicí roviny.

2,5 grafika je však zcela nedostatečná pro tvorbu skutečných trojrozměrných objektů, proto se v dalších verzích AutoCADu (a tím i formátu DXF, který je s AutoCADem svázán), již objevily nové grafické entity, například 3D ploška (trojúhelníková či čtyřúhelníková, viz třetí kapitola) a pro složitější modely také parametrická plocha, konkrétně kvadratická B-spline plocha, kubická B-spline plocha a také slavný Bézierův bikubický plát. Parametrické plochy budou popsány ve čtvrté kapitole. V některých souborech typu DXF jsou dokonce uloženy i informace o objemových tělesech seskupených pomocí CSG (Constructive Solid Geometry), tyto informace však není snadné (a pravděpodobně ani legální) bez komerčního konverzního programu získat, protože jsou zakódované.

dxf2_1
Obrázek 1: Výstup z demonstračního příkladu

2. 2,5D grafika a způsob jejího použití

V dokumentaci k některým programům typu CAD se můžeme setkat s pojmem „2,5D grafika“. Tento pojem se také – ovšem v poněkud jiném významu – objevuje i u označení grafických enginů některých her, typicky těch, které herní prostor zobrazují v isometrickém pohledu, většinou bez aplikace perspektivy (Civilizace 2, Transport Tycoon, a z open-source her pak různé grafické nadstavby pro NetHack apod.).

V CADech však 2,5D grafika znamená, že se trojrozměrné modely skládají z grafických entit, které byly původně určeny pouze pro popis 2D výkresů. Aby se začalo jednat o trojrozměrné entity, musel jim být přidán třetí rozměr. V praxi to znamená, že je možné vybraným 2D entitám, typicky úsečkám, polyčarám, obloukům a kružnicím přiřadit „výšku“ a vzdálenost od kreslicí roviny.

Touto operací, která se nazývá extrusion se z úseček stanou kolmé plochy, z kružnic válce, z oblouků části plášťů válců, z plošného textu 3D text apod. Pro některé účely může být tento styl modelování užitečný a především jednoduchý a intuitivní – například při kreslení plánků podlaží v domech. Stěny jsou v těchto případech vytvořeny z úseček protažených do 3D, podlaha je tvořena entitou typu deska (SOLID) atd.

Pro složitější modely však bylo nutné zavést takové rozšíření, aby bylo možné kreslicí rovinu změnit, například ji ztotožnit s rovnou částí střechy kresleného domu. Pro tyto účely se v AutoCADu používají uživatelské souřadné systémy (UCS – User Coordinate Systems). Pro vykreslení natočené 3D entity se použila původní 2D entita protažená do třetího rozměru, ovšem při jejím kreslení se pomocí UCS změnila kreslicí rovina.

Tuto techniku modelování je možné v AutoCADu použít dodnes (v mnohem sofistikovanější podobě ji ovšem nabízí i další CADy), proto je zapotřebí při načítání 3D výkresů správně rozpoznat nastavení uživatelských souřadných systémů a při práci s načtenými entitami provádět příslušné transformace (v grafické knihovně OpenGL většinou pomocí funkcí glTranslatef(), glRotatef() a glScalef()). Pokud má daná entita přiřazenu nenulovou „výšku“ a posun ve směru osy Z (od kreslicí roviny), mívá také nastaven vektor odpovídající směru rozšíření entity do trojrozměrného prostoru. Všechny tyto atributy entity jsou v DXF souborech uloženy v pěti skupinách (groups), jejichž význam je uveden v následující tabulce:

Číslo skupiny Význam uložené hodnoty
38 vzdálenost od kreslicí roviny
39 „výška“ entity (thickness)
210 x-ová souřadnice vektoru udávajícího směr rozšíření entity
220 y-ová souřadnice vektoru udávajícího směr rozšíření entity
230 z-ová souřadnice vektoru udávajícího směr rozšíření entity

Vzdálenost od kreslicí roviny je v souborech DXF uložena pouze v případě, že je proměnná FLATLAND nastavena na nenulovou hodnotu. Pokud je v této proměnné uložena hodnota nulová, je vzdálenost entity uložena přímo v z-ových souřadnicích samotné entity. U úsečky se například jedná o skupiny číslo 30 a 31. Většina moderních CADů tuto proměnnou nastavuje na nulu a u všech entit explicitně uvádí i jejich z-ové souřadnice, čehož se budeme držet i v našem demonstračním příkladu. Pokud nejsou uvedeny složky vektoru rozšíření entity (extrusion vector), je jeho implicitní hodnota rovna (0, 0, 1), tj. odpovídá směru osy Z – AutoCAD totiž, jako ostatně většina 3D aplikací, používá pravotočivý souřadný systém (výjimkou je například POV-Ray).

V další tabulce jsou vypsány ty grafické entity, u kterých může být zadána nenulová výška

Jméno entity
LINE
POINT
CIRCLE
ARC
SHAPE
TRACE
SOLID
POLYLINE
DIMENSION
TEXT

dxf2_2
Obrázek 2: Další forma výstupu z demonstračního příkladu

3. Reprezentace těles rozložených na plošky

Reprezentace těles pomocí plošek je jednou z forem takzvané hraniční reprezentace těles (Boundary representation, B–rep), dokonce se jedná o jeden z nejpoužívanějších způsobů popisu těles v počítačové grafice. Mezi hlavní důvody vedoucí k používaní hraniční reprezentace patří poměrně jednoduché datové struktury využívané pro popis geometrie tělesa, přímočaré a rychlé zobrazení s využitím široce používaných 3D API (programových rozhraní pro aplikace, mezi které patří zejména OpenGL, Direct3D a GKS), podpora ze strany CAD/CAM systémů a poměrně velká nezávislost na měřítku zobrazení (zejména v porovnání s rastrovou objemovou reprezentací). Také existují rozsáhlé programové knihovny umožňující práci s hierarchicky uspořádanou scénou, kde jsou využity různé metody pro rozdělení a zpracování prostorové scény, například KD-stromy, BSP-stromy, portály nebo hierarchické mřížky.

U hraniční reprezentace nejčastěji vycházíme z předpokladu, že plošky (což jsou obvykle trojúhelníky nebo plošné polygony) či pláty tvoří uzavřená tělesa. Při porušení tohoto předpokladu, například vlivem chyby při editaci tělesa, může docházet k různým anomáliím, a to jak při vlastní editaci, tak i při následném vykreslování (renderingu). Jednou z největších výhod polygonální reprezentace je skutečnost, že algoritmy pro zobrazování konvexních plošných polygonů, resp. pouze trojúhelníků, vedou k použití několika lineárních interpolátorů, které je poměrně snadné programově a především technicky realizovat. To je také důvod, proč většina dnes používaných grafických akcelerátorů podporuje vykreslování těles reprezentovaných polygony.

Samotná polygonální reprezentace není příliš vhodná pro modelování, protože poskytuje velmi málo informací o struktuře celého tělesa a cílená modifikace geometrie modelu (kromě lokálních změn) je poměrně složitá. Z tohoto důvodu používají modelovací programy v čase editace reprezentaci odlišnou, například NURBS plochy, implicitní plochy či základní tělesa s CSG operacemi.

Pro výstup z modelovacího programu jsou však data konvertována buď na jednotlivé trojúhelníky nebo na sítě trojúhelníků (TIN), u kterých využíváme totožných vrcholů u několika trojúhelníků. Právě zde leží jedna oblast využití vektorového grafického formátu DXF – ten v mnoha případech slouží pro přenos trojrozměrných modelů rozložených na jednotlivé trojúhelníkové či čtyřúhelníkové plošky mezi různými CAD/CAM systémy, renderovacími programy apod.

dxf2_3

4. Grafické entity sloužící pro ukládání plošek

Pojďme si nyní říci, které grafické entity je možné v DXF souborech použít pro uložení těchto plošek. Jedná se o dva typy entit, jedna (historicky starší) se nazývá deska (SOLID), druhá pak 3D ploška (3DFACE). Deska je považována za planární entity, tj. všechny její krajní body (ty jsou tři nebo čtyři) leží v kreslicí rovině. Kromě toho může být desce přiřazena nenulová výška, takže se z ní de facto stává krychle či hranol.

Naproti tomu je 3D ploška považována za prostorovou entitu definovanou buď třemi nebo čtyřmi vrcholy spolu s informací, které hrany mají být při renderingu viditelné a které skryté (pokud je například pomocí plošek popsán válec, je vhodné pomocné hrany skrývat). Jak deska, tak i 3D ploška je vždy zadána čtyřmi vrcholy, přičemž je v případě trojúhelníkových plošek třetí a čtvrtý vrchol totožný.

Jméno entity Význam
3DFACE ploška určená třemi body (trojúhelník) nebo body čtyřmi
SOLID podobné entitě 3DFACE, většina programů tuto entitu negeneruje

dxf2_4

U entity SOLID jsou zaznamenány následující atributy:

Číslo skupiny Význam
10, 20, 30 souřadnice prvního vrcholu
11, 21, 31 souřadnice druhého vrcholu
12, 22, 32 souřadnice třetího vrcholu
13, 23, 33 souřadnice čtvrtého vrcholu, může být totožné s vrcholem třetím

Grafická entita 3DFACE může mít nastaven ještě jeden doplňkový atribut pro specifikaci viditelných a neviditelných hran:

Číslo skupiny Význam
10, 20, 30 souřadnice prvního vrcholu
11, 21, 31 souřadnice druhého vrcholu
12, 22, 32 souřadnice třetího vrcholu
13, 23, 33 souřadnice čtvrtého vrcholu, může být totožné s vrcholem třetím
70 bitově zakódované příznaky (implicitně nulové):
1 – první hrana je neviditelná
2 – druhá hrana je neviditelná
4 – třetí hrana je neviditelná
8 – čtvrtá hrana je neviditelná

dxf2_5

5. Trojrozměrné pláty a způsob jejich uložení v DXF

V souborech typu DXF je kromě jednotlivých plošek možné ukládat i informace o větších a tvarově složitějších trojrozměrných plochách, takzvaných plátech (patch/surface). Ty jsou – poněkud nelogicky – uloženy jako grafická entita typu POLYLINE, za níž následuje několik řídicích vrcholů (entity typu VERTEX). Význam vrcholů a způsob vykreslení plochy je specifikován bitově zakódovanými příznaky ve skupině s číslem 70, která je uložena spolu s dalšími atributy entity POLYLINE. Ve skupině číslo 75 je uložen typ 3D plátu a skupiny 71 a 72 obsahují počet vrcholů ve směru růstu parametrů u a v (vrcholů je tedy celkem M×N). Všechny tyto atributy entity POLYLINE jsou vypsány v následující tabulce:

Číslo skupiny Význam
70 typ plochy (bitově zakódované příznaky):
1 – uzavřená plocha ve směru M
8 – 3D polyčára (nejde tedy o plochu)
16 – 3D plocha
32 – uzavřená plocha ve směru M
71 počet vrcholů v jednom směru – M
72 počet vrcholů v kolmém směru – N
75 způsob vyhlazení plochy:
0 – bez vyhlazení
5 – kvadratická B-spline plocha
6 – kubická B-spline plocha
8 – Bézierův plát

dxf2_6

6. Demonstrační příklad – interaktivní prohlížeč 3D modelů

Pro účely snadného a poměrně rychlého zobrazování trojrozměrných modelů vytvářených v různých programech typu CAD a ukládaných do souborů DXF je určen dnešní jediný, zato však rozsáhlý demonstrační příklad. Zobrazení vygenerovaných modelů je tedy možné i bez instalace specializované prohlížečky (to jsou mnohdy komerční programy). Aplikace, která vznikne překladem tohoto demonstračního příkladu umožňuje načíst model uložený do formátu DXF, přičemž je možné tento model nasvítit jedním či dvěma zdroji světla, provádět interaktivně ovládané rotace modelu na obrazovce a posun modelu směrem od popř. ke kameře apod. Také je možné zapínat a vypínat funkci paměťi hloubky (Z-bufferu) i osvětlení (lighting).

V základní podobě demonstrační aplikace je podporováno pouze zobrazení entit typu 3DFACE. V případě, že se v CAD programu vytvoří složitější povrch, například plášť složený z parametrických spline ploch, je možné tyto povrchy příkazem explode (či podobně nazvaným příkazem) rozložit na jednotlivé trojúhelníky či čtyřúhelníky. Každá ploška je při zobrazení automaticky rozložena na dvojici trojúhelníků, přičemž není provádět test, zda je druhý trojúhelník degenerovaný (to nastane v případě, že se třetí a čtvrtý vrchol rovnají). Entity také nejsou ukládány do display-listů a není prováděn výpočet normály. Tyto rozšiřující možnosti jsme si totiž již v minulosti ukázali, například v paralelně běžícím seriálu Fraktály v počítačové grafice, kde byl prezentován příklad pro zobrazení 3D modelů uložených ve formátu RAW (díl „Trojrozměrné modely vytvářené v Lparseru“ vydaný 12.12.2006).

Při spouštění programu postačí jako jediný parametr zadat jméno souboru ve formátu DXF, který obsahuje nějaké entity typu 3DFACE. Ovládání je stručně popsáno v následující tabulce. Zdrojový kód tohoto demonstračního příkladu je dostupný jak ve formě zdrojového textu, tak i jako HTML stránka se zvýrazněnou syntaxí.

Operace (klávesa) Význam
Esc ukončení běhu aplikace
Q ukončení běhu aplikace
1 zobrazení pouze vrcholů trojúhelníků
2 zobrazení drátového modelu
3 zobrazení vystínovaného modelu
4 zapnutí funkce paměti hloubky (Z-bufferu)
5 vypnutí funkce paměti hloubky (Z-bufferu)
6 zapnutí osvětlení
7 vypnutí osvětlení
L výpočet barev na základě „hešovacího kódu“ jména hladiny
C výpočet barev na základě uložené barvy entity
levé tlačítko myši rotace modelu
pravé tlačítko myši posun modelu

dxf2_7

7. Odkazy na další informační zdroje

  1. Aaron A. Collins:
    AutoCAD DXF file to DKB Data File Converter,
    version 1.0
  2. Autodesk, Inc.:
    AutoLISP Release 9, Programmer's re­ference,
    Autodesk Ltd., Oct. 1987
  3. Autodesk, Inc.:
    AutoLISP Release 10, Programmer's re­ference,
    Autodesk Ltd., Sept. 1988
  4. Autodesk, Inc.:
    Drawing Interchange and File Formats, AutoCAD Release 12
    Copyright © 1982–1990, 1992, Autodesk, Inc.
  5. Autodesk, Inc.:
    AutoCAD Reference Manual
    Autodesk, Inc., 1995
  6. AutoCAD DXF (Wikipedia):
    http://en.wiki­pedia.org/wiki/Au­toCAD_DXF
  7. Open Design Aliance:
    http://www.open­design.com/

dxf2_8

root_podpora

8. Obsah dalšího pokračování tohoto seriálu

V následujícím pokračování seriálu o grafických formátech si popíšeme binární variantu vektorového formátu DXF – jedná se o takzvané soubory DXB, tj. Drawing Binary Interchange File Format. Tento formát je používán zejména z důvodu rychlejšího načítání a několikanásobně menší velikosti, než je tomu v případě formátu DXF.

dxf2_9

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.