ČVUT - FEL - Semestrální práce - Vizualizace


Hlavní stránka » Osobní » ČVUT - FEL » Semestrální práce a referáty » Vizualizace

České vysoké učení technické v Praze

Fakulta elektrotechnická





Semestrální práce

Vizualizace



1998/1999 (zimní semestr) Marek Uher



Obsah:

  1. Zadání
  2. Zadavatel
  3. Vypracovali
  4. Teoretické řešení
    4.1 Mapování 3D objektů
  5. Praktické řešení
    5.1 Datové struktury
    5.2 Voxelový procesor
    5.3 Uživatelské rozhraní
      5.3.1 Výběr a manipulace s texturou
      5.3.2 Volba úrovně detailu
    5.4 Generování a vizualizace krajiny
    5.5 Generování a vizualizace úrovně detailu
    5.6 Informace k programu
      5.6.1 Úprava knihovny MUI
    5.7 Uživatelská příručka
      5.7.1 Prohlížení scény
      5.7.2 Editace krajiny
      5.7.3 Práce s objekty
      5.7.4 Práce se soubory
  6. Ke stažení
  7. Literatura



1. Zadání

  Vytvořte program, jehož pomocí by bylo možno mapovat prostorové (voxelové) objekty na terén a v reálném čase se nad tímto terénem pohybovat. Prostorové objekty mohou být definovány bud “ručně” (např. města, síť komunikací a podobně) nebo generované počítačem (např. fraktálně).

  Práce předpokládá použití knihovny OpenGL a bude naprogramována pro operační systém UNIX s grafickým uživatelským rozhraním X-Window. Řešte také adaptivní změnu rozlišení mapované textury (LOD).



2. Zadavatel

  prof. Ing. Jiří Žára, CSc. / Ing. Petr Felkel, Ph.D.



3. Vypracovali

  Marek Uher, V. ročník / studijní skupina 26.
  Ondřej Pokorný, V. ročník / studijní skupina 26.
  Jakub Zrzavý, IV. ročník / studijní skupina 22.



4. Teoretické řešení



  4.1 Mapování 3D objektů

  Operace s 3D daty je v dnešní době velmi diskutovaná otázka v oboru počítačové grafiky. Současné požadavky uživatelů různých modelovacích a animačních programů vzrůstají velmi rychle a dostupné efekty používající “pouze” 2D algoritmy mnohdy již nestačí. Proto je dnes již nutností provádět většinu operací ve 3D prostoru (v anglické literatuře se pro tyto operace používá termín volume modeling and rendering), což klade značné požadavky na programátory a efektivnost použitého algoritmu, přesto, že výkon pracovních stanic za posledních několik let zaznamenal exponenciální nárůst. Jako příklad lze uvést různé medicínské aplikace které běžně manipulují s voxelovými daty (viz. obr. č. 1 - obraz mozku v řezu získaný počítačovou tomografií a obr. č. 2 - vizualizace páteřního obratle naskenovaného pomocí 3D skeneru).

Obr. č. 1 Obr. č. 2

  Používání 3D voxelových objektů pro reprezentaci dat řeší některé problémy, které vznikly s přechodem vývojářů z 2D do 3D oblasti. Takto vytvořené objekty umožňují jednodušší a přehlednější programování aplikací, na druhé straně ale velmi zvyšují paměťové nároky a vytvářejí extrémní toky dat v počítačovém systému (myšleno tím tok dat mezi pevným diskem, pamětí, procesorem a grafickým podsystémem). Pro ilustraci zjednodušení práce, které přináší práce s voxelovými objekty, jsou zde uvedeny obrázky z jednoduché modelovací aplikace. Tato aplikace používá k modelování voxelové objekty s adaptivním dělením voxelové mřížky a pro výslednou vizualizaci používá metodu raytracing - viz obr. č. 3 až obr. č. 6.

Obr. č. 3 Obr. č. 4

  Na obrázcích č. 3 a č. 5 jsou zobrazeny základní stavební bloky. Na obrázcích č. 4 a č. 6 jsou zobrazeny výsledné scény získané pouhým opakováním základního bloku. Takováto aplikace umožňuje opravdu jednoduché modelování scény, na druhou stranu ale je velmi paměťově náročná. Proto je nutné před započetím práce na projektu či aplikaci používajícího 3D voxelové objekty jako základní stavební prvky vše dopředu promyslet. Nutná je i volba hardwaru a softwaru (operační systém, vývojové nástroje, knihovny, programovací jazyk, překladač,…), protože ne všechny počítačové systémy dovolují práci s velkými objemy dat.

