Hlavní navigace

NURB křivky a plochy ve formátu X3D

28. 2. 2008
Doba čtení: 12 minut

Sdílet

V dnešní části seriálu o grafických formátech a metaformátech si ukážeme některé způsoby použití NURB křivek a NURB ploch v grafickém formátu X3D. Popíšeme si tvorbu parametrických NURB křivek vytvořených v ploše i prostoru, tvorbu NURB ploch včetně jejich oříznutí a také význam uzlového vektoru.

Obsah

1. NURB křivky a plochy ve formátu X3D
2. Parametrická NURB křivka vytvořená v ploše
3. Množina parametrických NURB křivek a lomených čar tvořících uzavřený tvar
4. Parametrická NURB křivka vytvořená v prostoru
5. NURB plocha – parametrický plát
6. Množina NURB ploch
7. NURB plocha, ve které je vyříznut otvor definovaný uzavřeným tvarem či tvary
8. Obsah dalšího pokračování tohoto seriálu

1. NURB křivky a plochy ve formátu X3D

V předchozí části tohoto seriálu jsme si pověděli základní informace o NURB křivkách a plochách. Již tedy víme, že se pomocí těchto relativně jednoduše modifikovatelných geometrických útvarů dají snadno modelovat nejenom hladké křivky a plochy, ale také přesné kuželosečky (v případě NURB křivek) a kvadriky (v případě NURB ploch) i takzvané offsetové plochy, tj. plochy vzdálené od zadaného tvaru o definovanou vzdálenost. To předurčuje NURB křivky a NURB plochy k použití v systémech typu CAD a CAM, kde je nutné modelovat všechny tvary zcela přesně a ne pouze interpolací či aproximací, zatímco programy určené především pro grafický design (Inkscape, Adobe Illustrator, CorelDraw!) si s přehledem vystačí s Bézierovými křivkami, většinou kvadrikami a kubikami. Dnes si řekneme, jaké uzly jsou v grafickém formátu X3D vyhrazeny pro tvorbu NURB křivek i NURB ploch, a jaké atributy lze u těchto uzlů nastavovat.

X3D se NURBS používají k několika operacím:

  1. Tvorba NURB křivky ležící v ploše, přesněji řečeno v parametrické rovině. Použito především k tvorbě ořezových křivek (trimming curve).
  2. Tvorba plnohodnotných parametrických NURB křivek v prostoru.
  3. Tvorba NURB ploch (parametrických plátů).
  4. Tvorba NURB ploch, ve kterých je vyříznut otvor definovaný uzavřeným tvarem – ořezovou křivkou.
  5. Tvorba interpolátorů za použití NURB křivek ležících v prostoru.
  6. Tvorba interpolátorů za použití NURB ploch.

Konkrétně lze v grafickém formátu X3D použít následující uzly, z nichž některé budou popsány v dalším textu:

Název uzlu Význam
Contour2D množina křivek, které by měly vytvořit uzavřený tvar, který je jako celek použitý pro definici ořezové křivky
ContourPolyline2D úsečková část křivky vkládané do předchozího uzlu typu Contour2D
NurbsCurve2D „křivková“ část vkládaná do uzlu typu Contour2D
NurbsCurve parametrická NURB křivka definovaná v prostoru
NurbsPatchSurface NURB plocha – pravděpodobně nejpoužívanější uzel z této skupiny
NurbsSet množina NURB ploch, ke které lze přiřadit informace o obalovém tělese
NurbsTrimmedSurface NURB plocha, ve které je vyříznut otvor definovaný uzavřeným tvarem
NurbsOrientati­onInterpolator interpolátor definovaný NURB křivkou v prostoru (3D)
NurbsPositionIn­terpolator interpolátor definovaný NURB křivkou v prostoru (3D)
NurbsSurfaceIn­terpolator interpolátor definovaný NURB plochou v prostoru (3D)
NurbsSweptSurface obdoba uzlu typu Extrusion, ovšem s tvarem definovaným NURB křivkou
NurbsSwungSurface generalizované těleso vzniklé tažením profilové křivky po zadané cestě
NurbsTextureCo­ordinate NURB plocha, pomocí níž se určuje způsob mapování textur

