Zadání
ii
České vysoké učení technické v Praze Fakulta elektrotechnická Katedra počítačů Diplomová práce Müllerova vila - interaktivní procházka Bc. Josef Suchý Vedoucí práce: Prof. Ing. Žára Jiří, CSc. Studijní program: Výpočetní technika - magisterský strukturovaný Obor: Počítačová grafika Květen 2011 iii
iv
Prohlášení Prohlašují, že jsem práci vypravoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu 60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon). V Praze dne 13.5.2011 v
vi
Abstract The goal of this paper is to model the rough construction of the Müller Villa, focusing on the dynamic loading of different rooms according to the movement of the avatar and a guide for modeling structures of similar type. Abstrakt Cílem práce je vymodelování hrubé stavby Müllerovy vily se zaměřením na dynamické načítání jednotlivých místností podle pohybu avatara a vytvoření návodu pro modelování staveb podobného typu. vii
viii
Obsah 1. Úvod... 1 2. Cíl práce... 1 3. Historie Müllerovi vily... 3 4. Analýza problému... 5 4.1 VRML/X3D... 5 4.2 Modelovací nástroje... 6 4.2.1. Blender... 7 4.2.2. 3ds Max... 8 4.2.3. Maya... 8 4.2.4. VRML Pad... 9 4.2.5. Chisel... 10 4.2.6. Shrnutí... 10 5. Návod pro modelování... 11 5.1 Stavební plány... 11 5.2 Fotografování... 11 5.3 Vytváření textur v programu Photoshop... 13 5.3.1. Odstranění lesklých ploch... 13 5.3.2. Zrcadlení... 14 5.4 Modelování místností v programu Maya... 15 5.5 Texturování... 19 5.6 Export a následná úprava dat... 19 5.7 Návrh prototypu... 20 5.8 Složení celého objektu... 21 6. Realizace modelování Müllerovi vily... 23 6.1 Plány... 23 6.2 Rozdělení objektu na místnosti... 24 6.3 Textury... 25 6.4 Modelování místností a texturování... 27 6.5 Export, úprava a skládání celku... 33 6.6 Časová náročnost modelování... 34 7. Dynamické načítání... 35 7.1 Datová struktura pro dynamické načítání... 35 ix
7.2 Script dynamického načítání... 38 7.3 Vytvoření tabulky 7.1... 40 8. Procházka... 43 9. Testování... 47 10. Závěr... 51 11. Literatura... 53 Příloha A Uživatelská příručka... 55 Příloha B Obsah přiloženého DVD... 57 Příloha C Mapy vily a rozdělení místností... 59 Příloha D Celá tabulka pro dynamické načítání... 65 Příloha E Porovnání modelu a fotografií... 69 x
Seznam obrázků Obrázek 3.1 Müllerova vila po stavbě... 3 Obrázek 5.1 Fotografie dlaždičky a pomocná vodítka (modré čáry)... 13 Obrázek 5.2 Fotografie dlaždičky po úpravě perspektivy, po oříznutí a odstranění odrazu... 14 Obrázek 5.3 Fotografie části podlahy... 14 Obrázek 5.4 Fotografie podlahy po zrcadlení... 15 Obrázek 5.5 První stěna modelu místnosti... 15 Obrázek 5.6 Model po prvním kroku nástroje extrude, vymodelované všechny stěny místnosti 16 Obrázek 5.7 Označený polygon pro okno (vlevo) výsledek po rozdělení (vpravo) 17 Obrázek 5.8 Vytažení okna... 17 Obrázek 5.9 Označení polygonu pro dveře (vlevo) výsledek po rozdělení (vpravo)... 18 Obrázek 5.10 Výsledný model po vytvoření dveří... 18 Obrázek 5.11 Výsledný model místnosti... 18 Obrázek 5.12 Špatně nanesená textura (vlevo) správně nanesená textura (vpravo) 19 Obrázek 6.1 Sklep... 24 Obrázek 6.2 Chodba ve sklepě... 28 Obrázek 6.3 Hlavní chodba... 28 Obrázek 6.4 Schody pro služebné... 29 Obrázek 6.5 Budoár... 30 Obrázek 6.6 Hlavní místnost... 30 Obrázek 7.1 Struktura dynamického načítání... 35 Obrázek 7.2 Obalový kvádr pro místnost... 41 Obrázek 7.3 Špatné nastavení hodnot kvádrů (vlevo), správné rozdělení kvádrů (vpravo) 42 Obrázek 8.1 Schéma událostí při animované procházce... 44 Obrázek 9.1 Graf minimální FPS Cortona... 49 Obrázek 9.2 Graf minimální FPS BS Contact... 50 Obrázek 9.3 Část plánu budovy s označením pádu BS Contactu... 50 Obrázek C.1 Sklep... 59 Obrázek C.2 - Přízemí... 60 Obrázek C.3 Mezipatro... 61 Obrázek C.4 1. patro... 62 Obrázek C.5 2. patro... 63 Obrázek E.1 Porovnání chodby... 69 xi
Obrázek E.2 Porovnání příchozí chodby... 70 Obrázek E.3 Porovnání hlavní místnosti... 71 xii
Seznam tabulek Tabulka 6.1 Rozdělení prací na modelu... 23 Tabulka 6.2 Popis místností sklep... 25 Tabulka 6.3 Vytvořené textury... 27 Tabulka 6.4 Vytvořené textury... 32 Tabulka 6.5 Časová náročnost jednotlivých etap... 34 Tabulka 7.1 Začátek tabulky aktuální místnosti pro Model Müllerovy vily.. 39 Tabulka 7.2 Tabulky potřebné uzly... 40 Tabulka 9.1 Měření FPS bez dynamického načítání... 48 Tabulka 9.2 Měření FPS s dynamickým načítáním... 49 Tabulka C.1 Popis místností sklep... 59 Tabulka C.2 Popis místností přízemí... 60 Tabulka C.3 Popis místností mezipatro... 61 Tabulka C.4 Popis místností 1.patro... 62 Tabulka C.5 Popis místností 2.patro... 63 Tabulka D.1 Kompletní převodní tabulka z pozice na ID místnosti... 67 xiii
xiv
1. Úvod Jak budovy opravdu vypadají, záleží na stylu, ve kterém se stavěly a samozřejmě na architektovi, který budovu nejen nakreslil, ale také dohlédl na její výstavbu. Každá budova se liší od ostatních a je svým způsobem originální. Mezi významné architektonické památky patří Müllerova vila, kterou navrhl architekt Adolf Loose. Přes internet si lze prohlédnout fotografie a různé materiály této památky. Samotná fotografie však nenahradí prostorovou představu uspořádání místností a chodeb. Lepší pohled by nám naskytl 3D model, kterým by mohl návštěvník procházet a manipulovat s předměty. V současné době neexistuje žádný takový model a tak vznikl velice zajímavý projekt, který za pomoci jazyka VRML a X3D umožní vymodelovat tuto památku. Uživatel si bude moci tuto budovu prohlédnout a projít, aniž by ji navštívil. Müllerova vila je velice rozsáhlá a k modelování bude zapotřebí hodně času, jelikož samotné modelování virtuálních světů je náročná práce. Na tomto projektu jsem spolupracoval společně s diplomantem Petrem Mohelským. Tuto diplomovou práci jsem si vybral, jelikož modelování virtuálních světů mě baví. Müllerova vila upoutala mou pozornost nevšední strukturou a její modelování bude zajímavé. 2. Cíl práce Cílem práce je za pomoci jazyka VRML vymodelovat model Müllerovy vily. Mým úkolem je vymodelování téměř všech místností z pohledu hrubé stavby bez nábytku. Tři místnosti, které na sebe navazují a zahradu vily má za úkol vymodelovat kolega Petr Mohelský. Další částí mé práce je navrhnout vhodnou strukturu pro dynamické načítání místností a to implementovat. Dalším cílem je návrh a realizace virtuální procházky, která provede uživatele vilou. Posledním cílem je na základě získaných zkušeností vytvořit návod na modelování budov podobného stylu. Společným cílem je navrhnou strukturu tak, aby se daly naše práce spojit v jeden celek a vytvořit tím celý objekt Müllerovy vily. 1
2
3. Historie Müllerovi vily Roku 1928 zakoupili manželé Müllerovi stavební pozemek v Praze 6 Střešovicích, kde se rozhodli postavit dům. Jako architekta si vybrali známého vídeňského architekta Adolfa Loose. Jelikož Adolf Loose byl velice zaneprázdněný spolupracoval na projektu s plzeňským architektem Karlem Lhotou. Stavební povolení bylo vydáno v červnu 1929. V březnu 1930 byla stavba dokončena a 12. května 1930 se Müllerovi přestěhovali z Plzně do Prahy. Velikonoce roku 1930 již trávili v novém domově. V průběhu léta roku 1930 se dokončovalo zařízení vily. Podle návrhů vynikajících zahradních architektů Camillo Schneidera, Karla Förstera a Hermanna Matterna se započalo s úpravou zahrady. V roce 1948 se stává vila tzv. činžovní vilou, formálně zůstává ve vlastnictví Müllerových, ti ji však nemohou plně používat. Po smrti Františka Müllera je vila znárodněna a stává se majetkem státu. Obrázek 3.1 Müllerova vila po stavbě Po pádu komunistické vlády v Československu byla Müllerova vila na základě restitučního zákona vrácena dceři původních majitelů, paní Evě Maternové, která jí následně nabídla k prodeji. V lednu roku 1995 bylo schváleno odkoupení Müllerovy vily do vlastnictví hl. m. Prahy. Tento historický krok byl učiněn nejen na základě apelu světové odborné veřejnosti, ale také na základě doporučení Pražského grémia (sdružení pro ochranu a rozvoj kulturního prostoru hl. m. Prahy). Dne 30.6.1995 převzalo vilu do správy Muzeum hl. m. Prahy. Více historie a informací ohledně Müllerovy vily lze zjistit v [1]. 3
4
4. Analýza problému Prostudoval jsem jakým způsobem by bylo vhodné vymodelovat tuto budovu. Hledáním informací na internetu a v odborné literatuře jsem zjistil, že prozatím žádný návod pro modelování budov, které mají využívat dynamické načítání není. Existuje mnoho různých modelů budov, ale ty nevyužívají dynamické načítání a po celou dobu jsou načteny v paměti i ty části, které nejsou vidět a zbytečně tak zatěžují počítač. K vytvoření modelu jsou potřeba plány, aby výsledný model byl co nejvíce realistický a jeho velikost odpovídala v nějakém měřítku skutečnosti. Proto je nezbytné získat co nejvíce informací o modelovaném objektu. Mohou to být plány, výkresy, fotografie, ale velice velkým přínosem je osobní návštěva modelovaného objektu. Pro modelování je vhodné zvolit nějaký 3D modelovací program, ve kterém se daný objekt bude modelovat. Přehled vybraných 3D modelovacích programů je popsán níže. Pro model je požadováno použít jazyk VRML (Virtual Reality Modeling Language), proto je zapotřebí použít nějaký editor, který umí pracovat s tímto jazykem. Vybrané programy pro práci s jazykem VRML jsou popsány níže. Pro prohlížení vytvořeného modelu je zapotřebí mít nainstalovaný nějaký prohlížeč, který umí zobrazit soubory napsané jazykem VRML. 4.1 VRML/X3D 1 VRML jazyk byl navržen především pro popis trojrozměrných scén obsahujících aktivní i pasivní objekty. Nejedná se samozřejmě o jediný formát (či jazyk) této kategorie, dnes se například poměrně razantním způsobem prosazuje formát X3D. Tento jazyk definovaný normou ISO, se používá pro popis jednotlivých prostorových těles i celých rozsáhlých scén v aplikacích virtuální reality a také na Internetu, kde slouží jako přenosový prostředek pro data popisující trojrozměrné modely. Prostorová tělesa lze v tomto formátu popsat pomocí seznamu souřadnic vrcholů a plochami specifikovanými indexy svých vrcholů do seznamu vrcholů ve skutečnosti se jedná o poměrně úsporný způsob zápisu, především v porovnání s přímým zápisem vrcholů polygonů. Pro základní geometrická tělesa, mezi něž patří krychle, koule, kužel a 1 Teorie převzata a částečně přepsána vlastními slovy z [2] a [3] 5
podobně, i pro objekt typu text, jsou definována vlastní klíčová slova reprezentující uzly modelu, takže je není nutné rozkládat na trojúhelníky, což by bylo prostorově náročné a při přenosu modelů po internetu i pomalé. Rozklad na trojúhelníky je ponechán na prohlížeči VRML, který musí spolupracovat s grafickým akcelerátorem, například přes API grafické knihovny OpenGL. Také je podporováno texturování. Tělesa lze dokonce potáhnout texturou uloženou ve formě videa. Ve VRML je celá trojrozměrná scéna popsaná pomocí objektů, které jsou hierarchicky uspořádány ve stromové struktuře. Samotný formát souborů uložených ve VRML je založen na textovém popisu scény. Přesný zápis struktury a popis jednotlivých prvků lze nalézt např. v [2]. Grafický formát X3D z velké části vychází z formátu VRML ovšem opravuje některé jeho nedostatky a především umožňuje použít i syntaxi zápisu založenou na XML. To s sebou nese celou řadu předností, především jednoduché zpracování celého dokumentu pomocí velkého množství knihoven a programových API pro práci s XML. Možnost poloautomatické serializace a deserializace prostorové scény do X3D, relativně snadné převody mezi X3D a dalšími formáty. Pro více informací o X3D lze najít v [3]. 4.2 Modelovací nástroje Pro vytvoření modelu lze použít jakýkoliv textový editor, do kterého budeme zapisovat příkazy jazyka VRML a následně daný soubor uložíme jako soubor jazyka VRML. Tento postup je použitelný, při modelování malých světů nebo malých částí světů, které nemají složitou geometrii. Také je tento postup výhodný, když už máme hotovou geometrii a vytváříme už jen dynamiku (animace, reakci na pohyb, skripty). Pro zapisování jazyka VRML existují různé speciální nástroje. Jsou to editory se zvýrazněním syntaxe jazyka VRML a dalšími funkcemi, které ulehčí zapisování jazyka a vytvoření požadovaného objektu nebo světa. Snadněji se s nimi vytvářejí interaktivní předměty a animace. Pro modelování složitých světů a objektů je tento způsob modelování velice pracný a časově náročný. Proto je dobré využít nějaký nástroj, který umožňuje jednodušší modelování objektů. Jedná se o nějaký 3D editor, který má grafické znázornění modelovaného objektu a umožňuje grafické modelování. K takovému 6
modelování lze doporučit několik 3D programů, které zjednoduší modelování a umí vymodelovaný objekt exportovat do jazyka VRML. Zástupce 3D modelovacích programů jsou Blender [4], 3ds Max [5] a Maya [6]. Pro úpravu už vytvořených VRML souborů jsou dobré editory, které umí pracovat se strukturou jazyka VRML. Zástupce těchto editorů jsou VRML Pad [7] a Chisel [8]. 4.2.1. Blender Jedná se o zajímavý 3D grafický program, který je freewarovou alternativou k programu Maya a 3ds Max. Umožňuje export do VRML, a lze ho tedy využít k modelování. Umožňuje export do VRML a tudíž je vhodnou volbou pro modelování. Obsahuje VRML 2.0 exportér, který exportuje vymodelovanou geometrii jako indexedfaceset. Exportér zapisuje zbytečné hodnoty, které není potřeba exportovat, protože mají iniciální hodnotu. Při exportu vzniká duplicita názvů v parametru DEF jak ukazuje následující kód. DEF Cube Shape { # první definice názvu appearance Appearance { material DEF mat_material Material { diffusecolor 0.8 0.8 0.8 ambientintensity 0.5 specularcolor 1.0 1.0 1.0 emissivecolor 0.0 0.0 0.0 shininess 0.196 transparency 0.0 } # Material } # Appearance geometry DEF Cube IndexedFaceSet { # duplicitní definice názvu solid TRUE # one sided coord Coordinate { point [ 1.0-1.0-1.0, 1.0-1.0 1.0, ] # point } # Coordinate coordindex [ ] # coordindex creaseangle 0.0 # in radians } # IndexedFaceSet } # Shape 7
4.2.2. 3ds Max 3ds Max je 3D modelovací program, který umožňuje export do VRML. Výhoda tohoto programu je export primitiv do VRML, to jest pokud budeme potřebovat exportovat základní tvary například kvádr nebo kouli pak je tento program vhodný pro modelování, protože tyto tvary se exportují jako základní primitiva jazyka VRML. Nevýhodou je, že při exportu mohou vznikat chyby, které se projeví jako duplicitní názvy parametru DEF. Exportér také exportuje zbytečně iniciální hodnoty polí. 4.2.3. Maya Jde o 3D modelovací program, který slouží k modelování 3D grafiky. Exportér tohoto programu neumí exportovat primitiva. Pokud budeme chtít exportovat krychli bude exportována jako indexedfaceset a ne jako box. Exportér využívá pro export Switch, Groupe, DEF a USE. Tato struktura sice zvětšuje velikost souboru, ale negeneruje duplicitní názvy. Exportovaný soubor je také přehlednější. Nevýhodou je export hodnot polí, která mají iniciální hodnotu. Ukázka exportu: Switch { whichchoice -1 choice [ Shape { appearance Appearance { material DEF lambert1_0 Material { diffusecolor 0.400000 0.400000 0.400000 specularcolor 0.000000 0.000000 0.000000 emissivecolor 0.000000 0.000000 0.000000 shininess 0.000000 transparency 0.000000 } } } Shape { geometry DEF pplane1_0geo IndexedFaceSet { convex FALSE 8
solid FALSE coord DEF pplane1geopoints Coordinate { point -1.000-0.000 1.000, ] } coordindex [ ] } } ] } Group { children [ DEF pplane1 Transform { translation 0.000000 0.000000 0.000000 rotation 0.000000 0.000000 0.000000 0.000000 scale 1.000000 1.000000 1.000000 scaleorientation 0.0 0.0 1.0 0.0 children Shape { appearance Appearance { material USE lambert1_0 } geometry USE pplane1_0geo } } ] } 4.2.4. VRML Pad Tento nástroj umožňuje editaci VRML souborů se zvýrazněním syntaxe. Jedná se o jednouchý nástroj, se kterým se velice snadno pracuje. Lze použít při vytváření skriptů a animací. Pro práci s tímto nástrojem je dobré mít již namodelovanou složitější geometrii, protože tento program není vhodný na vytváření složité geometrie. Nevýhodou je, že se jedná o placený editor a jeho neregistrovaná verze umožňuje úpravu souborů do velikosti 64kb. 9
4.2.5. Chisel Je velice jednoduchý program pro úpravu VRML souborů. Jeho výhodou je, že je zdarma. Umí pročistit VRML soubory a odebrat zbytečné věci. Dále pak umožňuje formátování textu, který se pak lépe čte. Dále podporuje export do X3D a mnoho dalších funkcí, které lze nastavit. 4.2.6. Shrnutí Všechny výše popsané modelovací programy lze využít pro modelování, ale je zapotřebí po exportu vždy upravit výsledný exportovaný soubor nějakým VRML editorem. Smazáním iniciálních hodnot se zmenší velikost souborů, která je podstatná pro přenos dat přes internet. U programu 3ds Max a Blender je zapotřebí ještě zkontrolovat, jestli při exportu nevznikly nějaké duplicitní názvy. Já jsem si pro modelování vybral program Maya. 10
5. Návod pro modelování Na základě konzultace s vedoucím práce byla vložena tato kapitola, která má za úkol vysvětlit jak postupovat při získávání podkladů před modelováním, způsob úpravy textur, modelování jednotlivých místností a úpravu částí modelu do konečné podoby pro použití dynamického načítání. 5.1 Stavební plány Základem pro vymodelování objektu jsou stavební plány v tištěné nebo lépe elektronické podobě. Plány by měly být co nejaktuálnější, aby co nejlépe popisovaly modelovaný objekt. U starších objektů nejspíše budou plány jen v tištěné podobě. Plány by měly být okótované, aby bylo patrné jaké rozměry mají jednotlivé místnosti. Může se stát, že dostaneme plány jen v měřítku a je tudíž nutné všechny potřebné rozměry odměřovat pravítkem. V tomto případě je pak nutné si všechny potřebné rozměry odměřit z plánů. Může se stát, že k danému objektu neexistují plány a pak je tedy nutné vzít metr a potřebné rozměry naměřit přímo v objektu. Podle plánů vhodně rozdělíme objekt na místnosti nebo skupiny místností, abychom později mohli aplikovat na vytvořený model dynamické načítání místností. Pro lepší představu o modelovaném objektu, je dobré mít také fotografie jednotlivých místností, protože stavební plány nezachycují všechny detaily, ale hlavně pro modeláře, který má jen základní znalosti čtení stavebních plánů, jsou fotografie velkým přínosem pro modelování. Před začátkem modelování je vhodné navštívit modelovaný objekt a projít jednotlivé místnosti. Takto získá modelář jedinečnou představu o modelovaném objektu a modelování je jednodušší. 5.2 Fotografování Pro dosažení co nejlepší kvality fotografie je zapotřebí před samotným začátkem fotografování vzít v úvahu nastavení fotoaparátu. Dobré nastavení fotoaparátu nám umožní získat fotografie v požadované kvalitě a následné zpracování pro získání textur nebude tak náročné, protože bude stačit udělat méně úprav fotografií. 11
V této kapitole není za úkol vysvětlit jakým způsobem nastavit fotoaparát, ale jen nastínit, jaké parametry se dají nastavovat. Způsob nastavení fotoaparátu před fotografováním a problematiku jednotlivých nastavení je ponecháno na čtenáři. Při fotografování bychom neměli opomenout nastavení rozlišení fotoaparátu [9], nastavení vyvážení bílé barvy, aby bílá barva byla opravdu bílou barvou [10], použití blesku a nasvícení fotografovaného povrchu [11], ostrost snímku [12], ohniskovou vzdálenost [13], nastavení délky expozice [14], načasování clony [15] a v neposlední řadě zvážit použití stativu. Samotné fotografování objektu lze rozdělit na dvě části: Fotografování materiálů pro textury Je vhodné zvolit jednotný postup, který aplikujeme v každé místnosti. Postupujeme z jednoho rohu místnosti po směru nebo proti směru hodinových ručiček podél stěn až se vrátíme zase zpět k výchozímu rohu. Po celou dobu se snažíme vyfotografovat všechny materiály, které budeme potřebovat. Nakonec vyfotografujeme strop a podlahu. Dále postupujeme systematicky po celém objektu například od sklepa až po nejvyšší patro. Každý materiál vyfotografujeme nejméně dvakrát, aby se dala vybrat lepší fotografie a zní vytvořit texturu. Při fotografování fotografií k vytváření textur dbáme následujících pokynů: o Fotografujeme s největším rozlišením (zmenšení je vždy možné) o Snažíme se vyfotografovat daný materiál tak, aby byl kolmo k fotoaparátu o Snažíme se, aby na fotografii bylo co nejméně odrazů od okolních objektů a světel o Pokud je dostatečné osvětlení fotografujeme bez blesku (blesk působí rušivě na materiálu, který fotografujeme) Fotografování místností pro modelování Při modelování velice pomohou fotografie místností, protože lépe znázorňují danou místnost a lépe si představíme tento prostor. Fotografie by měly zachycovat celou místnost, popřípadě nějaký atypický detail. Místnost vyfotografujeme alespoň ze čtyř pohledů a to z každého rohu místnosti. Pro složitější místnosti potřebujeme vyfotografovat více fotografií podle složitosti místnosti a uvážení. 12
5.3 Vytváření textur v programu Photoshop Pro reálnější podobu modelu naneseme na povrchy textury a tím zlepšíme vizuální stránku modelu. Textury mohou být dvojího typu. První typ textury nanášíme na povrch opakovaně. Tu upravíme tak, aby nebylo patrné opakované nanášení. Například u dlaždic, betonu, parket. Druhý typ textury nanášíme jen jednou bez opakování například okna, dveře. V následujících podkapitolách je zmíněno jakým způsobem se dají upravovat fotografie při tvorbě textur. Jsou zde uvedeny jen případy, které se nejčastěji používají. Další způsoby úprav fotografií lze najít v [16]. 5.3.1. Odstranění lesklých ploch Při vytváření textury z fotografie, na které jsou patrné lesklé plochy budeme postupovat v programu Photoshop [17] následovně. Nejprve si vytvoříme vodítka (na obrázku 5.1 modré čáry), která jsou na sebe kolmá a rozmístíme je, tak aby tvořily obdélník jak ukazuje obrázek 5.1. Obrázek 5.1 Fotografie dlaždičky a pomocná vodítka (modré čáry) Jak je patrné z obrázku 5.1, dlaždice vypadá jako lichoběžník a proto ji pomocí nástroje perspektiva a libovolná transformace upravíme tak, aby byly spáry rovnoběžné s pomocnými vodítky. Na obrázku 5.2 vlevo vidíme dlaždice po úpravě perspektivy a 13
vpravo po odstranění odrazu. Odraz odstraníme pomocí nástroje klonování, který umožňuje kopírovat zadané části obrazu do cílové části. Takto upravenou texturu už můžeme nanést na nějakou plochu. Obrázek 5.2 Fotografie dlaždičky po úpravě perspektivy (vlevo), po oříznutí a odstranění odrazu (vpravo) 5.3.2. Zrcadlení Lze využít v případě, že nelze vyfotografovat celý objekt. Například z důvodu, že se s objektem nedá hýbat a nebo není dostatek prostoru, aby se dal objekt vyfotografovat z dané vzdálenosti celý. Zrcadlení lze použít jen v případě, že se jedná o symetrický objekt. Příkladem je část podlahy, která nešla z důvodu vzdálenosti vyfotografovat celá. Na obrázku 5.3 je vidět vyfotografovaná část a obrázek 5.4 ukazuje celek po použití zrcadlení. Obrázek 5.3 Fotografie části podlahy 14
Obrázek 5.4 Fotografie podlahy po zrcadlení 5.4 Modelování místností v programu Maya Následující návod ukáže, jakým způsobem budeme postupovat při modelování místností. Jako první zvolíme počátek souřadnicového systému, to jest jakým způsobem bude model místnosti orientován na souřadnice os x,y,z a zvolení nulového bodu místnosti na souřadnicových osách. Pokud máme zvolen nulový bod místnosti a orientaci os, můžeme začít modelovat stěny. Jako první si vytvoříme polygon, který bude vysoký jako výška stropu místnosti a jeho šířka bude velikost stěny vycházející od zvoleného nulového bodu. Dále nastavíme viditelnost normál k plochám, abychom viděli, jakým směrem je normála plochy. Polygon nejprve otočíme a posuneme, aby jeho spodní roh byl v nulovém bodu a normála polygonu směřovala do prostoru místnosti jak ukazuje obrázek 5.5. Obrázek 5.5 První stěna modelu místnosti 15
Vybere hranu, která je na obrázku 5.5 označena modrou šipkou a zvolíme nástroj extrude. Vybranou hranu posuneme podle geometrie místnosti tak, aby vznikla stěna. Tento krok ukazuje obrázek 5.6 vlevo. Pro lepší přesnost zadáváme souřadnice do textového pole nástroje extrude. Dále pokračujeme stejným způsobem, dokud nevymodelujeme všechny stěny místnosti, jak je vidět na obrázku 5.6 vpravo. Už při modelování stěn bereme v úvahu, kde budou umístěny okna a dveře a stěny podle toho rozdělíme. Umístění dveří a rozdělení stěny je na obrázku 5.6 vlevo znázorněno modrou šipkou. Obrázek 5.6 Model po prvním kroku nástroje extrude (vlevo), vymodelované všechny stěny místnosti (vpravo) Když máme vymodelované stěny místnosti následně začneme modelovat okna a otvor pro dveře. Označíme plochu, kde má být umístěno okno (na obrázku 5.7 vlevo šrafovaný obdélník) a použijeme nástroj cut face tool, který označený polygon rozdělí na dva. Následně nastavíme výšku řezu spodní hrany okna (na obrázku 5.7 vpravo modrou šipkou). Rozdělení aplikujeme ještě jednou a jako výšku řezu nastavíme horní hranu okna. Výsledek je vidět na obrázku 5.7 vpravo. 16
Obrázek 5.7 Označený polygon pro okno (vlevo) výsledek po rozdělení (vpravo) Nakonec označíme vzniklý polygon pro okno a pomocí nástroje extrude ho vytáhneme tak, jak ukazuje obrázek 5.8. Obrázek 5.8 Vytažení okna Dále vytvoříme otvor pro dveře. Označíme polygon (obrázek 5.9 vlevo), kde mají být dveře a pomocí nástroje cut face tool rozdělíme polygon na dvě části a nastavíme řeznou rovinu na výšku dveří. Výsledek je vidět na obrázku 5.9 vpravo. Nakonec už jen stačí vymazat spodní polygon (obrázek 5.10). 17
Obrázek 5.9 Označení polygonu pro dveře (vlevo) výsledek po rozdělení (vpravo) Obrázek 5.10 Výsledný model po vytvoření dveří Vybereme jednu hranu (která je na obrázku 5.10 označena šipkou) a pomocí nástroje extrude ji přetáhneme na druhou stranu místnosti, tak aby vytvořila strop. Toto uděláme i pro druhou hranu a vše zopakujeme při tvorbě podlahy. Výsledný konečný model geometrie místnosti ukazuje obrázek 5.11. Obrázek 5.11 Výsledný model místnosti 18
5.5 Texturování Když máme vymodelovanou geometrii místnosti, přidáme pro lepší vizualizaci textury a obarvíme povrchy. Pomocí nástroje cut face tool rozdělíme model na části tak, aby se dala každému povrchu přiřadit barva nebo textura. K přiřazení barev a textur slouží nástroj hypershade, ve kterém si vytvoříme materiály k nanesení na povrchy. Bude jich takový počet, kolik obsahuje místnost barev a textur. Jelikož automatické nanesení textury většinou nenanese texturu správně (obrázek 5.12 vlevo), je zapotřebí použít UV mapování textur, abychom mohli texturu správně nanést na povrch (jak ukazuje obrázek 5.12 vpravo). Takto upravíme všechny textury a model místnosti je hotov. Obrázek 5.12 Špatně nanesená textura (vlevo) správně nanesená textura (vpravo) 5.6 Export a následná úprava dat Po exportu dat upravíme cesty k texturám, protože exportér programu Maya nenastaví správnou cestu k souboru. Vytvoříme prototypy místností z důvodu následné aplikace virtuální procházky. Editujeme exportovaný soubor a ručně upravíme zdrojový text. Na tyto úpravy je vhodný program VRML Pad nebo program Chisel. Dobrou vlastností programu Chisel je možnost pročištění kódu od zbytečných dat a také formátování textu pro lepší čitelnost. 19
5.7 Návrh prototypu Kvůli napojení centrálního otevření dveří na události jednotlivých místností je zapotřebí, aby měla místnost definovanou strukturu, kterou popisuje prototyp níže. Tato úprava je nutná pouze u místností, které mají dveře a budeme je potřebovat otevírat pomocí skriptu. Návrh prototypu vypadá následovně: PROTO [ evenin SFTime dvere_1 evenin SFTime dvere_2 ] { # prototyp dveří, který vymodeloval kolega Petr Moheský; # parametr start typu SFTime # touto definicí se propojí událost prototypu s dveřmi dvere { start IS dvere_1} # lze definovat více dveří v mstnosti dvere { start IS dvere_2} # geometrie místnosti } Pro správnou funkčnost je zapotřebí, aby vytvoření instance prototypu místnosti byla v souboru na třetím místě. Tento požadavek je z důvodu propojení událostí dynamického načítání místností a je vysvětlen v kapitole 6, která se zabývá samotným dynamickým načítáním. Příklad souboru po úpravě : WorldInfo { # první uzel title "servant_room_patro" } NavigationInfo { # druhý uzel type [ "EXAMINE" "ANY" ] } EXTERNPROTO dvere [ # definice externího prototypu není uzel field SFInt32 zap eventin SFTime start ] "../prototype/dvere.wrl" PROTO servant_room_patro [ # definice prototypu místnosti eventin SFTime dvere_chodba eventin SFTime dvere_quest 20
] { Group { children [ Transform { # umístění dveří na pozici v místnosti translation 1.225 0-3.1 rotation 0 1 0-1.57 children [ dvere { zap 0 start IS dvere_chodba # propojení událostí # na prototyp } ] } Transform { translation -.3 0-4.825 children [ dvere { zap 2 start IS dvere_quest } ] } # geometrie místnosti } servant_room_patro {} # instatce prototypu třetí uzel 5.8 Složení celého objektu Po vymodelování a úpravě modelu sestavíme místnosti tak, aby tvořily výsledný objekt. To provedeme pomocí uzlu transform pro každou místnost. Každý uzel transform reprezentuje jednu místnost. Všechny místnosti rozmístíme tak, aby na sebe navazovaly. Zde se ukáže, zda jsme při modelování neudělali chybu. Pokud místnosti nenavazují ( špatná velikost dveří, otvorů, místností ). Musíme zkontrolovat rozměry místností a opravit případné nesrovnalosti. Nakonec aplikujeme Skript dynamického načítání popsaný v kapitole 7 a virtuální procházku popsanou v kapitole 8. 21
22
6. Realizace modelování Müllerovi vily Model Mülerovy vily jsem modeloval společně s Petrem Mohelským. Nejprve bylo zapotřebí rozdělit práci na celém projektu. Na základě konzultace s vedoucím práce bylo modelování rozděleno podle tabulky 6.1. Moje práce je založená na stavební části budovy, implementaci dynamického načítání místností s ohledem na pozici avatara a vytvoření virtuální procházky. činnost Model koupelny Model ložnice Model dětské ložnice Model dveří Model zahrady Mapa Modely ostatních místností Rozmístění dveří Dynamické načítání Virtuální procházka Zodpovídá Petr Mohelský Petr Mohelský Petr Mohelský Petr Mohelský Petr Mohelský Petr Mohelský Josef Suchý Josef Suchý Josef Suchý Josef Suchý Tabulka 6.1 Rozdělení prací na modelu 6.1 Plány Plány Müllerovy vily jsem měl v tištěné podobě a pouze v měřítku. Tato skutečnost velice prodlužovala modelování, jelikož bylo potřeba všechny velikosti místností, dveří, oken a tak dále změřit pravítkem. Jelikož nebyly na plánu kóty, musel jsem některé hodnoty dopočítávat, aby se nestalo chybou měření, že jedna stěna čtvercové místnosti je delší. Při měření velikosti místností nastává chyba měření a potřeba definovat nejmenší jednotku, kterou lze odečíst. Já jsem zvolil 0,5 mm, protože menší jednotku už nelze na pravítku určit. Jeden milimetr na plánu odpovídá 10cm ve skutečnosti. Proto je Model Müllerovy vily vymodelován s přesností na 5cm. 23
6.2 Rozdělení objektu na místnosti 2 Pro použití dynamického načítání jsem rozdělil objekt na místnosti, které jsem modeloval zvlášť a následně pomocí posunutí sestavil dohromady a tím zhotovil výsledný model. Každá místnost má definovaný svůj nulový bod označený na obrázku 6.1 červeně. Každý nulový bod patří k nejbližšímu ID místnosti. Pokud nějaké ID přebývá má nulový bod na jiném plánu. Do této kapitoly jsem zahrnul rozdělení jen sklepní části budovy. Ostatní plány a rozdělení místností jsem uvedl v příloze C. Čísla ID místností jsem zvolil podle seřazené posloupnosti názvu místností, které se zobrazují jako název místnosti na panelu avatara. 28 26 14 4 34 19 7 18 8 2 Obrázek 6.1 Sklep 2 Plány Müllerovy vily jsem dostal na vyžádání ve vile, ale bylo nutné podepsat, že je použiji jen pro studijní účely 24
ID pokoje v plánu na Obr. 6.1 Jméno pokoje Poznámka 2 Místnost s boilerem 4 Technická místnost 7 Chodba 8 Schody Nulový bod v přízemí Obrázek C.2 (příloha C) 14 Garáž 18 Prádelna 1 19 Prádelna 2 26 Pokoj pro sluhy 28 Sklad 34 WC Tabulka 6.2 Popis místností sklep 6.3 Textury Pro vytvoření textur jsem použil program Adobe Photoshop [17]. Textury jsem zpracovával postupně pro jednotlivé místnosti, to jest nejprve jsem zhotovil textury pro jednu místnost, vymodeloval ji a následně nanesl vytvořené textury. Některé, textury jsem převzal od Petra Mohelského z důvodu jednotnosti povrchu materiálů v místnostech. Místnosti se stejným materiálem musí i v modelu obsahovat stejný povrch a tím působit jako jeden celek. Převážně jsem vytvářel textury různých dvířek a oken v každé místnosti. Protože na nafocených fotografiích stály předměty před okny nebo byly fotografovány z nevhodného úhlu, musel jsem použít nástroje pro úpravu perspektivy a také retušovací razítko, abych dostal nezkreslené textury. Seznam všech vytvořených textur popisuji v tabulce 6.3. Z důvodu častého výskytu jsem všechny textury umístil do jednoho adresáře, aby se v projektu neopakovaly. 25
Pořadí Název Rozlišení Místnosti 1 bangor.jpg 128x128 chod_sklep.wrl chod_zam.wrl 2 beton_128.jpg 128x128 boiler.wrl chauffeur.wrl laundry.wrl laundry_2.wrl servant_room.wrl sklad.wrl 3 bila.jpg 1x1 entry.wrl 4 darkoak.jpg 128x128 dining.wrl library.wrl 5 drevo_256.jpg 256x256 budoar.wrl 6 dvere2_256.jpg 256x256 child_playroom.wrl 7 dvere_attic_256.jpg 256x256 attic.wrl 8 dvere_main_256.jpg 256x256 main.wrl 9 dvere_nahore_a_256.jpg 256x256 schody_sluzebni.wrl 10 dvere_vytah_256.jpg 256x256 chod_zam.wrl schody_sluzebni.wrl 11 dvirka1_256.png 256x256 boiler.wrl 12 dvirka2_256.png 256x256 boiler.wrl 13 chodba_128.jpg 128x128 entry_room.wrl chod_priz.wrl 14 koberec_256.jpg 256x256 budoar.wrl library.wrl 15 krb_256.jpg 256x256 library.wrl 16 mramor_128.jpg 128x128 budoar.wrl dining.wrl chod_obyv.wrl chod_priz.wrl main.wrl 17 okno2_256.png 256x256 child_playroom.wrl servant_room_patro.wrl 18 okno2_kuchyne_256.jpg 256x256 kitchen.wrl 19 okno_256.png 256x256 conversation_room.wrl guest_room.wrl 20 okno_attic_256.jpg 256x256 attic.wrl 21 okno_boiler_256.png 256x256 boiler.wrl chauffeur.wrl servant_room.wrl 22 okno_cloak2_256.jpg 256x256 cloak.wrl 23 okno_dining_256.jpg 256x256 dining.wrl 24 okno_entry_room_256.png 256x256 entry_room.wrl 25 okno_child_256.png 256x256 child_playroom.wrl 26 okno_knihovna_256.jpg 256x256 library.wrl 27 okno_kuchyne_256.jpg 256x256 kitchen.wrl 28 okno_loundry2_256.jpg 256x256 laundry_2.wrl 29 okno_loundry_256.png 256x256 laundry.wrl 26
30 okno_manwarrobe_256.jpg 256x256 budoar.wrl man_wardrobe.wrl woman_wardrobe.wrl 31 okno_preparation_256.jpg 256x256 kitchen.wrl 32 okno_schody_sluzebni_256.jpg 256x256 schody_sluzebni.wrl 33 okno_summer_256.jpg 256x256 summer_room.wrl 34 Okno_zachod_256.png 256x256 cloak.wrl wc_patro.wrl wc_sklep.wrl 35 podlaha.jpg 76x76 garage.wrl 36 podlaha_256.jpg 256x256 summer_room.wrl 37 pruh_256.jpg 256x256 chod_priz.wrl 38 rhharvest.jpg 256x256 budoar.wrl dining.wrl chod_obyv.wrl chod_priz.wrl library.wrl schody_sluzebni.wrl 39 stena_128.jpg 128x128 cloak.wrl 40 stena_256.jpg 256x256 summer_room.wrl 41 strop2_chodba_256.jpg 256x256 chod_obyv.wrl 42 strop_1.jpg 1x1 entry_room.wrl 43 strop_256.jpg 256x256 dining.wrl 44 strop_chodba_256.jpg 256x256 chod_obyv.wrl 45 tapeta_kytky_256.jpg 256x256 chod_priz.wrl 46 tex_1_03.jpg 1x1 entry_room.wrl 47 tex_3_03.jpg 1x1 48 viko_256.jpg 256x256 schody_sluzebni.wrl 49 vrata.jpg 138x105 garage.wrl 50 zelena_slazba.jpg 128x128 entry.wrl Tabulka 6.3 Vytvořené textury 6.4 Modelování místností a texturování Místnosti jsem modeloval postupně, aby na sebe navazovaly. Musel jsem z plánů odměřovat velikosti místností, aby vše na sebe navazovalo a nestalo se, že by se dvě místnosti překrývaly. Modelování každé místnosti byla mechanická práce, která se z velké části opakovala. Zde bych uvedl jen několik místností, které se svou geometrií výrazně lišily a jejich modelování bylo časově náročnější. Jedná se především o modely chodeb v budově a několik zajímavě navrhnutých místností: 27
Chodba ve sklepě (obrázek 6.2) o Obtížné modelování schodů a stěn, které nejsou stejně vysoké po celé délce chodby o Přidání a rozmístění dveří do modelu chodby o Správné nanesení textury dlaždic Obrázek 6.2 Chodba ve sklepě Hlavní chodba (obrázek 6.3) o Obtížné modelování geometrie místnosti o Přidání a rozmístění dveří do modelu chodby o Náročné texturování schodů Obrázek 6.3 Hlavní chodba 28
Schody pro služebné (obrázek 6.4) o Obtížné modelování geometrie - místnost je rozsáhlá o Nanášení textur o Rozmístění dveří Obrázek 6.4 Schody pro služebné Budoár (obrázek 6.5) o Místnost je zajímavá svou geometrií, téměř celá obložena dřevem o Obtížné nanášení textur 29
Obrázek 6.5 Budoár Hlavní místnost (obrázek 6.6) o Největší místnost ve vile o Obtížné nanášení textur Obrázek 6.6 Hlavní místnost Ostatní místnosti nebyly nijak zajímavé a jejich modelování nebylo náročné. Celkem jsem vymodeloval a nanesl texturu u 32 místností. Seznam všech místností s použitými texturami jsem uvedl v tabulce 6.4. V této tabulce chybí některá označení místností (11, 17, 21, 30). Místnosti s označením jsou mé modely, místnosti bez označení modeloval Petr Mohelský. 30
Označení místnosti Název souboru Seznam textur Velikost (kb) vrml/x3d 0 entry_room.wrl chodba_128.jpg tex_1_03.jpg koupelna-podlaha-128.png okno_entry_room_256.png strop_1.jpg 1 attic.wrl okno_attic_256.jpg dvere_attic_256.jpg 2 boiler.wrl beton_128.jpg dvirka1_256.png dvirka2_256.png okno_boiler_256.png 3 budoar.wrl koberec_256.jpg drevo_256.jpg rhharvest.jpg okno_manwarrobe_256.jpg mramor_128.jpg 4 chauffeur.wrl beton_128.jpg okno_boiler_256.png 5 child_playroom.wrl dvere2_256.jpg okno2_256.png okno_child_256.png 6 chod_obyv.wrl parkety.jpg rhharvest.jpg mramor_128.jpg strop_chodba_256.jpg strop2_chodba_256.jpg 7 chod_sklep.wrl koupelna-podlaha-128.png bangor.jpg 8 chod_zam.wrl koupelna-podlaha-128.png 4 bangor.jpg dvere_vytah_256.jpg 9 chod_priz.wrl rhharvest.jpg chodba_128.jpg mramor_128.jpg pruh_256.jpg tapeta_kytky_256.jpg 10 conversation_room.wrl okno_256.png koupelna-podlaha-128.png 12 dining.wrl rhharvest.jpg parkety.jpg mramor_128.jpg okno_dining_256.jpg strop_256.jpg darkoak.jpg 13 entry.wrl koupelna-podlaha-128.png zelena_slazba.jpg bila.jpg 14 garage.wrl podlaha.jpg vrata.jpg 15 guest_room.wrl okno_256.png parkety.jpg 16 / 13 10 / 9 21 / 17 28 / 22 10 / 8 19 / 15 41 / 32 25 / 21 26 / 21 19 / 15 8 / 6 16 / 13 16 / 13 11 / 9 7 / 6 31
16 kitchen.wrl koupelna-steny-128.png okno_preparation_256.jpg okno2_kuchyne_256.jpg okno_kuchyne_256.jpg 18 laundry.wrl beton_128.jpg okno_loundry_256.png 19 laundry_2.wrl beton_128.jpg okno_loundry2_256.jpg 20 library.wrl darkoak.jpg koberec_256.jpg rhharvest.jpg krb_256.jpg 22 main.wrl mramor_128.jpg parkety.jpg dvere_main_256.jpg 23 man_wardrobe.wrl okno_manwarrobe_256.jpg 21 / 17 14 / 11 12 / 10 17 / 14 19 / 15 7 / 5 parkety.jpg 24 Pantry - 3 / 3 25 schody_sluzebni.wrl rhharvest.jpg parkety.jpg dvere_nahore_a_256.jpg okno_schody_sluzebni_256.jpg dvere_vytah_256.jpg viko_256.jpg 59 / 46 26 servant_room.wrl beton_128.jpg 7 / 6 okno_boiler_256.png 27 servant_room_patro.wrl okno_256.png 9 / 7 28 sklad.wrl beton_128.jpg 8 / 7 29 summer_room.wrl okno_summer_256.jpg podlaha_256.jpg stena_256.jpg 31 cloak.wrl koupelna-podlaha-128.png stena_128.jpg koupelna-steny-128.png okno_cloak2_256.jpg Okno_zachod_256.png 32 wc_patro.wrl Okno_zachod_256.png koupelna-podlaha-128.png koupelna-steny-128.png 33 wc_patro_male.wrl koupelna-steny-128.png koupelna-podlaha-128.png 34 wc_sklep.wrl koupelna-podlaha-128.png Okno_zachod_256.png 35 woman_wardrobe.wrl okno_manwarrobe_256.jpg parkety.jpg Tabulka 6.4 Vytvořené textury 14 / 11 18 / 15 16 / 13 9 / 7 7 / 6 8 / 7 32
6.5 Export, úprava a skládání celku Vymodelované místnosti jsem pomocí exportéru exportoval z programu Maya do formátu VRML. Každou exportovanou místnost jsem otevřel v programu Chisel. Pročistil jsem automatickou volbou a nechal zformátovat text. Pro složení celého modelu jsem vytvořil nový VRML soubor, do kterého jsem pomocí vytvořeného prototypu, popsaného v kapitole 5.7, vložil všech 36 místností (včetně místností od Petra Mohelského). Každou instanci prototypu jsem vložil do uzlu transform a posunul na požadované místo tak, aby na sebe jednotlivé místnosti navazovaly. Dále jsem vytvořil skript pro dynamické načítání, popsaný v kapitole 7, a procházku po budově, popsanou v kapitole 8 Nakonec jsem celý výsledný model převedl pomocí programu X3D Edit [18] do formátu X3D. Soubory, které jsem exportoval z programu Maya a následně pročistil programem Chisel, měly v průměru poloviční velikost než soubory jen exportované z programu Maya. 33
6.6 Časová náročnost modelování Pro přehled časové náročnosti modelování uvádím jak dlouho mi trvalo modelování. Musím však upozornit na to, že hodnoty uvedené v tabulce 6.5 jsou mnou naměřené průměrné hodnoty na tomto modelu a mohou se velice lišit od modelování jiných budov. Samotná časová náročnost velice závisí na zkušenostech modeláře, také na složitosti modelovaných místností a počtu textur v jednotlivých místnostech. Nezanedbatelnou částí je také požadovaná kvalita vytvořených textur a také jak detailní má být výsledný model. Typ práce Časová náročnost (v hodinách) Vytváření textury dlaždice 4 Vytváření textury oken 1 Modelování jednoduché místnosti 16 Texturování jednoduché místnosti 6 Modelování složité místnosti (chodby) 48 Texturování složité místnosti 12 Tabulka 6.5 Časová náročnost jednotlivých etap 34
7. Dynamické načítání Pro optimalizaci jsem implementoval dynamické načítání místností modelu, které má za úkol načíst jen viditelné místnosti a naopak ostatní místnosti, které nemají být viděny z dané pozice, odstranit z paměti. Toto jsem vyřešil skriptem, který využívá uzel Group jako celou scénu. Obsahuje prázdné uzly místností, načítající geometrii místností podle pozice avatara. Návrh datové struktury popisuji v kapitole 7.1 a skript, zajišťující samotné dynamické načítání popisuji v kapitole 7.2. 7.1 Datová struktura pro dynamické načítání Datová struktura dynamického načítání je vidět na obrázku 7.1. Kořen celé scény je uzel Group. Obsahuje prototypy místností, kterých je zde, podle počtu místností, 36. Pokud potřebujeme zajistit centrální otevírání dveří, je zapotřebí změnit tvar struktury místností v hloubce 2, jak popisuje kapitola 5.7. To je z důvodů napojení událostí pro centrální otevření dveří. Kořen Hloubka 0 Instance prototypu room Instance prototypu room... Instance prototypu room 1 Geometrie místnosti Geometrie místnosti...... Geometrie místnosti 1 2 n 2 Obrázek 7.1 Struktura dynamického načítání 35
Hlavička prototypu místnosti vypadá následovně: PROTOTYPE room[ field MFString url [] # cesta k dynamicky načítanému souboru field SFBool load FALSE # příznak, který udává jestli je místnost # načtená field MFString str [] # řetězec, který slouží k napojení událostí ke # dveřím eventin eventin ] SFBool set_load # událost, která načte nebo odebere # geometrii místnosti SFBool set_open # událost nastavení centrálního # otevření dveří Skript, který se stará o samotné načítání jednotlivých částí se skládá ze tří funkcí, které jsou popsány níže. 1. funkce: function set_load (v) { if (v==load) return; load = v; if (load) Browser.createVrmlFromURL(room_url, myself, 'nodesloaded'); else { group.children = new MFNode(); } } Pokud nastane událost set_load, podle hodnoty v dojde k načtení nebo smazání místnosti. Optimalizací je první řádek, který při nezměněné hodnotě dále zabrání pokračování ve zpracování načítání nebo odebírání geometrie. 36
2. funkce: function nodesloaded (v, time) { group.children = v; for(var i = 0; i<str.length; i++) { Browser.addRoute(myself, 'start', v[2], str[i]); } } if(open) start = time; Tato funkce je volána při načítání geometrie místnosti a načte ji do doposud prázdného uzlu Group. Cyklus for vytváří dynamické propojení událostí otevření dveří k načtené místnosti. Zde je vidíme vytváření propojení událostí k načítané místnosti, která musí mít ve své struktuře instanci prototypu na třetím místě. To je dáno číslem 2 v poli v[2]. Poslední řádek udává, zda se mají dveře otevřít. Tento příkaz je nutný, jelikož procházka vede přes místnosti, které nejsou načteny v paměti. Při procházce je potřeba dveře načítané místnosti otevřít, aby avatar neprocházel skrz zavřené dveře. 3. funkce: function set_open(h, time) { open = h; if(open)start = time; } Poslední funkce má za úkol jen změnit příznak, zda se mají při načtení geometrie otevřít dveře. Pokud je již místnost načtena v paměti, rovnou zahájit animaci otevření dveří. Příklad použití prototypu: DEF CHODBA Transform { # definice názvu pro napojení na script translation 4 0 -.75 # posun místnosti na pozici children [ room { # cesta ke geometrii místnosti url ["../chod_zam/chod_zam.wrl"] str ["dvere_entry"] # jaké dveře se budou # centrálně otevírat } ]} 37
7.2 Script dynamického načítání Úkol skriptu dynamického načítání je přepočítat souřadnice polohy avatara na ID místnosti, ve které aktuálně stojí. Tento přepočet se provádí podle statické tabulky 7.1, jejíž vytvoření jsem popsal v kapitole 7.3. Skript dostane od proximity senzoru pozici hodnota ve 3D prostoru. Tato pozice je porovnávána s jednotlivými řádky v tabulce 7.1. Kontroluje se, zda je splněna podmínka pro daný řádek: if( { } min[a].x < hodnota.x && hodnota.x <= max[a].x && min[a].y < hodnota.y && hodnota.y <= max[a].y && min[a].z < hodnota.z && hodnota.z <= max[a].z) my_id = ID[a]; break; Nejprve je zkontrolována x-ová hodnota od proximity senzoru, zda je mezi hodnotou Mix X a Max X prvního řádku tabulky 7.1. Tento test se provede i pro zbývají dvě osy. Pokud je podmínka splněna ve všech případech, našli jsme místnost, ve které stojí avatar. Vrátíme hodnotu ID z aktuálního řádku a testování ukončíme, jelikož dále už nemůže být řádek, který by splňoval všechny tři podmínky (viz kapitola 7.3). Pokud není podmínka splněna, pokračujeme na další řádek, dokud nenajdeme takový řádek, pro který je podmínka splněna. Aby se neprocházela celá tabulka vždy, když nastane událost od proximity senzoru, je vložena optimalizace. Tato optimalizace porovná naposledy nalezený záznam v tabulce 7.1 s hodnotou od proximity senzoru. V případě kladného vyhodnocení se tabulka neprohledává, jelikož avatar neopustil prostor definovaný naposledy nalezeným záznamem. Není tak potřeba načítat nebo odebírat místnosti. V případě záporného vyhodnocení se prohledá tabulka a nalezený záznam se uloží místo aktuálního. Zde je uvedena jen část tabulky 7.1. Celá tabulka je obsažena v příloze D. 38
Min X Max X Min Y Max Y Min Z Max Z ID 2,15 4-0,5 2,65-5.15 0 13 0 2,15-0,5 2,65 0-0,45 10-1,1 2,15-0,5 2,65-2,15-0,45 10 0,2 2,15-0,5 2,65-2,15-2,65 10-1,1 4-0,5 2,65-8,05-5,15 0-1,1-0,2-0,5 2,65-9,45-8,05 0 0,3 2,1-0,5 2,65-8,55-80,05 0 Tabulka 7.1 Začátek tabulky aktuální místnosti pro Model Müllerovy vily Po zjištění čísla místnosti, ve které se nachází avatar, načteme místnosti, které jsou zapotřebí, podle statické tabulky 7.2. Všem místnostem se zašle událost set_load. Pro nepotřebné místnosti false, pro potřebné a nenačtené místnosti true. O samotné načtení nebo smazání geometrie místnosti se postará skript v daném prototypu místnosti, který popisuji v kapitole 7.1. ID = číslo řádku ID potřebných místností Název místnosti 0 0, 9, 31, 13, 25, 10, 30 Entry room 1 1, 25, 29 Attic room 2 2, 7, 8 Boiler 3 3, 6, 22, 12, 20, 25 Budoar 4 4, 7, 14 Chauffeur 5 5, 11, 35, 25, 33, 15, 17,21, 6 Child play room 6 6, 33, 25, 5, 11, 21, 17, 15, 20, 3, Chodba hlavni 22, 12, 9 7 7, 8, 2, 19, 18, 34, 14, 4, 26, 28 Chodba sklep 8 8, 7, 2, 13, 10, 25 Chodba sklep 9 9, 22, 6, 0, 13, 10, 25 Chodba 10 10, 30, 8, 25, 13, Coverssation room 11 11, 35, 21, 5 Child room 12 12, 22, 6, 16, 20, 3 Dining room 13 13, 30, 10, 8, 25, 0, 9 Entry 14 14, 4, 7 Garage 15 15, 27, 32, 33, 6, 11, 5, 25 Guest room 16 16, 25, 12, 6, 22 Kitchen 17 17, 23, 21, 11, 5 Koupelna 39
18 18, 7 Loundry 19 19, 7 Loundry 20 20, 3, 6, 12, 22 Library 21 21, 23, 35, 6, 25, 33, 15, 5, 17, 11 Loznice 22 22, 12, 16, 6, 25, 30, 3, 9 Main hall 23 23, 21, 35, 6, 17 Man wardrobe 24 24, 25 Pantry 25 25, 8, 13, 10, 16, 6, 1, 22, 12, 32, Schody sluzebni 27, 21, 17, 11, 29, 3 26 26, 7 Servant room 27 27, 25, 32, 15 Servant room patro 28 28, 7, 4, 26 Sklad 29 29, 25, 1 Summer room 30 30, 13, 10, 25, 0, 9 Zahrada 31 31, 0, 9 Cloak room and WC 32 32, 25, 27, 15, 6 WC patro 33 33, 15, 6, 11, 21, 17 WC patro male 34 34, 7 WC sklep 35 35, 21, 23, 17, 6, 11, Woman wardrobe Tabulka 7.2 Tabulky potřebné uzly 7.3 Vytvoření tabulky 7.1 Tabulka 7.1 obsahuje kvádry, které reprezentují obálky místností. Díky nim můžeme zjistit, v jaké místnosti se avatar nachází. V nejjednodušším případě, kdy má místnost tvar kvádru, postačí pro ni jeden řádek v tabulce 7.1. Zobrazeno na obrázku 7.2 (jen ve 2D), který odpovídá prvnímu řádku tabulky 7.1. Zdi místnosti se přesně shodují s kvádrem obálky. 40
-5,15 -z 0 x 2,15 4 Obrázek 7.2 Obalový kvádr pro místnost Pokud bude geometrie místnosti složitější, je zapotřebí místnost vhodně rozdělit. Místnost se bude skládat z více kvádrů, které na sebe navazují. Kdyby pro nějakou část prostoru, kde se může pohybovat avatar, chyběl záznam v tabulce 7.1, tak bychom nebyli schopni zjistit, kde se avatar nachází a nešel by upravit stav místností v paměti. Každá místnost může mít jen jeden kvádr. Aby se kvádry místností nepřekrývaly (jak znázorňuje červené šrafování na obrázku 7.3 vlevo), musíme místnost vhodně rozdělit na více kvádrů. Na obrázku 7.3 vlevo jsou špatně zvolené kvádry místností a dynamické načítání místností nebude pracovat správně. Bude-li v tabulce nejprve uveden kvádr č.1 a pak kvádr č.2. Budeme-li stát v bodě A bude správně vyhodnoceno, že jsme v místnosti jedna. Pokud bychom se dostali do bodu B, bude špatně vyhodnoceno v jaké místnosti stojí avatar (špatné vyhodnocení - místnost jedna; správné vyhodnocení - místnost dvě), protože podle popisu vyhledávání v tabulce 7.1 je první výskyt považován za jedinou možnost. Dále se už v tabulce nevyhledává a řádek, který reprezentuje místnost dvě v bodě B, kde se kvádry překrývají, se nikdy nenajde. 41
A A 1 B 2 1 B 2 Obrázek 7.3 Špatné nastavení hodnot kvádrů (vlevo), správné rozdělení kvádrů (vpravo) Na obrázku 7.3 vpravo je vidět, jak správně rozdělit obalový kvádr místnosti, aby vše správně fungovalo. Nyní má každá místnost dva záznamy v tabulce 7.1. Pokud je geometrie místností ještě složitější bude pro každou místnost v tabulce 7.1 více záznamů. 42