Obr. č. 5 Obr. č. 6

  Úkolem tohoto projektu bylo mapování reálných objektů (domy, stromy, infrastruktura,…), které jsou uloženy jako 3D voxelové objekty v reálném čase. Již z tohoto zadání vyplývá, že se zde pracuje s několika objekty reprezentovanými velkým objemem dat. Protože, co jeden objekt (pod pojmem objekt budeme nadále rozumět například budovu v městské aglomeraci), to jiná množina dat. Operace s takto reprezentovanou scénou, která se skládá z desítek rozdílných objektů, klade obrovské nároky na paměť a vstupně / výstupní podsystém. Proto bylo nutné si velmi dobře promyslet nejen formát ukládání dat na disku, ale bylo nutné vyřešit i problém reprezentace dat v operační paměti počítače a výběr algoritmů pro jejich pozdější vizualizaci.



5. Praktické řešení



  5.1 Datové struktury

  Jedním z prvních problémů bylo zvolení vhodných programátorských nástrojů a volba operačního systému. Bylo nutno určit stabilní a výkonné prostředí pro budoucí realizaci projektu. V úvodní fázi byl vybrán jako nejvhodnější pro realizaci projektu operační systém UNIX a jeho grafická nadstavba X-Window. Operační systém UNIX byl vybrán proto, že poskytuje výbornou správu paměti a vykazuje značnou stabilitu i při velkém přetížení systému. Pro samotnou implementaci byla zvolena osvědčená grafická knihovna OpenGL a programovací jazyk C.

  V dalším kroku bylo nutno specifikovat formát dat určených pro ukládání na disku. Byl vytvořen nový jednoduchý formát vycházející z formátu pro ukládání barevných předloh v systému X-Window XPM. Tento formát byl rozšířen o práci s tzv. návěštími (tags) a dostal označení 3DT (3D texture format). Návěští vždy specifikuje začátek nové sekce a mění tok řízení práce se souborem. Mezi implementované a podporované návěští ve verzi 2.0 patří:

 

Návěští Popis Parametr / typ
#vtf identifikace souboru bez parametru
#ver verze souboru version.release (např.: 2.0), typ: [int].[int]
#res rozměr objektu v osách x, y, z res_x res_y res_y (např: 25 30 18), typ: [int]
#lod úroveňr detailu n_lod (např: 2), typ: [int]
#cds příznak komprese voxelů v souboru 0 - bez komprese, 1 - s kompresí, typ: [int]
#vds přiznak začátku voxelového proudu bez parametrů
c položka v paletě barev c red green blue, např. c 100 20 36, typ: [int] [int] [int]

Tabulka č.1 - návěští v souboru 3DT

 

  Soubor dále obsahuje proud voxelových dat a může obsahovat komentáře se syntaxí komentářů v jazyce C. Příklad souboru je uveden na následujícím výpisu (formát 2.0):

#vtf
/* Version and release */
#ver 2.0
/* Level of detail */
#lod 0
/* Non-compresed voxel data stream */
#cds 0
/* Color palette */
c 84 74 84
c 144 152 235
/* Object resolution: */
#res 25 25 50
/* Voxel data */
#vds
/* Raw stream */
1 1 1 1 0 1 2 1 0 0 2 2 0 1 0 …

  Voxelová data jsou do souboru zapsána jako matice X x Y x Z v následujícím pořadí: zxy (to znamená, že jsou ukládány řezy v rovině xy s rostoucí souřadnicí z). Za koncem voxelového proudu nesmí následovat již žádné návěští ani komentář, ale pouze konec souboru.



  5.2 Voxelový procesor

  Před započetím práce na samotné implementaci proběhl nejprve výběr vhodných datových struktur pro ukládání velkého množství dat v operační paměti počítače. Protože se zpracovává velký objem informací najednou, bylo potřeba navrhnout jednoduchý a paměťově nenáročný model s ohledem na práci v reálném čase. Z toho vyplývá, že navržené datové struktury by měli poskytovat rychlý přístup k datům (nejlépe s přímým přístupem) a současně by měli alokovat co nejméně paměti. Z tohoto důvodu se nad zpracovávanými daty nevytváří žádné pomocné datové struktury (jako je například často používaný oct-tree), ale data se ukládají jako třírozměrná matice X x Y x Z. Vedle samotných voxelových dat se ještě ukládají další informace o zpracovávaném objektu (rozměry objektu, paleta barev, verze předlohy, jméno souboru se vstupními daty, …). Manipulace s touto výslednou datovou strukturou je rychlá a snadná a současně není zbytečně alokována žádná další paměť.

  Při implementaci bylo použito několik nových myšlenek, které nebyly při výběru řešení v počátečním návrhu uvedeny. Je to z toho důvodu, že během implementace se ukázala řada dílčích problémů s paměťovými nároky a závěrečnou vizualizací scény. Nejvaznější problém vznikl při řešení otázky samotné vizualizace objektů. Původní myšlenka předpokládala reprezentaci voxelu pomocí jednotkové krychle v OpenGL. Toto řešení však v zcela neumožňovalo práci se scénou v reálném čase, neboť na vstupu vizualizační části přicházeli řádově statisíce až miliony ploch. Scénu šlo zobrazit (v průměru asi za 3 - 5 minut), v žádném případě však nebyla možná žádná další interakce s uživatelem (průlet scénou, vložení či zrušení objektu,…). Z tohoto důvodu bylo potřeba vizualizovaná data předzpracovat.

  Vhodným řešením byla aplikace algoritmu pro převod voxelových dat na B-rep. Tento algoritmus navíc musel respektovat následující podmínky:

  • zachování vnitřní struktury objektu
  • předzpracování by mělo probíhat v reálném čase (maximálně několik sekund)
  • předzpracování by mělo probíhat proudově (“pipelined”)

  Při dodržení těchto podmínek se proto klasické algoritmy pro převod voxelových dat (marching cube,…) na hraniční reprezentaci ukázaly jako nevhodné. Z tohoto důvodu byl nakonec navržen nový algoritmus. Tento algoritmus nejprve provede pomocné řezy voxelovým objektem v jednotlivých osách x, y, z. V takto získaných řezech jsou posléze vyhledávány homogenní obdélníkové oblasti o stejné barvě. Skupina voxelů je tímto způsobem nahrazena plochou v daném řezu. Plocha se generuje pouze v tom případě, že v daném směru prohledávání se přechází z okolí do objektu a nebo naopak. Algoritmus pro vyhledávání homogenní obdélníkové oblasti pracuje následujícím způsobem:

 