2. Parametrická NURB křivka vytvořená v ploše

Problematiku NURBS si přiblížíme na popisu uzlu nazvaného NurbsCurve2D. Tento uzel slouží pro vytvoření parametrické NURB křivky, jejíž tvar je ovlivněn polohou řídicích bodů (control points), uzlovým vektorem (knot vector) a váhami řídicích bodů (weight). NURB křivky patří mezi skupinu interpolačních křivek, které obecně neprochází svými řídicími body, ale jejich tvar je těmito body ovlivněn. Pokud je váha řídicího bodu kladná, je křivka k tomuto bodu lokálně přitahována, v případě záporné váhy naopak odpuzována. Použití záporných vah s sebou přináší jeden problém – křivka totiž nemusí ležet v komplexní obálce tvořené řídicími body, což může zkomplikovat některé algoritmy určené například pro detekci kolizí nebo zjišťování viditelnosti jednotlivých objektů ve scéně. Z tohoto důvodu se záporné váhy v aplikacích příliš nepoužívají, i když z teoretického hlediska se výpočty s nimi samozřejmě dají provádět.

Důležitým parametrem NURB křivky je takzvaný uzlový vektor (knot vector), kterým se určuje vzdálenost řídicích bodů v parametrickém prostoru. Posloupnost hodnot uložená v uzlovém vektoru by měla být neklesající, tj. následující hodnota by měla být vždy rovna či větší, než hodnota předchozí. Při výpočtu hodnot na křivce se totiž vychází z takzvaných bázových funkcí, které mají stejný význam, jako u křivek Bézierových, ovšem jejich průběh je odlišný. Naprostým základem parametrické rovnice NURBS je jednoduchá delta funkce obsahující jednotkové skoky:

bi0(t) = 1 pro ti<=t<ti+1, jinak 0

která je interpolována pomocí vztahu pro interpolaci mezi dvojicí obecných funkcí f1 a f2:

f(t) = (1-t)×f1(t) + t×f2(t)

přičemž hodnoty ti a ti+1 musí být zvoleny tak, že ti<ti+1. Jak si ukážeme dále, právě tyto hodnoty jsou ve vzestupném pořadí uloženy do uzlového vektoru (knot vectoru).

x3d_6_1

Lineární interpolace mezi body A a B na základě parametru t

U výše definované funkce bi0 neexistuje žádné omezení pro hodnoty parametrů t, na rozdíl od Bernsteinových polynomů použitých u Bézierových křivek a ploch, kde mělo smysl používat pouze hodnoty z rozsahu 0–1. Na následující skupině obrázků jsou ukázány průběhy funkcí bn. Funkci b0 už známe, jedná se o průběh obsahující jednotkový skok. Pod sebou jsou vykresleny čtyři tyto funkce, jejichž skoky na sebe plynule navazují, což znamená, že na sebe navazují i sousední hodnoty ti. To mj. vede k tomu, že se do uzlového vektoru nemusí ukládat vždy dvě hodnoty pro jeden průběh, ale pouze hodnota mezní.

x3d_6_2

Průběh funkce b0

Pokud známe průběhy funkcí b0, můžeme přistoupit k jejich vzájemné interpolaci. Definujeme funkci b1 tak, aby v závislosti na indexu do uzlového vektoru a parametru t prováděla interpolaci původních funkcí. Výsledek je vyobrazen na dalším obrázku, ze kterého je patrné, že se z původních jednotkových skoků vlivem lineární interpolace staly šikmé rampy.

x3d_6_3

Průběh funkce b1

