Hlavní navigace

Šablonování ve VRML

13. 12. 2007
Doba čtení: 9 minut

Sdílet

V dnešní části seriálu o grafických formátech a metaformátech se budeme zabývat problematikou šablonování, což je jeden ze způsobů tvorby trojrozměrných těles. Šablonování je ve VRML souborech možné specifikovat v uzlu typu Extrusion, jehož použití si ukážeme na několika demonstračních příkladech.

Obsah

1. Šablonování pomocí objektu typu Extrusion
2. Vytažení základního tvaru (profilové křivky)
3. První demonstrační příklad – vytažení profilové křivky
4. Rotační šablonování
5. Druhý demonstrační příklad – rotační šablonování
6. Zkrut a změna měřítka při šablonování
7. Třetí demonstrační příklad – zkrut při šablonování
8. Obsah další části tohoto seriálu
9. Zdrojové kódy demonstračních příkladů

1. Šablonování pomocí objektu typu Extrusion

Šablonování je způsob vytváření trojrozměrných těles, který je používán v mnoha grafických editorech určených pro vytváření trojrozměrných scén i systémech CAD (Computer Aided Design) a CAM (Computer Aided Manufacturing). Šablonování obecně spočívá ve vytvoření základního plošného tvaru, který je tažen ve směru nějakého vektoru či křivky, nebo může být rotován okolo zadané osy rotace. V některých 3D editorech je dokonce umožněno oba pohyby kombinovat, tj. posouvat základním tvarem a současně jím otáčet.

Onomu základnímu plošnému tvaru, jenž může být otevřený nebo uzavřený, se říká profilová křivka. Výhodou šablonování oproti některým jiným metodám návrhu 3D objektů je zejména snadný způsob vytvoření profilové křivky, protože práce s objekty v 2D ploše je pro uživatele mnohem snadnější, už jenom díky tomu, že jak vstupní zařízení (klávesnice, touchpad), tak i zařízení výstupní (monitor, tiskárna) jsou založeny na plošném vytváření a zobrazování informací.

V jazyku VRML 2 je možné ukládat i poměrně složité trojrozměrné objekty vytvořené právě pomocí šablonování, jak posuvného (translačního), tak i rotačního. K tomuto účelu slouží uzel typu Extrusion, který je současně i posledním uzlem určeným pro zápis geometrie objektů (mezi další už popsané uzly patří Box, Cone, Cylinder, Sphere, Text, IndexedFaceSet, IndexedLineSet, PointSet a konečně ElevationGrid). Uzel typu Extrusion díky použité metodě zápisu šablonování umožňuje vytváření i poměrně složitých těles za pomoci pouze malého množství dat, čímž se samozřejmě zmenšuje jak celková velikost VRML souborů, tak i přenosové časy. Většina grafických editorů z různých důvodů však tento uzel příliš často nepoužívá a spokojí se s rozkladem všech těles na plošky uchovávané v uzlech typu IndexedFaceSet.

2. Vytažení základního tvaru (profilové křivky)

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. již zmiňované profilové křivky, ve směru řídicího vektoru nebo nějaké obecné křivky. Ve VRML se profilová křivka nazývá crossSection a řídicí vektor či křivka je nazývána 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. Syntaxe zápisu uzlu typu Extrusion je na první pohled poměrně složitá, ale z demonstračních příkladů uvidíme, že mnoho atributů není většinou nutné nastavovat:

Extrusion {
    beginCap      # určuje, zda se má uzavřít horní část (uzávěr) objektu
    endCap        # určuje, zda se má uzavřít dolní část (uzávěr) objektu
    ccw           # specifikace směru otáčení bodů profilové křivky
    convex        # povolení či zákaz rozdělení profilové křivky na konvexní části
    creaseAngle   # úhel mezi dvěma ploškami, při kterém ještě dochází k vyhlazení povrchu
    crossSection  # seznam vrcholů profilové křivky
    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
} 

Translačním šablonováním obecné křivky (základního tvaru) po úsečce získáme přímkovou plochu. Posunutím kružnice lze vytvořit válcovou plochu, posunem úsečky obdélník nebo kosodélník, posunem čtverce hranol atp. Výsledná plocha tedy má neměnný profil v řezu kolmém na trajektorii.

3. První demonstrační příklad – vytažení profilové křivky

V dnešním prvním demonstračním příkladu je ukázána tvorba velmi jednoduchého objektu vzniklého tažením křivky. Jedná se o krychli, tj. objekt vymodelovaný ze základního tvaru – čtverce – který je tažen po vektoru začínajícího v bodě [0, –1, 0] a končícího v bodě [0, 1, 0]. Nesmíme totiž zapomenout na to, že základní tvar leží vždy v rovině X-Z. Řídicí křivka je ukázána na prvním obrázku a počáteční i koncové umístění uzavřené řídicí křivky na obrázku druhém.

6801
6802
#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Prvni demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0, ktera obsahuje teleso vytvorene
# tazenim pomoci uzlu Extrusion
#
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
#
# (zalozeno na Floppy'sVRML97 Tutorial)
# ---------------------------------------------------------