/*                                   					     */
/* Najdi v pomocném řezu obdelníkovou oblast a tu zapiš na vstup 	     */
/* vizualizačního řetězce   						     */
/*                                   					     */

Quad FindQuad(int x, int y, Slice slice){

	/* Vstupem algoritmu je aktuální pomocný řez voxelovým objektem      */
	/* a počáteční pozice, od které se začne generovat nová rostoucí     */
	/* oblast v daném řezu 		 				     */

	int quadHeight = 0;		/* délka nalezené oblasti	     */

	int quadWidth = 0;		/* váška nalezeného oblasti	     */

	int x1, y1, x2, y2;		/* souřadnice levého horního         */
					/* a pravého spodního rohu oblasti   */

	int color;			/* barva nalezeného oblasti          */

	register int i, j;		/* čítače cyklů                      */

	int flagDirection = X_AND_Y;	/* příznak změny směru vyhledávání   */

	int direction = RIGHT;		/* počáteční směr vyhledávání        */

	int growable;			/* příznak pro testování, zda lze    */
					/* ještě prohledávanou oblas zvětšit*/

	/* začni generovat rostoucí oblast */
	quadWidth = quadHeight = 1;

	/* souřadnice první rohu pravoúhlé rovnoběžné oblasti		     */
	/* zůstávají konstantní po celou dobu výpočtu			     */
	x1 = x;
	y1 = y;

	/* barva oblasti, zjistí se podle levého horního rohu 	             */
	color = slice[x1][y1];

	/* do pomocného dvourozměrného pole se poznamenají prošlé voxely     */
	dirtyMap[x1][y1] = DIRTY;

	/* dokud lze prohledávat libovolným směrem                           */
	while (flagDirection > ANY) {

		/* zvětši rozměry nalezené oblasti                           */
		x2 = x1 + quadWidth;
		y2 = y1 + quadHeight;

		/* předpokládej, že lze oblast dále zvětšovat                */
		growable = YES;

		/* otestuj předcházející předpoklad napravo od aktuální	     */
		/* pozice 						     */
		if (direction == RIGHT) {

			/* otestuj, zda nejsme mimo rozsah řezu 	     */
			if ((x1 + quadWidth) >= MAX_X) {		

				/* pokud ano, nelze vpravo oblast již 	     */
				/* zvětšit 				     */
				growable = NO;
			}

			/* jinak se pokus v daném směru zvětšit oblast 	     */
			else {
				for(j = y1; j < (y1 + quadHeight); j++) {

				/* otestuj, zda prohledávané voxely jsou stejné */
				/* barvy a zda již nebyly použity pro jinou     */
				/* oblast		 			*/
				if(slice[x1 + quadWidth][j] != color || 
					dirtyMap[x1 + quadWidth][j] == DIRTY) {

					/* pokud nelze oblast zvětšit, zastav   */
					/* prohledávání v tomto směru		*/
						growable = NO;
					}
				}
			}
		}

		/* jinak otestuj předcházející předpoklad směrem dolů od     */
		/* aktuální pozice 					     */
		else {

			/* otestuj, zda nejsme mimo rozsah řezu		     */
			if ((y1 + quadHeight) >= MAX_Y) {

			/* pokud ano, nelze vpravo oblast již        */
			/* zvětšit   	           	   	     */
				growable = NO;
			}

			/* jinak se pokus v daném směru zvětšit oblast 	     */
			else {
				for(i = x1; i < (x1 + quadWidth); i++) {

				/* otestuj, zda prohledávané voxely jsou stejné	*/
				/* barvy a zda již nebyly použity pro jinou	*/
				/* oblast 					*/
					if (slice[i][y1 + quadHeight] != color || 
					    dirtyMap[i][y1 + quadHeight] == DIRTY) {

					/* pokud nelze oblast zvětšit, zastav	*/
					/* prohledávání v tomto směru 		*/
						growable = NO;
					}
				}
			}
		}

		/* otestuj, zda lze ještě nějakým směrem zvětšovat oblast    */
		if (growable == ANY) {

			/* pokud ano a směr byl vpravo			     */
			if (direction == RIGHT) {

				/* zvětši délku obdelníku 		     */
				quadWidth++;

				/* a označ ji jako použitou 		     */
				for(j = y1; j < (y1 + quadHeight); j++) {
					MarkDirty(x1 + quadWidth - 1, j, dirtyMap);
				}
			}

			/* pokud ano a směr byl dolů 			     */
			else {

				/* zvětši výšku obdelníku 		     */
				quadHeight++;

				/* a označ oblast jako použitou 	     */
				for(i = x1; i < x1 + quadWidth; i++) {
					MarkDirty(i, y1 + quadHeight - 1, dirtyMap);
				}
			}
		}

		/* vyber nový směr prohledávání tak, aby byl rozdílný od     */
		/* předchozího 						     */
		if (flagDirection == X_AND_Y) {
			direction = (direction == RIGHT) ? DOWN : RIGHT;
		}

		/* sniž možný počet směrů pro vyhledávání		     */
		if (growable != ANY) {
			flagDirection--;
		}
	}

	/* zapiš výsledné souřadnice obdelníku 				     */
	quad.x1    = x1;
	quad.y1    = y1;
	quad.x2    = x1 + quadWidth;
	quad.y2    = y1 + quadHeight;
	quad.color = color;

	/* pošli obdelník do vizualizačního řetězce 		             */
	return(quad);
}