V interpolaci lze pokračovat dále. Průběh nově vzniklé funkce b2 je již zajímavější, protože se původní „rampy“ (části průběhu funkce b1 s konstantní směrnicí) navzájem interpolují a vzniká tak průběh podobný průběhu Bernsteinových polynomů použitých u Bézierových křivek. Vzniklá funkce/křivka má spojité i své první derivace, což u funkcí b0 a b1 neplatilo. Všimněte si, jak se díky lineární interpolaci původní funkce s jednotkovými skoky postupně vyhlazuje, takže je u ní vždy zaručena spojitost n-1 derivace.

x3d_6_4

Průběh funkce b2

Funkce b3 je typicky použita při vytváření NURB křivek i ploch, přičemž je samozřejmě možné použít i vyššího počtu interpolací a tím pádem i vyššího „stupně“ vyhlazení, i když to v praxi nebývá zapotřebí.

x3d_6_5

Průběh funkce b3

Změnou hodnot uložených v uzlovém vektoru se vlastně mění poměr šířek původních jednotkových skoků a nepřímo i průběh libovolné funkce bn. Dokonce je možné, aby dva prvky uložené v uzlovém vektoru za sebou měly stejnou hodnotu, ovšem (jak jsem již psal na začátku této kapitoly) není možné, aby byla následující hodnota menší než hodnota předchozí, protože by se porušil princip postupného iterativního výpočtu bázových funkcí.

Nyní již můžeme přikročit k popisu atributů uzlu NurbsCurve2D. Ty jsou vypsány v následující tabulce:

Název atributu Datový typ Rozsah Implicitní hodnota
controlPoint MFVec2d (-nekonečno,neko­nečno) []
tessellation SFInt32 (-nekonečno,neko­nečno) 0
weight MFDouble (0,nekonečno) []
knot MFDouble (-nekonečno,neko­nečno) []
order SFInt32 [2,nekonečno) 3
closed SFBool TRUE/FALSE FALSE

Hodnota order udává stupeň křivky, tj. do jaké úrovně se mají iterativně pomocí lineární interpolace vytvářet funkce bn. Přesněji řečeno je zde uložená hodnota o jedničku vyšší než požadovaný stupeň křivky, tj. například pro kubiky je order roven čtyřem. Čím je stupeň křivky vyšší, tím je křivka vizuálně hladší, ovšem pouze za předpokladu, že neuvažujeme násobné hodnoty v uzlovém vektoru. V atributu knot jsou uloženy hodnoty uzlového vektoru, kterých by mělo být tolik, kolik je řídicích bodů zvětšených o stupeň křivky s přičtením jedničky. Je to logické, protože pro n-tý stupeň je díky interpolacím sousedních funkcí (těch je stejný počet jako řídicích bodů) nutné přidat n+1 hodnot do uzlového vektoru. Hodnotou tesselation se řídí proces rozpadu původní matematicky ideální křivky na úsečkové segmenty, které jsou vykresleny buď programově nebo za pomoci grafického akcelerátoru.

3. Množina parametrických NURB křivek a lomených čar tvořících uzavřený tvar

Výše popsaný uzel typu NurbsCurve2D může být použit pro vytvoření části uzavřeného tvaru ležícího v rovině (konkrétně v parametrické rovině), který je jako celek složený z NURB křivek a úsečkových segmentů. Tento tvar je následně použit jako ořezová křivka popsaná dále, tj. nejedná se o geometrické těleso, které by se přímo vykreslovalo ve vznikající scéně! Úsečkové segmenty jsou popsány velmi jednoduše uzlem typu ContourPolyli­ne2D, ve kterém jsou uloženy koncové body lomené čáry (polyčáry). Tento uzel má pouze jeden atribut nazvaný point, což je patrné z následující tabulky:

Název atributu Datový typ Rozsah Implicitní hodnota
point MFVec2f (-nekonečno,neko­nečno) []