WorldInfo {
    title "Prvni 3D scena s uzlem typu Extrusion"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "]
}

# nastaveni barevneho prechodu na pozadi sceny
Background {
    skyColor [1 1 0,
              1 0 0]
    skyAngle [3.14]
}

# nastaveni pozice pozorovatele
Viewpoint {
    position 0.0 2.0 10.0
}

# nastaveni svetelneho zdroje
PointLight {
    color    1.0 1.0 1.0 # barva svetla
    intensity 1.0        # intenzita bodoveho svetla
    location 0.0 4.0 1.0 # pozice svetelneho zdroje
}

# teleso vytvorene tazenim v uzlu Extrusion
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        material Material {
            diffuseColor  0.5 1.0 0.5
            specularColor 1.0 1.0 1.0
        }
    }
    # tvar objektu - geometricke informace
    geometry Extrusion {
        #beginCap FALSE  # pro uzavrenou krychli nastavit na TRUE
        #endCap   FALSE  # pro uzavrenou krychli nastavit na TRUE
        crossSection [
            -1 -1,
             1 -1,
             1  1,
            -1  1,
            -1 -1       # prvni bod je nutne zopakovat
        ]
        spine [
            0 -1 0,
            0  1 0
        ]
        solid FALSE
    }
}

# pomocne teleso slozene z usecek
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        material Material {
            emissiveColor 0 0 1
        }
    }
    # tvar objektu - geometricke informace
    geometry IndexedLineSet {
        # interni poduzel se souradnicemi bodu
        coord Coordinate {
            point [
                -4  0  0,
                 4  0  0,
                 0 -4  0,
                 0  4  0,
                 0  0 -4,
                 0  0  4
            ]
        }
        # indexy do predchoziho pole
        # (pouze usecky) oddelene
        # indexem s hodnotou -1
        coordIndex [
             0  1 -1
             2  3 -1
             4  5 -1
        ]
    }
}



# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 
6803

Vytažený objekt bez horního a dolního uzávěru (podstavy)

Z tohoto příkladu můžeme vidět, že mezi hlavní výhody použití přímkových ploch pro reprezentaci těles patří především jednoduchost a názornost při zadávání jednotlivých plátů, protože v tomto případě uživatel může navrhovat profil křivky v jednoduchém 2D editoru a teprve poté se provede vygenerování celého plátu. Další výhodou je snadný a rychlý převod těchto ploch na polygonální nebo trojúhelníkovou síť s možností následného vykreslení využívajícího podpory grafických akcelerátorů.

6804

Vytažený objekt s oběma uzávěry

4. Rotační šablonování

Další možností tvorby těles 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.).

Ve VRML sice není možné vytvořit SOR skutečným rotováním okolo kružnice, ale máme možnost, jak SOR 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í.

6805

Objekt vytvořený pomocí druhého demonstračního příkladu

5. Druhý demonstrační příklad – rotační šablonování

Ve druhém demonstračním příkladu je ukázána náhrada skutečného rotačního šablonování (SOR) pomocí řídicí křivky, která obsahuje osm bodů ležících na kružnici. Body ve skutečnosti tvoří vrcholy pravidelného osmiúhelníku, protože souřadnice 0,707 značí délku odvěsen trojúhelníku s délkou přepony rovnou jedné. Pokud by bylo zadáno větší množství bodů řídicí křivky, byl by výsledkem i přesnější tvar obsahující více plošek. Pro typické scény, ve kterých se nachází relativně malé objekty (vázy, osvětlovací tělesa apod.), by mělo stačit cca 40 řídicích bodů. Všimněte si také tvaru profilové křivky, která je tvořena trojúhelníkem: první a poslední bod křivky se musí opakovat, aby bylo vytvořeno uzavřené těleso topologicky shodné s toroidem.

6806

Pohled na rotační těleso ze strany podstavy

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Druhy demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0, ktera obsahuje teleso vytvorene
# rotovanim pomoci uzlu Extrusion
#
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
#
# (zalozeno na Floppy'sVRML97 Tutorial)
# ---------------------------------------------------------

WorldInfo {
    title "Druha 3D scena s uzlem typu Extrusion"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "]
}

# nastaveni barevneho prechodu na pozadi sceny
Background {
    skyColor [1 1 0,
              1 0 0]
    skyAngle [3.14]
}

# nastaveni pozice pozorovatele
Viewpoint {
    position 0.0 2.0 10.0
}

# nastaveni svetelneho zdroje
PointLight {
    color    1.0 1.0 1.0 # barva svetla
    intensity 1.0        # intenzita bodoveho svetla
    location 0.0 4.0 1.0 # pozice svetelneho zdroje
}