Algoritmus č. 1

 

  Celý postup vyhledávání pravoúhlé rovnoběžné oblasti lze pomocí předcházejícího algoritmu realizovat následujícím způsobem:

 

/* dokud existuje nějaký neoznačený a nezařazený voxel */
while ( IsClean ( dirtyMap ) ){

	/* najdi souřadnice posledního neoznačeného voxel v daném pomocném   */
	/* řezu 							     */
	[x,y] = LastClean ( dirtyMap ) ;

	/* najdi v okolí daného místa pravoúhlou rovnoběžnou oblast a tu     */
	/* zapiš na vstup zaobrazovacího řetězce                             */
	VisualizeQuad ( FindQuad ( x, y, CurrentSlice ) );
}

Algoritmus č. 2

 

  Lepší představu o činnosti algoritmu můžeme získat z následujících obrázků.  

Obr. č. 7

  Na obr. č. 7 je zobrazena voxelová reprezentace jednoduchých těles a vybrané pomocné řezy těmito tělesy. Na následujících obrázcích č. 8 - č. 13 je zobrazena činnost vyhledávacího algoritmu na podobných pomocných řezech.

a) b)
Obr. č. 8
a) b)
Obr. č. 9
a) b)
Obr. č. 10
a) b)
Obr. č. 11
a) b)
Obr. č. 12
a) b)
Obr. č. 13

  Na obrázku je vždy zobrazen výchozí stav před aplikací algoritmu pro vyhledávání obdélníkových oblastí - varianta a) a výsledná množina nalezených obdélníkových oblastí po aplikaci algoritmu - varianta b). Při vyhledávání oblastí je každá nově nalezená oblast okamžitě zaslána do zobrazovacího řetězce. Z tohoto důvodu není nutné udržovat v paměti žádnou pomocnou datovou strukturu (např. seznam oblastí), čímž se šetří paměť a navíc se zcela využívá proudového zpracování knihovny OpenGL.



  5.3 Uživatelské rozhraní

  Další samostatnou komponentou aplikace je grafické uživatelské rozhraní. Toto rozhraní bylo naprogramováno pomocí knihovny MUI (Micro User Interface), která používá pro tvorbu přípravků knihovnu GLUT (OpenGL Utility Toolkit) a OpenGL.

  Rozhraní je rozděleno do dvou částí:

  1. Výběr a manipulace s texturou
  2. Volba úrovně detailu (LOD)



  5.3.1 Výběr a manipulace s texturou

  Toto dialogové okno (viz obr. č. 14) slouží k zobrazení, výběru a manipulaci voxelových objektů. Jeho součástí je:

  • Výběr katalogu
  • Hlavní pohled na vybraný objekt
  • Výběr objektu pomocí tří pohledů a posuvné lišty
  • Manipulace s objektem

 