Celá ořezová křivka je uložena v uzlu typu Contour2D. Všimněte si, že v tomto uzlu je uveden seznam poduzlů typu ContourPolyline2D a NurbsCurve2D. Úsečkové segmenty a NURB křivky zde mohou být specifikovány v libovolném pořadí a může jich být libovolný počet, ovšem měly by na sebe zcela přesně navazovat (to lze zaručit identitou koncových vrcholů) a jako celek tvořit uzavřený tvar. Teoreticky je možné, aby vytvořený tvar protínal sám sebe, i když to pravděpodobně nemá žádné praktické využití. Uzel typu Contour2D má jediný atribut pojmenovaný children, který je reprezentován seznamem křivek a úsečkových segmentů:

Atributy uzlu Contour2D:

Název atributu Datový typ Rozsah Implicitní hodnota
children MFNode []

4. Parametrická NURB křivka vytvořená v prostoru

V případě, že se má do vytvářené scény vložit parametrická NURB křivka jako plnohodnotné viditelné těleso (i když pouze jednorozměrné), lze pro tento účel použít uzel typu NurbsCurve. Jedná se o NURB křivku nacházející se v třídimenzionálním prostoru, tj. její řídicí body nemusí ležet v jedné rovině, jak tomu muselo být u výše popsaného uzlu NurbsCurve2D. Kromě změny typu atributu controlPoint mají všechny ostatní atributy stejný význam jako u uzlu NurbsCurve2D, což je patrné z následující tabulky. Důležité je, že atribut closed sice určuje, zda má být křivka uzavřená, ovšem záleží ještě na tom, aby byl poslední řídicí bod identický s bodem prvním a žádný z těchto dvou bodů neměl přiřazenou nulovou váhu.

Název atributu Datový typ Rozsah Implicitní hodnota
controlPoint SFNode []
tessellation SFInt32 (-nekonečno,neko­nečno) 0
weight MFDouble (0,nekonečno) []
knot MFDouble (-nekonečno,neko­nečno) []
order SFInt32 [2,nekonečno) 3
closed SFBool TRUE/FALSE FALSE
x3d_6_6

NURB křivka stupně 3 procházející svými krajními řídicími body a interpolující body P1 až P3

5. NURB plocha – parametrický plát

Konečně se dostáváme k nejzajímavějšímu objektu z celé skupiny. Jedná se o parametrický plát vytvořený z NURB plochy. Stupeň NURB plochy může být v obou směrech růstu parametrů u a v odlišný, i když to nebývá zvykem. Vzhledem k tomu, že vyhodnocování bázových funkcí probíhá nezávisle ve směru parametrů u a v, zadávají se i dva uzlové vektory, dva příznaky uzavřenosti (lze například vytvořit topologickou obdobu válce či koule, tj. takzvaný „bramboroid“) a dvě pomocné hodnoty použité při rozdělování plátu na jednotlivé plošky a následně na množinu trojúhelníků, které jsou vykresleny. Počet řídicích bodů není nijak omezen, proto je možné tvořit libovolně složité pláty, od jednoduchých ploch popsaných typicky šestnácti řídicími body po celé složité objekty (viz minule ukázané modely dinosaurů). Atributy uzlu NurbsPatchSurface jsou následující:

Název atributu Datový typ Rozsah Implicitní hodnota
controlPoint SFNode []
texCoord SFNode []
uTessellation SFInt32 (-nekonečno,neko­nečno) 0
vTessellation SFInt32 (-nekonečno,neko­nečno) 0
weight MFDouble (0,nekonečno) []
solid SFBool TRUE
uClosed SFBool FALSE
uDimension SFInt32 [0,nekonečno) 0
uKnot MFDouble (-nekonečno,neko­nečno) []
uOrder SFInt32 [2,nekonečno) 3
vClosed SFBool TRUE/FALSE FALSE
vDimension SFInt32 [0,nekonečno) 0
vKnot MFDouble (-nekonečno,neko­nečno) []
vOrder SFInt32 [2,nekonečno) 3
x3d_6_7

