Hlavní navigace

Složitější trojrozměrné objekty v X3D

14. 2. 2008
Doba čtení: 11 minut

Sdílet

V dnešní části seriálu o grafických formátech a metaformátech si ukážeme práci se složitějšími prostorovými objekty, které je možné vkládat do vytvářených scén. Konkrétně se bude jednat o povrchy složené z množiny plošek (polygonů), výšková pole (height fields) a o objekty vytvořené pomocí šablonování.

Obsah

1. Složitější trojrozměrné objekty použitelné ve formátu X3D
2. Tvorba objektů, jejichž povrch je složený z množiny plošek
3. Ukázka použití uzlu typu IndexedFaceSet
4. Výšková pole
5. Objekty vytvořené šablonováním
6. Obsah následující části tohoto seriálu

1. Složitější trojrozměrné objekty použitelné ve formátu X3D

V předchozí části seriálu o grafickém formátu X3D jsme si popsali uzly, pomocí kterých je možné do vytvářené scény vkládat jak plošné objekty, tak i základní prostorové útvary. Z plošných objektů byly popsány osově orientované obdélníky, kružnice, kruhy a mezikruží (obojí buď vyplněné nebo zobrazené svojí hranicí), kruhové oblouky, kruhové výseče a kruhové úseče (opět s možností vyplnění), lomené čáry (polyčáry), množiny bodů a konečně množiny trojúhelníků.

x3d41

Plošný výkres vytvořený pomocí lomených čar, kružnic a kruhových oblouků

Prostorové objekty jsme si prozatím popsali čtyři: osově orientovaný kvádr (Box), kužel (Cone), válec (Cylinder) a kouli (Sphere). Je zřejmé, že pomocí těchto tvarů je sice možné vytvořit i složitější scény, ovšem pro tvorbu těles, které mají netriviální povrch, nejsou tyto tvary příliš vhodné. K tomu také přispívá fakt, že není možné použít CSG (Constructive Solid Geometry), o kterém ještě bude řeč na jiném místě.

x3d42

Pouliční osvětlení vymodelované pouze pomocí základních 3D objektů

Vzhledem k nedostatečné schopnosti základních prostorových objektů popsat povrch složitějších těles jsou ve formátu X3D podporovány i další typy uzlů, pomocí nichž lze vytvářet komplikovanější povrchy. Naprostý základ tvoří tělesa, jejichž povrch je složený z množiny na sebe navazujících plošek. Ty budou popsány ve druhé kapitole. Následují výšková pole (height fields) popsané v kapitole čtvrté. Ve formátu X3D je možné vytvářet objekty pomocí šablonování, což si ukážeme v páté kapitole.

x3d43

Trojrozměrný model složený z množiny plošek

Ovšem vedle povrchů vytvořených z množiny plošek se v aplikacích typu CAD a CAM hojně využívají i neuniformní racionální B-spline plochy, nebo NURBS (Non-Uniform Rational B-Splines/Surfaces), které budou představeny v následující části tohoto seriálu, protože i tyto objekty jsou v X3D podporovány a to na poměrně vysoké úrovni (například včetně ořezových křivek).

x3d44

Trojrozměrný model vytvořený z NURBS

2. Tvorba objektů, jejichž povrch je složený z množiny plošek

Rovinné plošky, nejčastěji trojúhelníky, představují základní stavební prvek takzvané polygonální reprezentace těles (jde o součást hraniční reprezentace, Boundary representation, B-rep). Jedná se o metodu, při níž je povrch tělesa rozložen na rovinné plošky dostatečně malé na to, aby byl povrch vizuálně hladký. Naopak však nesmí být tyto plošky příliš malé, protože by to představovalo mnohdy zbytečně zvýšené nároky na grafický subsystém počítače (nehledě na větší objemy souborů).

Ve formátu X3D mohou být plošky představující povrch tělesa popsány pomocí uzlu typu IndexedFaceSet. U tohoto uzlu je možné nastavit poměrně velké množství atributů, což je patrné z níže vypsané tabulky. Ovšem ve většině případů není zapotřebí nastavovat všechny atributy, typicky si vystačíme se specifikací souřadnic jednotlivých vrcholů (atribut coord spolu s atributem coordIndex), jejich normálových vektorů (atribut normal a normalIndex) a souřadnic do textury (atribut texCoord a texCoordIndex).