Obr. č. 14

    Všechny objekty, které se nachází v jednom adresáři, tvoří katalog. Tím je umožněno vkládání navzájem tématicky podobných objektů do jednoho katalogu. Vzniká tak možnost vytvořit např. katalog stromů, nábytku, domů atd. Výběr příslušného katalogu zajišťuje textové pole Directory a tlačítko Rescan, které se nacházejí v horní části okna (viz obr. č. 15).

 

Obr. č. 15

    V hlavním pohledu je zobrazen vybraný objekt (viz. popis výběru objektu níže) spolu s osami souřadné soustavy a spolu s osami lokální souřadné soustavy objektu (viz obr. 16 vlevo). Zobrazení souřadných soustav slouží především k lepší orientaci při manipulaci s vlastním objektem (viz viz. popis manipulace s objektem), který může být natáčen nebo zmenšován (zvětšován).

 

Obr. č. 16

    Všechny objekty, které se nacházejí v příslušném katalogu, jsou zobrazeny pomocí tří pohledů umístěných v pravé části okna (viz obr. č. 16). Je pochopitelné, že katalog může obsahovat více než tři objekty. V těchto případech jsou ostatní objekty dosažitelné pomocí posuvné lišty.

  Každý pohled umožňuje vybrat zobrazený objekt do hlavního pohledu. Toto vybrání provede uživatel kliknutím do příslušného pohledu. Po vybrání se v pohledu zobrazí červený čtverec a kolem objektu se zobrazí obklopující červený kvádr, na kterém jsou zobrazeny osy lokální souřadné soustavy (žlutá = X, zelená = Y, modrá = Z).

  Aby byl objekt uživateli zobrazen co možná nejlépe, začne se vybraný objekt v pohledu otáčet.

  Ve spodní části okna se nachází několik přípravků, které umožňují pozměnit otočení, velikost, opakování a stupeň detailu právě vybraného objektu (viz obr. č. 17). nebo zmenšován (zvětšován).

 

Obr. č. 17

    Pokud si přejete otočit vybraným objektem, musíte stisknout tlačítko Rotate a přemístit kurzor do hlavního pohledu. Jakmile bude kurzor v tomto pohledu, změní se jeho tvar na dvě rotující šipky a bude reagovat na tažení, které bude otáčet objektem. Osa rotace bude závislá na právě stisknutém tlačítku myši. Levé tlačítko otáčí okolo osy X, prostřední tlačítko okolo osy Y a pravé tlačítko otáčí okolo osy Z.

  Pokud si přejete změnit velikost vybraného objektu, musíte stisknout tlačítko Scale a přemístit kurzor do hlavního pohledu. Jakmile bude kurzor v tomto pohledu, změní se jeho tvar na zmenšující se šipku a bude reagovat na tažení, které bude měnit velikost objektu. Směr zmenšuvání (zvětšování) bude závislá na právě stisknutém tlačítku myši. Levé tlačítko znamená směr rovnoběžný s osou X, prostřední tlačítko s osou Y a pravé tlačítko s osou Z.

  U některých objektů může nastat, že se ve scéně budou několikrát opakovat. Pro tyto případy slouží sada přípravků Repeat (viz obr. č. 17 vpravo), která se skládá ze tří textových polí a k nim příslušejícím tlačítkům. Každé tlačítko (X, Y a Z) vyjadřuje osu opakování, číselná hodnota pak počet opakování v daném směru. Speciálním případem je hodnota −1, která představuje opakování až k okraji krajiny (popřípadě až do nekonečna).



  5.3.2 Volba úrovně detailu

  Druhým dialogovým oknem je Volba detailu, které slouží k určení metody přepínání mezi dvěmi reprezentacemi jednoho předmětu v určité vzdálenosti, ve které se nachází pozorovatel od daného objektu.

 

