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ů.
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](https://i.iinfo.cz/urs/x3d_4_2-120292759041558.png)
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.
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](https://i.iinfo.cz/urs/x3d_4_4-120292762858277.jpg)
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 | [X3DTextureCoordinateNode] | 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 X3DCoordinateNode). 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.
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](https://i.iinfo.cz/urs/x3d_4_6-120292766115542.png)
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.
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.
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).
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 | [X3DTextureCoordinateNode] | 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.
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](https://i.iinfo.cz/urs/x3d_4_b-120292784547592.png)
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,nekonečno) | [1 1 1 –1 –1 –1 –1 1 1 1] |
endCap | SFBool | TRUE/FALSE | TRUE |
orientation | MFRotation | [-1,1] nebo (-nekonečno,nekoneč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 |
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](https://i.iinfo.cz/urs/x3d_4_c-120292786784171.jpg)
Model vytvořený pomocí NURBS