Zkratka proSubdivision surfacesubdivize; anglicky subdivision: sabdyvižnTakéSubdivision, Subdivision modeling, Subdivision surfaces, SubD, Catmull-ClarkPokročilý
Definice
Subdivize je technika 3D modelování, při které se hrubá polygonální síť opakovaně dělí na menší plochy podle pevného schématu a její vrcholy se zprůměrují, takže hranatý model konverguje k hladkému povrchu. Modelář pracuje s několika desítkami polygonů, zatímco renderer zobrazí povrch s tisíci mikroploškami.
Nezaměňujte: V 3D grafice znamená subdivize dělení polygonální sítě na hladký povrch, v matematice a datových strukturách se stejné slovo používá obecně pro rozdělení oblasti na menší části (například subdivize prostoru u BSP stromů).
Proč se modeluje hrubě a hladí se až potom
Ruční modelování hladkého tvaru polygon po polygonu je nepraktické: čím víc vrcholů síť má, tím hůř se s ní manipuluje a tím snáz vzniknou zlomy ve stínování. Subdivize tenhle problém obrací. Umělec tvaruje takzvanou control cage, řídicí síť o desítkách čtyřúhelníků, a algoritmus z ní odvodí hladký povrch. Změna jednoho vrcholu řídicí sítě přetvaruje celou oblast výsledné plochy naráz.
Co dělá jeden krok dělení
Nejrozšířenější schéma Catmull-Clark pracuje ve dvou fázích. Nejprve vloží nový bod do středu každé plochy a do každé hrany, čímž se z každé plochy stanou čtyři čtyřúhelníky. Pak posune původní vrcholy do váženého průměru okolních bodů. Po prvním kroku je síť tvořená výhradně čtyřúhelníky, po druhém začíná být tvar viditelně oblý a s každým dalším krokem se blíží limitní ploše, kterou schéma matematicky definuje.
Catmull-Clark a Loop
Catmull-Clark je určen pro čtyřúhelníkové sítě a v produkčním pipeline dominuje; limitní plocha odpovídá B-spline plochám tam, kde je síť pravidelná. Loop subdivision naopak dělí trojúhelníky na čtyři menší a používá se hlavně tam, kde data přicházejí už triangulovaná, například ze skenů.
Ostré hrany a creasing
Čistá subdivize všechno zaobluje, což u technických objektů nestačí. Implementace proto umí označit hranu nebo vrchol váhou ostrosti (crease), která lokálně potlačí průměrování. Druhá, ruční cesta je support loop: přidaná smyčka hran těsně u rohu, která zkrátí poloměr zaoblení. Obě metody se běžně kombinují.
Co subdivize stojí
Počet ploch roste geometricky. Síť s 500 čtyřúhelníky má po třech krocích Catmull-Clark 32 000 ploch a po pěti přes půl milionu. Paměť i čas výpočtu proto rychle narazí na strop, zvlášť když se subdivize počítá při každém snímku animace. Real-time engine z toho důvodu obvykle model jednou zapeče do statické sítě, případně použije hardwarovou teselaci, zatímco offline renderer subdivizi vyhodnocuje adaptivně: hustěji tam, kde je plocha blízko kamery nebo výrazně zakřivená.
Topologie rozhoduje o výsledku
Kvalita hladkého povrchu závisí na tom, jak vypadá řídicí síť. Vrchol, kde se stýká jiný než čtyřnásobný počet hran, se označuje jako pól nebo extraordinary vertex; limitní plocha v něm má nižší spojitost a při ostrém osvětlení tam bývá vidět skvrna. Zkušený modelář proto póly odsouvá do míst se slabým odleskem nebo do skrytých partií. Podobně škodí trojúhelníky a n-gony v místech, která se budou deformovat animací: subdivize je zdědí a projeví se jako nepravidelné vlnění povrchu.
Příklady z praxe
Modifikátor Subdivision Surface v Blenderu
Modelář vytvoří hlavu postavy jako síť o zhruba 800 čtyřúhelnících a přidá modifikátor Subdivision Surface. Ve viewportu nechá úroveň 1 kvůli plynulé práci, pro render nastaví úroveň 2. Ostré hrany víček doladí váhou crease místo přidávání dalších smyček.
Půlicí krok na jedné ploše
Zjednodušený zápis prvního kroku Catmull-Clark ukazuje, odkud se berou nové body: střed plochy je průměr jejích vrcholů, bod na hraně průměr koncových vrcholů a středů obou sousedních ploch. Původní vrchol se pak přesune podle váženého vzorce, jehož váhy závisí na valenci vrcholu.
face_point = avg(f.vertices) edge_point = avg(e.v0, e.v1, e.face_left.face_point, e.face_right.face_point) n = len(v.edges) # valence vrcholu F = avg(face_point for f in v.faces) R = avg(midpoint(e) for e in v.edges) new_v = (F + 2*R + (n - 3)*v) / n
Časté omyly
- MýtusSubdivize přidá detail, takže z nízkopolygonálního modelu udělá lepší model.
- Ve skutečnostiSubdivize nevytváří žádnou novou informaci o tvaru, jen vyhlazuje to, co je v řídicí síti. Nepovedený tvar bude po subdivizi jen hladce nepovedený; detail musí přijít z displacementu, normálové mapy nebo z ručně domodelované topologie.
- MýtusTrojúhelníky a n-gony jsou v subdivizním modelu zakázané.
- Ve skutečnostiCatmull-Clark si s trojúhelníkem i n-gonem poradí, protože po prvním kroku je stejně všechno čtyřúhelník. Problém je jen lokální: v okolí takové plochy vzniká pól a plocha je tam hůř spojitá, což vadí na odlescích a v deformovaných partiích.
- MýtusVyšší úroveň subdivize vždycky znamená hladší výsledek.
- Ve skutečnostiPovrch konverguje k limitní ploše, takže od zhruba třetí až čtvrté úrovně už je rozdíl vizuálně nepostřehnutelný, zatímco počet ploch dál roste čtyřnásobně na každý krok. Vyšší úrovně mají smysl hlavně pro displacement, ne pro vyhlazení.
Časté dotazy
- Kolik úrovní subdivize je v praxi potřeba?
- Pro běžné vyhlazení stačí dvě až tři úrovně; povrch se limitní ploše blíží velmi rychle a čtvrtý krok už je okem prakticky nerozeznatelný. Vyšší úrovně dávají smysl jen tam, kde se na plochu aplikuje displacement a je potřeba dost geometrie, aby se detail vůbec projevil. Protože každý krok znásobí počet ploch čtyřikrát, bývá zvykem držet ve viewportu úroveň nižší než při renderu. Adaptivní subdivize v produkčních rendererech tohle rozhodnutí dělá automaticky podle velikosti plochy v obraze.
- Proč se pro subdivizi doporučují čtyřúhelníky?
- Schéma Catmull-Clark generuje výhradně čtyřúhelníky, takže síť složená z quadů se dělí pravidelně a limitní plocha je hladká skoro všude. Trojúhelník nebo n-gon po prvním kroku vytvoří vrchol s neobvyklým počtem hran, takzvaný pól, kde má povrch nižší spojitost a při ostrém odlesku tam vzniká viditelná skvrna. Quad topologie navíc tvoří souvislé smyčky hran, které kopírují svaly a záhyby, což je klíčové při deformaci modelu animací.
- Jak udělat na subdivizním modelu ostrou hranu?
- Ostrou hranu na subdivizním modelu lze získat dvěma způsoby. První je crease: hraně nebo vrcholu se přiřadí váha ostrosti, kterou algoritmus respektuje a v daném místě potlačí průměrování. Druhý způsob je support loop, tedy přidaná smyčka hran těsně vedle rohu; čím blíž smyčka leží, tím menší je poloměr zaoblení. Support loop se přenáší mezi programy spolehlivěji a chová se předvídatelně při deformaci, crease je rychlejší a nezvyšuje hustotu řídicí sítě. V praxi se obojí kombinuje.
- Používá se subdivize i v real-time grafice?
- Subdivize se v real-time grafice používá spíš nepřímo. Model se obvykle jednou vyhladí a zapeče do statické sítě, která se pak exportuje do enginu, případně se z vysokopolygonální verze vypeče normálová mapa na nízkopolygonální model. Přímý výpočet subdivize za běhu je možný přes hardwarovou teselaci v grafickém pipeline, ale bývá omezený na terén, vodu a přiblížené objekty, protože adaptivní vyhodnocování a paměťová náročnost se s rozpočtem na snímek špatně snáší.
Zdroje
- Blender Manual: Subdivision Surface Modifier(otevře se v novém okně)
- Subdivision surface(otevře se v novém okně)
- Catmull-Clark subdivision surface(otevře se v novém okně)
- OpenGL Registry(otevře se v novém okně)