Obr. č. 18



  5.4 Generování a vizualizace krajiny

  Další částí aplikace je editor scény. Jeho rozhraní je též naprogramováno v knihovně přípravků MUI. Tento editor dovoluje editovat fraktálně generovanou krajinu a dále dovoluje uživateli manipulaci s objekty ve scéně. Mezi jeho základní funkce patří: vložení objektu, zrušení objektu, výběr objektu, … Je úzce provázán na předchozí komponentu - katalog objektů. V součinnosti s ním dovoluje měnit geometrii objektu.

  Jako základ krajiny je zvolena kartézská mřížka a výška v každém bodě se vypočítává metodou náhodného přesouvání středního bodu. Jako parametr slouží jedna hodnota, která určuje maximální velikost odchylky.

  Vzhledem k tomu, že metoda přesouvání středního bodu generuje nerovinné čtverce, je při zobrazování potřeba tyto čtverce převést na trojúhelníky a dopočítat k nim normály. Pro převod na trojúhelníky je použit velmi triviální algoritmus - každý čtverec je složen ze dvou trojúhelníků. Pokud by bylo použito konstantní stínování, stačilo by vždy spočítat normálu pro každý trojúhelník z jeho vrcholů. Nevýhoda je, že ve výsledku jsou potom vidět hrany mezi jednotlivými trojúhelníky. Proto je použito Gouraudovo stínování, které však potřebuje, aby normály v odpovídajících vrcholech sousedních trojúhelníků byly stejné. Tyto normály jsou tedy spočteny jako průměr normál všech trojúhelníků sousedících s daným vrcholem.



  5.5 Generování a vizualizace úrovně detailu

  Při zobrazování je udržována pozice pozorovatele ve světových souřadnicích. Při zobrazovaní objektů je potom spočítána vzdálenost pozorovatele od tohoto objektu a zobrazen příslušná úrovně detailu LOD (level of detail). Vzhledem k tomu, že objekty mají referenční bod umístěn na rohu, může se při velkých rozměrech objektu stát, že spočítaný LOD není vhodný (pozice pozorovatele je blízko nějaké stěny, která je daleko od referenčního bodu). Příklad generování a vizualizace úrovně detailu je ukázán na obr. č. 19.

  Při zobrazování opakujících se objektů je počítán LOD pro každý objekt zvlášť.

 

Obr. č. 19



  5.6 Informace k programu

  Výsledný software není jeden monolitický program. Jedná se o sadu několika nezávislých, ale spolupracujících komponent. Základem je knihovna poskytující funkce pro práci s 3D voxelovými objekty. Mezi základní funkce patří načtení a uložení voxelového objektu z disku do operační paměti počítače, dále převod voxelového tělesa na B-rep (tzn. předzpracování pro vizualizaci). Druhou komponentu tvoří knihovna pro práci se soubory. Umožňuje vytvořit katalog objektů a nad vybraným objektem dovoluje provádět základní geometrické transformace a aplikaci atributů. Poslední komponentu tvoří editor scény. Ten dovoluje uživateli modifikovat vzhled výsledné scény (editor krajiny) a umožňuje interaktivní práci s objekty.

  Celá aplikace je doplněna generátorem základních voxelových objektů (panelový dům, rodinný domek, strom, keř,…). Tento generátor slouží pouze pro demonstraci činnosti celé aplikace. Aplikace primárně slouží k simulaci reálného prostředí. To znamená, že na vstupu mohou být reálná data (např. výšková mapa krajiny získaná leteckým snímáním nebo neskenované prostorové objekty).

  Celková implementace obsahuje zhruba 5 500 řádku kódu v jazyce C bez komentářů.

  Během implementace se nevyskytli žádné větší problémy, pouze na samém začátku vývoje programu nebylo možno linkovat program do spustitelné podoby. To bylo způsobeno chybou překladače, který s některými knihovnami nepracoval zcela korektně. Po instalaci nové verze se již žádné problémy nevyskytly. Vedle těchto problémů se vyskytly problémy s paměťovou náročností.

  Testování programu bylo prováděno na několika platformách. Základní platformou pro vývoj a testování aplikace byl operační systém Linux. Druhou platformou, na kterou byla aplikace portována, byl operační systém Irix (pracovní stanice Silicon Graphics).

  Základní testování proběhlo odděleně pro převod voxelových objektů na plochy a výsledné zobrazování. Testy byly prováděny na několika vzorcích různé velikosti a byl sledován okamžik, kdy se program pro nedostatek paměti zhroutil, a nebo data byla tak objemná, že doba výpočtu neúměrně rostla. Pro výpočet se jako kritické ukázaly rozměry objektu zhruba 500 x 500 x 500 (neúměrná doba výpočtu) a 10 000 x 10 000 x 10 000 (nedostatek paměti v závislosti na konfiguraci počítače). Pro zobrazování bylo kritického maxima dosaženo mnohem dříve. Již při rozměrech krajiny o velikosti 256 x 256 a počtu objektů kolem 60 o rozměrech cca. 50 x 50 x 50 se projevily závažné problémy při interaktivní práci i na velmi výkonných systémech s hardwarovou podporou grafiky. Pro výpočet byl dostačující počítač s procesorem AMD K6 na 233MHz a 64MB paměti RAM. Pro zobrazování je potřeba nejméně počítač Silicon Graphics s akcelerací grafiky, jinak je práce s programem velmi zdlouhavá a pro vyšší rozměry krajiny nebo vyššího počtu objektů až nemožná.

  Také byla testována odolnost programu proti syntaktickým chybám. Program testuje vstupní soubory a pokud narazí na nesrovnalosti, pokusí se podat informaci o chybě a o místě, kde pravděpodobně chyba vznikla a ukončí svůj chod. V případě, že vznikla chyba, kterou nedokáže rozpoznat, ukončí svůj běh a informuje uživatele o neznámé chybě.

  Kompilace programu se provádí standardním příkazem imake a make v adresáři bin, který obsahuje řídící soubor pro překlad Imakefile. Ten je potřeba doladit podle stávající platformy na které se provádí překlad. Potřebné informace pro překlad lze získat z provozní dokumentace, nebo od správce systému. Samotný překlad se spouští příkazem:

      imake && make

  Po tomto příkazu se provede kompilace a sestavení binárních verzí programů pro danou platformu.

  Instalace programu se provádí ručně do vybraného adresáře (nejčastěji do adresářů /usr/local nebo /opt). Pro provedení této operace je nutno mít práva správce systému, protože do výše zmíněných adresářů není obyčejným uživatelům povolen zápis.

  Program je odladěn a otestován pro několik platforem. Jako nejlepší pro práci s programem je platforma s operačním systémem UNIX nebo MacOS. Jednoznačně lze doporučit provozování programu na platformě Silicon Graphics, která splňuje softwarové i hardwarové nároky kladené programem na výkonnost systému.

  Program lze v budoucnu obohatit o grafický editor 3D objektů a mapy města. Současná verze pracuje s textovým formátem a ten nemusí být pro všechny uživatele dostačující.

  Tento program již není dále vyvíjen ani udržován a podpora na něj se neposkytuje.