# teleso vytvorene tazenim v uzlu Extrusion
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        material Material {
            diffuseColor  0.5 1.0 0.5
            specularColor 1.0 1.0 1.0
        }
    }
    # tvar objektu - geometricke informace
    geometry Extrusion {
        crossSection [
            -1  1,
             0  1,
            -1 -1,
            -1  1
        ]
        spine [
             1.000  0.000  0.000,
             0.707  0.000  0.707,
             0.000  0.000  1.000,
            -0.707  0.000  0.707,
            -1.000  0.000  0.000,
            -0.707  0.000 -0.707,
             0.000  0.000 -1.000,
             0.707  0.000 -0.707,
             1.000  0.000  0.000
        ]
        solid FALSE
    }
}

# pomocne teleso slozene z usecek
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        material Material {
            emissiveColor 0 0 1
        }
    }
    # tvar objektu - geometricke informace
    geometry IndexedLineSet {
        # interni poduzel se souradnicemi bodu
        coord Coordinate {
            point [
                -4  0  0,
                 4  0  0,
                 0 -4  0,
                 0  4  0,
                 0  0 -4,
                 0  0  4
            ]
        }
        # indexy do predchoziho pole
        # (pouze usecky) oddelene
        # indexem s hodnotou -1
        coordIndex [
             0  1 -1
             2  3 -1
             4  5 -1
        ]
    }
}



# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 
6807

Změna profilové křivky rotačního tělesa

6. Zkrut a změna měřítka při šablonování

Zajímavou, i když nepříliš často používanou modelovací technikou, je zkrut tělesa nebo změna měřítka profilové křivky při provádění šablonování. Jde vlastně o aplikaci nelineárních transformací, která je prováděna průběžnou změnou profilové křivky při jejím tažení, tj. pohybu ve směru křivky řídicí. Změna měřítka je aplikována na všechny body profilové křivky (střed změny měřítka je umístěn na souřadnicích [0, 0]), které stále leží v rovině X-Z v lokálního souřadného systému (profilová křivka je totiž ve skutečnosti natáčena podle tvaru křivky řídicí). Podobným způsobem je prováděna i rotace profilové křivky, která je vysvětlena v následující kapitole.

7. Třetí demonstrační příklad – zkrut při šablonování

V dnešním třetím demonstračním příkladu je ukázána tvorba válce pomocí profilové křivky ve tvaru kružnice tažené ve směru vektoru – jde tedy o opačný případ tvorby rotačních tělese, než tomu bylo ve druhém demonstračním příkladu. Kromě toho je profilová křivka při svém posunu podrobena rotaci, která je zapsána v atributu orientation. První tři hodnoty představují osu rotace (vektor), čtvrtá hodnota pak úhel zadaný v radiánech. Počet těchto čtveřic uvedených v atributu orientation by se měl shodovat s počtem vrcholů řídicí křivky.

6808

Původní těleso ve tvaru válce

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Treti demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0, ktera obsahuje teleso vytvorene
# vysunutim a zkrutem pomoci uzlu Extrusion
#
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
#
# (zalozeno na Floppy'sVRML97 Tutorial)
# ---------------------------------------------------------

WorldInfo {
    title "Treti 3D scena s uzlem typu Extrusion"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "]
}

# nastaveni barevneho prechodu na pozadi sceny
Background {
    skyColor [1 1 0,
              1 0 0]
    skyAngle [3.14]
}

# nastaveni pozice pozorovatele
Viewpoint {
    position 0.0 1.5 7.0
}

# nastaveni svetelneho zdroje
PointLight {
    color    1.0 1.0 1.0 # barva svetla
    intensity 1.0        # intenzita bodoveho svetla
    location 0.0 4.0 1.0 # pozice svetelneho zdroje
}

# teleso vytvorene tazenim v uzlu Extrusion
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        material Material {
            diffuseColor  0.5 1.0 0.5
            specularColor 1.0 1.0 1.0
        }
    }
    # tvar objektu - geometricke informace
    geometry Extrusion {
        crossSection [
             1.000   0.000,
             0.707   0.707,
             0.000   1.000,
            -0.707   0.707,
            -1.000   0.000,
            -0.707  -0.707,
             0.000  -1.000,
             0.707  -0.707,
             1.000   0.000
        ]
        orientation[0 1 0 0, 0 1 0 3.14]
        spine [
             0 -1 0,
             0  1 0
        ]
        solid FALSE
    }
}

# pomocne teleso slozene z usecek
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        material Material {
            emissiveColor 0 0 1
        }
    }
    # tvar objektu - geometricke informace
    geometry IndexedLineSet {
        # interni poduzel se souradnicemi bodu
        coord Coordinate {
            point [
                -4  0  0,
                 4  0  0,
                 0 -4  0,
                 0  4  0,
                 0  0 -4,
                 0  0  4
            ]
        }
        # indexy do predchoziho pole
        # (pouze usecky) oddelene
        # indexem s hodnotou -1
        coordIndex [
             0  1 -1
             2  3 -1
             4  5 -1
        ]
    }
}



# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 
6908

Zkroucený válec

CS24_early

8. Obsah další části tohoto seriálu

V následující části seriálu o grafických formátech a metaformátech se budeme zabývat již minule slibovaným způsobům nanášení textur na objekty nacházející se ve vytvářené trojrozměrné scéně. Vše si samozřejmě vysvětlíme i na několika demonstračních příkladech.

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.