Název atributu Datový typ Rozsah Implicitní hodnota
color SFNode [X3DColorNode] NULL
coord SFNode [X3DCoordinateNode] NULL
metadata SFNode [X3DMetadataObject] NULL
normal SFNode [X3DNormalNode] NULL
texCoord SFNode [X3DTextureCo­ordinateNode] NULL
ccw SFBool TRUE/FALSE TRUE
colorIndex MFInt32 [0,nekonečno) nebo –1 []
colorPerVertex SFBool TRUE/FALSE TRUE
convex SFBool TRUE/FALSE TRUE
coordIndex MFInt32 [0,nekonečno) nebo –1 []
creaseAngle SFFloat [0,nekonečno) 0
normalIndex MFInt32 [0,nekonečno) nebo –1 []
normalPerVertex SFBool TRUE/FALSE TRUE
solid SFBool TRUE/FALSE TRUE
texCoordIndex MFInt32 [-1,nekonečno) []

Výše uvedená tabulka si zaslouží vysvětlení významu jednotlivých atributů. Každá ploška (polygon) je zapsána pomocí libovolného počtu indexů do tabulky vrcholů (jedná se opět o uzel či poduzel typu X3DCoordinate­Node). Ploška musí být, jak už ostatně její název napovídá, planární, tj. všechny její vrcholy musí ležet v jedné rovině. Pokud by nějaký vrchol z roviny „vyčníval“, musí se provést buď manuální nebo automatické rozdělení celé plošky na menší části, ovšem automatické rozdělování může být poměrně zdlouhavé. Z tohoto důvodu mnoho aplikací svá prostorová data exportuje ve formě té nejjednodušší nedegenerované plošky – trojúhelníku – u trojúhelníku je totiž vždy zaručena planárnost a tím pádem i bezproblémové vykreslení s využitím moderních grafických akcelerátorů. Právě s takto upravenými tělesy se při práci s formátem X3D můžeme setkat nejčastěji.

x3d45

I poměrně složité výkresy se dají vytvořit pouze pomocí množiny polygonů

Specifikace jednotlivých vrcholů plošek je velmi jednoduchá: každý vrchol plošky je v atributu coordIndex určen indexem do tabulky vrcholů (poduzel coord), počet vrcholů pro jednu plošku je neomezený (s požadavkem planárnosti a popř. také konvexnosti) a definice vrcholů pro každou plošku je ukončena indexem se speciální hodnotou –1. Doporučuje se, aby i poslední polygon byl ukončený hodnotou –1, není to však striktně vyžadováno.

Ke každému vrcholu může být navíc přiřazena barva, orientace normálového vektoru a také souřadnice do textury, která je mapována do texturovacího prostoru. Všimněte si, že tyto údaje jsou vztaženy k vrcholu, který může být (a většinou také bývá) využit více ploškami současně. Vzhledem k tomu, že barva může být vztažena k vrcholům, je při vykreslování plošek využita interpolace, čímž se do určité míry ztratí mnohdy nežádoucí „hranatost“ objektu. Tato interpolace je typicky prováděna v grafickém akcelerátoru, tudíž se jedná o velmi rychlou operaci.

Volba, zda se barva vztahuje k ploškám nebo vrcholům, je provedena na základě hodnoty atributu colorPerVertex, podobné je to s rozhodnutím o normálových vektorech (atribut normalPerVertex). Pomocí hodnoty zadané atributem creaseAngle je specifikován mezní úhel použitý tehdy, pokud nejsou normálové vektory zadané, tj. atribut normal je nastavený na NULL nebo není vůbec zapsán.

V případě, že je vypočtený úhel mezi automaticky vypočtenými normálovými vektory dvou sousedních plošek menší než zde zadaná hodnota, je prováděna i interpolace po výpočtu osvětlení plošek, čímž opět dojde k optickému vyhlazení modelu (Gouraudovo či Phongovo stínování, Gouraud shading, Phong shading). Norma X3D se konkrétně nezmiňuje, které stínování má být skutečně použito, osobně předpokládám, že většina prohlížečů využívá rychlejšího a přitom (většinou) dostatečně vizuálně kvalitního Gouraudova stínování. Atributem texCoordIndex se budeme podrobněji zabývat až v části věnované texturování.

x3d46

Rozdíl mezi flat stínováním a Gouraudovým stínováním

3. Ukázka použití uzlu IndexedFaceSet

Vzhledem k tomu, že uzel typu IndexedFaceSet patří kvůli většímu množství atributů spíše ke složitějším uzlům, ukážeme si příklad jednoduché scény, v níž je umístěno jediné těleso vytvořené ze dvou plošek a čtyř vrcholů (těleso tedy není uzavřené, ale to nám vůbec nemusí vadit). Ke každému vrcholu je přiřazena souřadnice do textury, normálový vektor a barva. Hodnoty atributů colorPerVertex a normalPerVertex nemusí být explicitně uvedeny, protože jejich implicitní hodnota je nastavena na TRUE.

V příkladu je použita syntaxe odvozená od VRML, protože mi pro účely tohoto článku připadá čitelnější, než její XML obdoba, zejména při zápisu číselných hodnot do seznamů (ovšem na druhou stranu je zpracování XML s pomocí k tomu určených knihoven poměrně triviální, zejména v porovnání s parsováním VRML). Povšimněte si také, jakým způsobem je zapsána barva jednotlivých vrcholů – je použit formát RGB (Red, Green, Blue), přičemž hodnota každé barvové složky musí ležet v rozsahu 0.0 až 1.0.