5.6.1 Úprava knihovny MUI

  Knihovna z GLUT 3.6 je naprogramována tak, aby byla kompatibilní s verzí 3.5, která však podporovala pouze jedno okno a jeden uilist. Verze 3.6 je připravená pro obsluhu více oken s více uilisty, proto lze velmi jednoduchou úpravou změnit knihovnu tak, aby takto pracovala.

Soubor Změnit z Změnit na
mui.h void muiInit (void); void muiInit (int);
glutmui.c void muiInit (void) void muiInit (int list)
glutmui.c win->uilist = 1; win->uilist = list;



  5.7 Uživatelská příručka

  Po spuštění aplikace se na monitoru zobrazí dvě okna - hlavní okno se scénou (viz obr. č. 20) a menu a druhé okno pro výběr a úpravu 3D objektů (viz obr. č. 14).

 

Obr. č. 20

 

  5.7.1 Prohlížení scény

  Prohlížení scény má tři různé módy:

  • Polar - pohled pozorovatele směřuje ke středu scény. Pomocí myši je možno scénu natáčet (levé tlačítko stisknuté) a přibližovat/vzdalovat jí (při stisknutém prostředním tlačítku a pohyb myší dopředu/dozadu).
  • Fly - pozorovatel letí na scénou. Pohyb myší při stisknutém levém tlačítku mění směr letu a při stisknutém prostředním tlačítku se pohubuje dopředu/dozadu.
  • Walk - podobně jako Fly s tím rozdílem, že se nelze volně pohybovat, ale výška pozorovatele je určená výškou krajiny.



  5.7.2 Editace krajiny

  Výška krajiny se mění tak, že levým tlačítkem myši vybereme bod, který se bude měnit a potom tažením myši dopředu/dozadu měníme výšku daného bodu.

  Pokud chceme měnit větší oblast, je možné pomocí prostředního tlačítka označit pravoúhlou oblast, která se bude měnit (stisk tlačítka a tažení). Změna výšky dané oblasti se provede podobně jako u jednotlivého bodu pomocí posunu myši při stisknutém levém tlačítku. Pokud by při vybírání oblasti byla velikost v jednom směru příliš malá, označení se zruší. Tak se zruší i už jednou vybraná oblast. Pokud je oblast vybrána, všechny změny výšky se týkají pouze této oblasti.



  5.7.3 Práce s objekty

  Základní operací je vložení objektu. To se udělá tak, že ho vybereme z nabídky objektů a stiskneme tlačítko Insert object. Nyní musíme určit pozici, na kterou se objekt vloží. V okně s krajinou se zobrazí na pozici kurzoru myši kvádr, který reprezentuje pozici objektu. Kvádr se pohybuje spolu s myší a umísťuje se vždy na výšku krajiny. Nyní stačí stisknout levé tlačítko myši a objekt je vložený. Pokud bychom chtěli změnit výšku, do které se objekt vloží, místo kliknutí levého tlačítka myši bychom ho museli stisknout při stisknutém tlačítku pohybem myši dopředu/dozadu měnit výšku objektu. Počet objektů ve scéně je omezen pouze dostupnou pamětí.

  Aplikace umožňuje měnit vlastnosti všech objektů vložených do scény. Při aktivaci toho módu se levým tlačítkem myši vybírá objekt, se kterým se bude pracovat. Při vybrání objektu se kolem něj zobrazí kvádr a tento objekt je nahrán do prohlížeče objektů. Změny provedené v prohlížeči objektů se přesunou do scény stisknutím tlačítka Update.

  Další operace s objekty jsou:

  • Move - přesun objektu, při této operaci se zadá nová poloha objektu podobně jako při vkládání objektu.
  • Delete - vyjmutí objektu ze scény.
  • Fall to gnd - upraví výšku objektu tak, aby byl na zemi.
  • Raise under - doplňující funkce k Fall to gnd, která upraví výšku krajiny pod objektem tak, aby na ní objekt dosedal.



  5.7.4 Práce se soubory

  Aplikace umožňuje uložit vytvořenou scénu do souboru. Do souboru se ukládají data o krajině a o vložených objektech. V tomto souboru nejsou uloženy vlastní objemová data objektů ale pouze odkazy na ně.