NURB plocha tvořící jednoduchý parametrický plát

6. Množina NURB ploch

Skupinu původně navzájem nezávislých plátů je možné logicky sjednotit jejich vložením do uzlu typu NurbsSet. V tomto uzlu je pomocí atributů možné informovat prohlížeč o tom, jaká je velikost a tvar obalového kvádru umístěného tak, aby se do něj vešly všechny NURB pláty. Tuto informaci prohlížeč použije při optimalizaci vykreslování, zejména při zjišťování, zda má vůbec smysl danou skupinu plátů vykreslovat – může být totiž skryta za jiným objektem či umístěna mimo viditelnou část celé trojrozměrné scény.

7. NURB plocha, ve které je vyříznut otvor definovaný uzavřeným tvarem či tvary

NURB plochy, přesněji řečeno parametrické pláty, je možné ořezávat (trimming). S využitím ořezávání, jež se provádí v parametrické rovině pomocí ořezových křivek, lze pomocí NURB ploch vytvářet i velmi složité modely těles s otvory v povrchu či s konstrukčně složitými spoji. Ořezávání tak představuje, spolu s možností specifikace vah řídicích bodů a hodnot uložených v uzlových vektorech, techniku pro pokročilejší práci s NURB plochami. Pojďme si nyní říci, jak ořezávání pracuje. Princip ořezávání spočívá ve specifikaci oblasti, která se bude nacházet na NURB ploše, ostatní oblasti se na ploše nacházet nebudou. Vtip spočívá v tom, že oblast náležející do NURB plochy se zadává v parametrické rovině, nikoli v modelovém prostoru, takže změna této oblasti je velmi jednoduchá.

Každá NURB plocha (resp. její uzlové vektory) je před vykreslením upravena tak, aby její parametry u a v postupně prošly plochou, která je omezena čtvercem s vrcholy (0,0), (1,0), (1,1) a (0,1). Pokud není ořezávání nastaveno, vykreslí se plocha celá, tj. berou se v úvahu parametry u a v z celého rozsahu 0–1. Pokud je však ořezávání nastaveno, tj. je specifikována alespoň jedna oblast pro ořezávání, musí se původní čtverec rozdělit na části, které do NURB plochy patří, a které ne. Části, na které se čtverec rozdělí, se nesmí vzájemně překrývat, mohou však být v sobě vnořeny a vytvářet tak v parametrické ploše jakési „ostrůvky“. Vnořené části musí být specifikovány pomocí křivek, které jsou navzájem orientovány v opačném směru.

Toto dvojí použití NURBS – jednou pro vytvoření plochy, podruhé pro vytvoření ořezové křivky, se stalo poměrně populární modelovací technikou. V grafickém formátu X3D je představováno uzlem typu NurbsTrimmedSur­face, který má parametry stejné jako uzel typu NurbsPatchSur­face, ovšem přibyly atributy addTrimmingCon­tour (seznam poduzlů typu Contour2D popsaných výše), removeTrinnin­gContour a trimmingContour.

x3d_6_8

NURB plocha tvořící jednoduchý parametrický plát s vyříznutou částí

root_podpora

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

V následující části seriálu o grafických formátech a metaformátech si řekneme, jakým způsobem se ve formátu X3D vytváří světelné zdroje, jak se nastavují optické vlastnosti materiálu, ze kterých je složen povrch těles a také způsob nanášení textur na povrchy těles. Uvidíme, že v X3D je možné například nanést více textur na povrch jednoho tělesa či zkombinovat texturu s jinými vlastnostmi povrchu, čehož se často využívá například při tvorbě takzvaných světelných map (light map). Také zbývá dokončit povídání o NURB křivkách vysvětlením uzlů typu NurbsSweptSurface a NurbsSwungSur­face. Sice se nejedná o často používané uzly, jejich funkce je však poměrně zajímavá, především při ruční tvorbě modelů.

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.