#X3D V3.0 utf8
PROFILE Interchange
META "filename" "IndexedFaceSet.x3d"

# ukázka použití objektu typu IndexedFaceSet

Shape {
    # specifikace geometrie objektu - jeho tvaru
    geometry IndexedFaceSet {

        # souřadnice vrcholů v 3D prostoru
        coord Coordinate {
            point [ 0.0  0.0  0.0,
                    1.0  0.0  0.0,
                    1.0  0.0 -1.0,
                    0.5  1.0  0.0 ]
        }

        # indexy do pole souřadnic
        # (hodnota -1 uzavírá polygon)
        coordIndex [ 0, 1, 3, -1,
                     0, 2, 3, -1 ]

        # barvy jednotlivých uzlů pro jednotlivé vrcholy
        color Color {
            color [ 0.2 0.7 0.8,
                    0.5 0.0 0.0,
                    0.1 0.8 0.1,
                    0.0 0.0 0.7 ]
        }

        # orientace normálových vektorů pro jednotlivé vrcholy
        normal Normal {
            vector [ 0 0 1,
                     0 0 1,
                     0 0 1,
                     0 0 1 ]
        }

        # souřadnice v prostoru textury pro jednotlivé vrcholy
        texCoord TextureCoordinate {
            point [ 0.0 0.0,
                    1.0 0.0,
                    1.0 0.4,
                    1.0 1.0 ]
        }
    }

    # specifikace vzhledu objektu - tj. optických vlastností povrchu
    appearance Appearance {

        # poloprůhledný povrch
        material Material {
            transparency 0.5
        }

        # nabalená textura o rozlišení 2x2 pixely
        texture PixelTexture {
            image 2 2 1 0xFF 0x80 0x80 0xFF }
        }
}

#finito 

4. Výšková pole

Podobně jako ve VRML je možné i ve formátu X3D použít velmi zajímavý a přitom užitečný typ objektu, Jedná se o takzvané výškové pole (height field). V souborech typu X3D je výškové pole zapisováno do uzlu nazvaného ElevationGrid. Ve skutečnosti jsou totiž výšková pole obecnější než ve VRML i X3D použitá mřížka výšek, jak by zněl doslovný překlad jména tohoto uzlu.

x3d47

Výškové pole zobrazené pomocí drátěného modelu

Výškové pole je v X3D zapisováno skutečně ve formě mřížky bodů (z programátorského hlediska se jedná o normální dvojrozměrné pole) ležících v trojrozměrném prostoru, ovšem u těchto bodů jsou explicitně uvedeny pouze jejich y-ové souřadnice (výšky). Ostatní dvě souřadnice, tj. x a z, jsou dopočítány automaticky z indexu bodu, tj. z jeho pozice v mřížce. Z tohoto popisu vyplývá, že kdyby byly u všech bodů zadány nulové výšky, ležely by všechny body v rovině X-Z, kde by vytvořily skutečnou pravidelnou mřížku zobrazenou ve formě plochy. Počátek mřížky, tj. jeden z jejích rohů, leží v počátku souřadnic a mřížka se zvětšuje ve směru růstu os x a z.

x3d48

Vystínované a otexturované výškové pole

Poznámka: zopakujme, že ve VRML i X3D je použit pravotočivý souřadný systém. Implicitní pozice pozorovatele (kamery) leží v bodě [0, 0, 10], přičemž pozorovatel/kamera je natočen tak, aby se díval na počátek souřadného systému. V této konfiguraci opravdu dochází k tomu, že osa y směřuje na obrazovce, tj. po promítnutí, směrem nahoru, což je pravděpodobně důvod, proč tvůrci VRML navrhli výšková pole, která leží v rovině X-Z a ne X-Y, jak je tomu například v některých editorech specializovaných pro vytváření „světů“. Od formátu VRML je odvozen i X3D, takže i zde se setkáme s tímto způsobem zápisu výškových polí (stejný princip je ovšem použit i například u základních prostorových těles typu válce či kužele; přesněji řečeno u orientace jejich os).

x3d49

Význam jednotlivých atributů při vytváření výškového pole

Při vkládání uzlu ElevationGrid do vytvářeného modelu je možné specifikovat poměrně velké množství atributů s hodnotami, jejichž typ a rozsah je uveden v následující tabulce:

Název atributu Datový typ Rozsah Implicitní hodnota
color SFNode [X3DColorNode] NULL
metadata SFNode [X3DMetadataObject] NULL
normal SFNode [X3DNormalNode] NULL
texCoord SFNode [X3DTextureCo­ordinateNode] NULL
ccw SFBool TRUE/FALSE TRUE
colorPerVertex SFBool TRUE/FALSE TRUE
creaseAngle SFFloat [0,nekonečno) 0
height MFFloat (-?,nekonečno) []
normalPerVertex SFBool TRUE/FALSE TRUE
solid SFBool TRUE/FALSE TRUE
xDimension SFInt32 [0,nekonečno) 0
xSpacing SFFloat (0,nekonečno) 1.0
zDimension SFInt32 [0,nekonečno) 0
zSpacing SFFloat (0,nekonečno) 1.0

5. Objekty vytvořené šablonováním

Ve formátu X3D je pro vytváření složitějších objektů možné použít i techniky nazvané šablonování. Nejprve si řekněme, jakým způsobem je prováděno translační šablonování. Tento způsob šablonování spočívá ve vytažení základního tvaru, tj. profilové křivky, ve směru řídicího vektoru nebo nějaké obecné křivky. Ve formátu X3D se profilová křivka nazývá crossSection a řídicí vektor či křivka jsou nazývány spine.

x3d4a

Význam řídicí křivky/vektoru (spine)

Profilová křivka i řídicí křivka jsou zadány sekvencí bodů. V případě profilové křivky se používají body se dvěma souřadnicemi, protože celá profilová křivka leží v rovině, konkrétně v rovině X-Z (podobně, jako je tomu u výškového pole). Naproti tomu body řídicího vektoru či řídicí křivky leží v trojrozměrném prostoru, proto i jejich body (vrcholy) jsou reprezentovány trojrozměrnými souřadnicemi.

x3d4b

Tvorba kvádru pomocí profilové křivky ve tvaru obdélníku tažené po vektoru, který je na ni kolmý

Další možností tvorby těles pomocí šablonování je rotační šablonování, které se používá v mnoha CAD/CAM systémech pro tvorbu rotačních těles – SOR – Surfaces Of Revolution. Rotační tělesa se modelují tím způsobem, že se zvolí profilová křivka (která může být buď uzavřená nebo otevřená) a osa rotace. Profilová křivka je potom orotována okolo zvolené osy rotace, většinou o celých 360°. Tímto způsobem lze vytvořit jak osově souměrné kvadriky, tak i složitější tělesa nebo jejich části (toroidy, vázy, svícny apod.).

SOR lze v X3D napodobit – postačuje zvolit několik bodů řídicí křivky, které budou ležet na kružnici. Profilová křivka tedy bude zdánlivě převedena na rotační těleso, které bude mít při řezu tolik hran, kolik bodů bylo zvoleno na řídicí křivce. V některých případech je možný i opačný způsob, kdy je profilová křivka zadána ve tvaru kružnice a mění se křivka řídicí.

Objekt tvořený šablonováním se do X3D vkládá pomocí uzlu pojmenovaného Extrusion, který může mít specifikovány následující atributy:

Název atributu Datový typ Rozsah Implicitní hodnota
metadata SFNode [X3DMetadataObject] NULL
beginCap SFBool TRUE/FALSE TRUE
ccw SFBool TRUE/FALSE TRUE
convex SFBool TRUE/FALSE TRUE
creaseAngle SFFloat [0,nekonečno) 0
crossSection MFVec2f (-nekonečno,neko­nečno) [1 1 1 –1 –1 –1 –1 1 1 1]
endCap SFBool TRUE/FALSE TRUE
orientation MFRotation [-1,1] nebo (-nekonečno,neko­nečno) 0 0 1 0
scale MFVec2f (0,?) 1 1
solid SFBool TRUE/FALSE TRUE
spine MFVec3f (-?,?) [0 0 0 0 1 0]

Význam jednotlivých atributů:

Atribut Význam
metadata
beginCap určuje, zda se má uzavřít horní část (uzávěr) objektu
ccw specifikace směru otáčení bodů profilové křivky (pro či proti směru hodinových ručiček)
convex povolení či zákaz rozdělení profilové křivky na konvexní části (výpočetně náročné)
creaseAngle úhel mezi dvěma ploškami, při kterém ještě dochází k vyhlazení povrchu
crossSection seznam vrcholů profilové křivky
endCap určuje, zda se má uzavřít dolní část (uzávěr) objektu
orientation seznam natočení profilové křivky při jejím posunu
scale seznam změny měřítka profilové křivky při jejím posunu
solid specifikace, jestli se mají zobrazovat i odvrácené plošky
spine seznam vrcholů řídicí křivky

CS24_early

6. Obsah následující části tohoto seriálu

V příští části seriálu o grafických formátech a metaformátech se budeme zabývat slibovanými neuniformními racionálními B-spline plochami, které je možné ve formátu X3D plně využít.

x3d4c

Model vytvořený pomocí NURBS

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.