6. Ke stažení

 
Binární verze Ne1 Ne1 Ne2 Ne2 Ne2 Ne2 Ne2
Zdrojové kódy Ne1 Ne1 Ano Ano Ano Ano Ano

  1 Zdrojové kódy jsou platformově zavislé na operačním systému typu POSIX (UNIX) a prostředí X-Window X11R6 (nebo vyšší)

  2 Binární verzi lze pro tyto operační systémy sestavy z dodávaných zdrojových kódů

  Program potřebuje pro překlad tyto prostředky:

  • překladač ANSI C (testováno s překladačem GNU C)
  • standarní knihovny systému X-Window
  • knihovnu OpenGL
  • knihovnu GLUT (testováno na verzi 3.6)
  • knihovnu MUI (upravená z distribuce GLUT 3.6)

  Knihovna MUI se musí pozměnit tak, aby bylo možné vytvářet více oken s různými seznam MUI komponent. Přesný způsob úpravy této knihovny lze nalézt v kapitole 5.6.1.

  Vzhledem k tomu, že program neprovádí žádné náročné výpočty, stačí průměrně rychlý procesor. Bohužel vizualizace je naproti tomu hodně náročná na grafický výkon. Proto je doporučeno mít HW akcelerovanou knihovnu OpenGL.

  Program byl úspěšně provozován na

  • 486/133MHz, 32MB RAM, grafika S3 Trio64V+ (2MB), softwarová implementace OpenGL (Mesa), Linux - toto je asi nejhorší možná konfigurace, rychlost zobrazování byla na hranici únosnosti už při velikosti krajiny 32×32.
  • Silicon Graphics O2 - tento počítač plně vyhovoval až do velikosti krajiny 64×64



7. Literatura

  [Beneš97] B. Beneš, P. Felkel, J. Sochor, J.Žára: Vizualizace, Vydavatelství ČVUT, Praha 1997

  [Žára92] J. Žára, A. Limpouch, B. Beneš, T. Werner: Počítačová grafika - principy a algoritmy, Grada, Praha 1992

  [Sochor96] J. Sochor, J. Žára, B. Beneš: Algoritmy počítačové grafiky, Vydavatelství ČVUT, Praha 1996

  [Murray94] J. D. Murray, W. van Ryper: Encyclopedia of graphics file format, O’Reilly & Associates, California 1994

  [Hlaváč92] V. Hlaváč, M. Sonka: Počítačové vidění, Grada, Praha 1992

  [Bubeník94] F. Bubeník, M. Pultar: Matematické vzorce a metody, Vydavatelství ČVUT, Praha 1994

  [Herout92] P. Herout, V. Rudolf, P. Smrha: ABC programátora v jazyce C, Kopp, České Budějovice 1992

Poslední modifikace dokumentu: 10.12.1998